diff options
Diffstat (limited to '')
72 files changed, 1837 insertions, 4731 deletions
diff --git a/OpenSim/Region/Application/OpenSim.cs b/OpenSim/Region/Application/OpenSim.cs index c04b8c2..b448182 100644 --- a/OpenSim/Region/Application/OpenSim.cs +++ b/OpenSim/Region/Application/OpenSim.cs | |||
@@ -67,7 +67,7 @@ namespace OpenSim | |||
67 | 67 | ||
68 | IConfig startupConfig = m_config.Source.Configs["Startup"]; | 68 | IConfig startupConfig = m_config.Source.Configs["Startup"]; |
69 | 69 | ||
70 | Util.SetMaxThreads(startupConfig.GetInt("MaxPoolThreads", 15)); | 70 | int stpMaxThreads = 15; |
71 | 71 | ||
72 | if (startupConfig != null) | 72 | if (startupConfig != null) |
73 | { | 73 | { |
@@ -100,8 +100,13 @@ namespace OpenSim | |||
100 | FireAndForgetMethod asyncCallMethod; | 100 | FireAndForgetMethod asyncCallMethod; |
101 | if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse<FireAndForgetMethod>(asyncCallMethodStr, out asyncCallMethod)) | 101 | if (!String.IsNullOrEmpty(asyncCallMethodStr) && Utils.EnumTryParse<FireAndForgetMethod>(asyncCallMethodStr, out asyncCallMethod)) |
102 | Util.FireAndForgetMethod = asyncCallMethod; | 102 | Util.FireAndForgetMethod = asyncCallMethod; |
103 | |||
104 | stpMaxThreads = startupConfig.GetInt("MaxPoolThreads", 15); | ||
103 | } | 105 | } |
104 | 106 | ||
107 | if (Util.FireAndForgetMethod == FireAndForgetMethod.SmartThreadPool) | ||
108 | Util.InitThreadPool(stpMaxThreads); | ||
109 | |||
105 | m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); | 110 | m_log.Info("[OPENSIM MAIN]: Using async_call_method " + Util.FireAndForgetMethod); |
106 | } | 111 | } |
107 | 112 | ||
@@ -167,6 +172,9 @@ namespace OpenSim | |||
167 | m_scriptTimer.Elapsed += RunAutoTimerScript; | 172 | m_scriptTimer.Elapsed += RunAutoTimerScript; |
168 | } | 173 | } |
169 | 174 | ||
175 | // Hook up to the watchdog timer | ||
176 | Watchdog.OnWatchdogTimeout += WatchdogTimeoutHandler; | ||
177 | |||
170 | PrintFileToConsole("startuplogo.txt"); | 178 | PrintFileToConsole("startuplogo.txt"); |
171 | 179 | ||
172 | // For now, start at the 'root' level by default | 180 | // For now, start at the 'root' level by default |
@@ -379,6 +387,14 @@ namespace OpenSim | |||
379 | } | 387 | } |
380 | } | 388 | } |
381 | 389 | ||
390 | private void WatchdogTimeoutHandler(System.Threading.Thread thread, int lastTick) | ||
391 | { | ||
392 | int now = Environment.TickCount & Int32.MaxValue; | ||
393 | |||
394 | m_log.ErrorFormat("[WATCHDOG]: Timeout detected for thread \"{0}\". ThreadState={1}. Last tick was {2}ms ago", | ||
395 | thread.Name, thread.ThreadState, now - lastTick); | ||
396 | } | ||
397 | |||
382 | #region Console Commands | 398 | #region Console Commands |
383 | 399 | ||
384 | /// <summary> | 400 | /// <summary> |
@@ -954,12 +970,12 @@ namespace OpenSim | |||
954 | m_sceneManager.ForEachScene( | 970 | m_sceneManager.ForEachScene( |
955 | delegate(Scene scene) | 971 | delegate(Scene scene) |
956 | { | 972 | { |
957 | scene.ClientManager.ForEachSync( | 973 | scene.ForEachClient( |
958 | delegate(IClientAPI client) | 974 | delegate(IClientAPI client) |
959 | { | 975 | { |
960 | connections.AppendFormat("{0}: {1} ({2}) from {3} on circuit {4}\n", | 976 | connections.AppendFormat("{0}: {1} ({2}) from {3} on circuit {4}\n", |
961 | scene.RegionInfo.RegionName, client.Name, client.AgentId, client.RemoteEndPoint, client.CircuitCode); | 977 | scene.RegionInfo.RegionName, client.Name, client.AgentId, client.RemoteEndPoint, client.CircuitCode); |
962 | } | 978 | }, false |
963 | ); | 979 | ); |
964 | } | 980 | } |
965 | ); | 981 | ); |
diff --git a/OpenSim/Region/Application/OpenSimBase.cs b/OpenSim/Region/Application/OpenSimBase.cs index 3df3a1c..cc18f1a 100644 --- a/OpenSim/Region/Application/OpenSimBase.cs +++ b/OpenSim/Region/Application/OpenSimBase.cs | |||
@@ -162,11 +162,11 @@ namespace OpenSim | |||
162 | 162 | ||
163 | protected virtual void LoadPlugins() | 163 | protected virtual void LoadPlugins() |
164 | { | 164 | { |
165 | PluginLoader<IApplicationPlugin> loader = | 165 | using (PluginLoader<IApplicationPlugin> loader = new PluginLoader<IApplicationPlugin>(new ApplicationPluginInitialiser(this))) |
166 | new PluginLoader<IApplicationPlugin>(new ApplicationPluginInitialiser(this)); | 166 | { |
167 | 167 | loader.Load("/OpenSim/Startup"); | |
168 | loader.Load("/OpenSim/Startup"); | 168 | m_plugins = loader.Plugins; |
169 | m_plugins = loader.Plugins; | 169 | } |
170 | } | 170 | } |
171 | 171 | ||
172 | protected override List<string> GetHelpTopics() | 172 | protected override List<string> GetHelpTopics() |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs index 0ba76ec..f6a7a0c 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | |||
@@ -346,15 +346,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
346 | protected int m_terrainCheckerCount; | 346 | protected int m_terrainCheckerCount; |
347 | protected uint m_agentFOVCounter; | 347 | protected uint m_agentFOVCounter; |
348 | 348 | ||
349 | // These numbers are guesses at a decent tradeoff between responsiveness | ||
350 | // of the interest list and throughput. Lower is more responsive, higher | ||
351 | // is better throughput | ||
352 | protected int m_primTerseUpdatesPerPacket = 25; | ||
353 | protected int m_primFullUpdatesPerPacket = 100; | ||
354 | protected int m_avatarTerseUpdatesPerPacket = 10; | ||
355 | /// <summary>Number of texture packets to put on the queue each time the | ||
356 | /// OnQueueEmpty event is triggered for the texture category</summary> | ||
357 | protected int m_textureSendLimit = 20; | ||
358 | protected IAssetService m_assetService; | 349 | protected IAssetService m_assetService; |
359 | private IHyperAssetService m_hyperAssets; | 350 | private IHyperAssetService m_hyperAssets; |
360 | 351 | ||
@@ -827,7 +818,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
827 | for (int i = x1; i <= x2; i++) | 818 | for (int i = x1; i <= x2; i++) |
828 | SendLayerData(i, y1, map); | 819 | SendLayerData(i, y1, map); |
829 | 820 | ||
830 | // Column | 821 | // Column |
831 | for (int j = y1 + 1; j <= y2; j++) | 822 | for (int j = y1 + 1; j <= y2; j++) |
832 | SendLayerData(x2, j, map); | 823 | SendLayerData(x2, j, map); |
833 | 824 | ||
@@ -2114,12 +2105,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2114 | public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks) | 2105 | public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks) |
2115 | { | 2106 | { |
2116 | ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect); | 2107 | ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect); |
2117 | packet.Effect = effectBlocks; | 2108 | packet.Header.Reliable = false; |
2109 | packet.Header.Zerocoded = true; | ||
2118 | 2110 | ||
2119 | packet.AgentData.AgentID = AgentId; | 2111 | packet.AgentData.AgentID = AgentId; |
2120 | packet.AgentData.SessionID = SessionId; | 2112 | packet.AgentData.SessionID = SessionId; |
2121 | packet.Header.Reliable = false; | 2113 | |
2122 | packet.Header.Zerocoded = true; | 2114 | packet.Effect = effectBlocks; |
2115 | |||
2123 | OutPacket(packet, ThrottleOutPacketType.State); | 2116 | OutPacket(packet, ThrottleOutPacketType.State); |
2124 | } | 2117 | } |
2125 | 2118 | ||
@@ -3333,7 +3326,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3333 | 3326 | ||
3334 | lock (m_avatarTerseUpdates.SyncRoot) | 3327 | lock (m_avatarTerseUpdates.SyncRoot) |
3335 | { | 3328 | { |
3336 | int count = Math.Min(m_avatarTerseUpdates.Count, m_avatarTerseUpdatesPerPacket); | 3329 | int count = Math.Min(m_avatarTerseUpdates.Count, m_udpServer.AvatarTerseUpdatesPerPacket); |
3337 | if (count == 0) | 3330 | if (count == 0) |
3338 | return; | 3331 | return; |
3339 | 3332 | ||
@@ -3418,7 +3411,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3418 | 3411 | ||
3419 | lock (m_primFullUpdates.SyncRoot) | 3412 | lock (m_primFullUpdates.SyncRoot) |
3420 | { | 3413 | { |
3421 | int count = Math.Min(m_primFullUpdates.Count, m_primFullUpdatesPerPacket); | 3414 | int count = Math.Min(m_primFullUpdates.Count, m_udpServer.PrimFullUpdatesPerPacket); |
3422 | if (count == 0) | 3415 | if (count == 0) |
3423 | return; | 3416 | return; |
3424 | 3417 | ||
@@ -3462,7 +3455,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3462 | 3455 | ||
3463 | lock (m_primTerseUpdates.SyncRoot) | 3456 | lock (m_primTerseUpdates.SyncRoot) |
3464 | { | 3457 | { |
3465 | int count = Math.Min(m_primTerseUpdates.Count, m_primTerseUpdatesPerPacket); | 3458 | int count = Math.Min(m_primTerseUpdates.Count, m_udpServer.PrimTerseUpdatesPerPacket); |
3466 | if (count == 0) | 3459 | if (count == 0) |
3467 | return; | 3460 | return; |
3468 | 3461 | ||
@@ -3585,7 +3578,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3585 | void ProcessTextureRequests() | 3578 | void ProcessTextureRequests() |
3586 | { | 3579 | { |
3587 | if (m_imageManager != null) | 3580 | if (m_imageManager != null) |
3588 | m_imageManager.ProcessImageQueue(m_textureSendLimit); | 3581 | m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit); |
3589 | } | 3582 | } |
3590 | 3583 | ||
3591 | public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) | 3584 | public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID) |
@@ -4167,6 +4160,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4167 | 4160 | ||
4168 | pack.Data = dataBlock; | 4161 | pack.Data = dataBlock; |
4169 | } | 4162 | } |
4163 | else | ||
4164 | { | ||
4165 | pack.Data = new ParcelObjectOwnersReplyPacket.DataBlock[0]; | ||
4166 | } | ||
4170 | pack.Header.Zerocoded = true; | 4167 | pack.Header.Zerocoded = true; |
4171 | this.OutPacket(pack, ThrottleOutPacketType.Task); | 4168 | this.OutPacket(pack, ThrottleOutPacketType.Task); |
4172 | } | 4169 | } |
@@ -4434,6 +4431,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4434 | protected virtual void RegisterLocalPacketHandlers() | 4431 | protected virtual void RegisterLocalPacketHandlers() |
4435 | { | 4432 | { |
4436 | AddLocalPacketHandler(PacketType.LogoutRequest, Logout); | 4433 | AddLocalPacketHandler(PacketType.LogoutRequest, Logout); |
4434 | AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate); | ||
4437 | AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect); | 4435 | AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect); |
4438 | AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached); | 4436 | AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached); |
4439 | AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate); | 4437 | AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate); |
@@ -4446,6 +4444,75 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4446 | 4444 | ||
4447 | #region Packet Handlers | 4445 | #region Packet Handlers |
4448 | 4446 | ||
4447 | private bool HandleAgentUpdate(IClientAPI sener, Packet Pack) | ||
4448 | { | ||
4449 | if (OnAgentUpdate != null) | ||
4450 | { | ||
4451 | bool update = false; | ||
4452 | AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack; | ||
4453 | |||
4454 | #region Packet Session and User Check | ||
4455 | if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId) | ||
4456 | return false; | ||
4457 | #endregion | ||
4458 | |||
4459 | AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData; | ||
4460 | |||
4461 | // We can only check when we have something to check | ||
4462 | // against. | ||
4463 | |||
4464 | if (lastarg != null) | ||
4465 | { | ||
4466 | update = | ||
4467 | ( | ||
4468 | (x.BodyRotation != lastarg.BodyRotation) || | ||
4469 | (x.CameraAtAxis != lastarg.CameraAtAxis) || | ||
4470 | (x.CameraCenter != lastarg.CameraCenter) || | ||
4471 | (x.CameraLeftAxis != lastarg.CameraLeftAxis) || | ||
4472 | (x.CameraUpAxis != lastarg.CameraUpAxis) || | ||
4473 | (x.ControlFlags != lastarg.ControlFlags) || | ||
4474 | (x.Far != lastarg.Far) || | ||
4475 | (x.Flags != lastarg.Flags) || | ||
4476 | (x.State != lastarg.State) || | ||
4477 | (x.HeadRotation != lastarg.HeadRotation) || | ||
4478 | (x.SessionID != lastarg.SessionID) || | ||
4479 | (x.AgentID != lastarg.AgentID) | ||
4480 | ); | ||
4481 | } | ||
4482 | else | ||
4483 | update = true; | ||
4484 | |||
4485 | // These should be ordered from most-likely to | ||
4486 | // least likely to change. I've made an initial | ||
4487 | // guess at that. | ||
4488 | |||
4489 | if (update) | ||
4490 | { | ||
4491 | AgentUpdateArgs arg = new AgentUpdateArgs(); | ||
4492 | arg.AgentID = x.AgentID; | ||
4493 | arg.BodyRotation = x.BodyRotation; | ||
4494 | arg.CameraAtAxis = x.CameraAtAxis; | ||
4495 | arg.CameraCenter = x.CameraCenter; | ||
4496 | arg.CameraLeftAxis = x.CameraLeftAxis; | ||
4497 | arg.CameraUpAxis = x.CameraUpAxis; | ||
4498 | arg.ControlFlags = x.ControlFlags; | ||
4499 | arg.Far = x.Far; | ||
4500 | arg.Flags = x.Flags; | ||
4501 | arg.HeadRotation = x.HeadRotation; | ||
4502 | arg.SessionID = x.SessionID; | ||
4503 | arg.State = x.State; | ||
4504 | UpdateAgent handlerAgentUpdate = OnAgentUpdate; | ||
4505 | lastarg = arg; // save this set of arguments for nexttime | ||
4506 | if (handlerAgentUpdate != null) | ||
4507 | OnAgentUpdate(this, arg); | ||
4508 | |||
4509 | handlerAgentUpdate = null; | ||
4510 | } | ||
4511 | } | ||
4512 | |||
4513 | return true; | ||
4514 | } | ||
4515 | |||
4449 | private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack) | 4516 | private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack) |
4450 | { | 4517 | { |
4451 | MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack; | 4518 | MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack; |
@@ -5631,77 +5698,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5631 | 5698 | ||
5632 | break; | 5699 | break; |
5633 | 5700 | ||
5634 | case PacketType.AgentUpdate: | ||
5635 | if (OnAgentUpdate != null) | ||
5636 | { | ||
5637 | bool update = false; | ||
5638 | AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack; | ||
5639 | |||
5640 | #region Packet Session and User Check | ||
5641 | if (m_checkPackets) | ||
5642 | { | ||
5643 | if (agenUpdate.AgentData.SessionID != SessionId || | ||
5644 | agenUpdate.AgentData.AgentID != AgentId) | ||
5645 | break; | ||
5646 | } | ||
5647 | #endregion | ||
5648 | |||
5649 | AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData; | ||
5650 | |||
5651 | // We can only check when we have something to check | ||
5652 | // against. | ||
5653 | |||
5654 | if (lastarg != null) | ||
5655 | { | ||
5656 | update = | ||
5657 | ( | ||
5658 | (x.BodyRotation != lastarg.BodyRotation) || | ||
5659 | (x.CameraAtAxis != lastarg.CameraAtAxis) || | ||
5660 | (x.CameraCenter != lastarg.CameraCenter) || | ||
5661 | (x.CameraLeftAxis != lastarg.CameraLeftAxis) || | ||
5662 | (x.CameraUpAxis != lastarg.CameraUpAxis) || | ||
5663 | (x.ControlFlags != lastarg.ControlFlags) || | ||
5664 | (x.Far != lastarg.Far) || | ||
5665 | (x.Flags != lastarg.Flags) || | ||
5666 | (x.State != lastarg.State) || | ||
5667 | (x.HeadRotation != lastarg.HeadRotation) || | ||
5668 | (x.SessionID != lastarg.SessionID) || | ||
5669 | (x.AgentID != lastarg.AgentID) | ||
5670 | ); | ||
5671 | } | ||
5672 | else | ||
5673 | update = true; | ||
5674 | |||
5675 | // These should be ordered from most-likely to | ||
5676 | // least likely to change. I've made an initial | ||
5677 | // guess at that. | ||
5678 | |||
5679 | if (update) | ||
5680 | { | ||
5681 | AgentUpdateArgs arg = new AgentUpdateArgs(); | ||
5682 | arg.AgentID = x.AgentID; | ||
5683 | arg.BodyRotation = x.BodyRotation; | ||
5684 | arg.CameraAtAxis = x.CameraAtAxis; | ||
5685 | arg.CameraCenter = x.CameraCenter; | ||
5686 | arg.CameraLeftAxis = x.CameraLeftAxis; | ||
5687 | arg.CameraUpAxis = x.CameraUpAxis; | ||
5688 | arg.ControlFlags = x.ControlFlags; | ||
5689 | arg.Far = x.Far; | ||
5690 | arg.Flags = x.Flags; | ||
5691 | arg.HeadRotation = x.HeadRotation; | ||
5692 | arg.SessionID = x.SessionID; | ||
5693 | arg.State = x.State; | ||
5694 | UpdateAgent handlerAgentUpdate = OnAgentUpdate; | ||
5695 | lastarg = arg; // save this set of arguments for nexttime | ||
5696 | if (handlerAgentUpdate != null) | ||
5697 | OnAgentUpdate(this, arg); | ||
5698 | |||
5699 | handlerAgentUpdate = null; | ||
5700 | } | ||
5701 | |||
5702 | } | ||
5703 | break; | ||
5704 | |||
5705 | case PacketType.AgentAnimation: | 5701 | case PacketType.AgentAnimation: |
5706 | AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; | 5702 | AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack; |
5707 | 5703 | ||
@@ -6762,11 +6758,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
6762 | if (OnRequestTexture != null) | 6758 | if (OnRequestTexture != null) |
6763 | { | 6759 | { |
6764 | TextureRequestArgs args = new TextureRequestArgs(); | 6760 | TextureRequestArgs args = new TextureRequestArgs(); |
6765 | args.RequestedAssetID = imageRequest.RequestImage[i].Image; | 6761 | |
6766 | args.DiscardLevel = imageRequest.RequestImage[i].DiscardLevel; | 6762 | RequestImagePacket.RequestImageBlock block = imageRequest.RequestImage[i]; |
6767 | args.PacketNumber = imageRequest.RequestImage[i].Packet; | 6763 | |
6768 | args.Priority = imageRequest.RequestImage[i].DownloadPriority; | 6764 | args.RequestedAssetID = block.Image; |
6765 | args.DiscardLevel = block.DiscardLevel; | ||
6766 | args.PacketNumber = block.Packet; | ||
6767 | args.Priority = block.DownloadPriority; | ||
6769 | args.requestSequence = imageRequest.Header.Sequence; | 6768 | args.requestSequence = imageRequest.Header.Sequence; |
6769 | |||
6770 | // NOTE: This is not a built in part of the LLUDP protocol, but we double the | ||
6771 | // priority of avatar textures to get avatars rezzing in faster than the | ||
6772 | // surrounding scene | ||
6773 | if ((ImageType)block.Type == ImageType.Baked) | ||
6774 | args.Priority *= 2.0f; | ||
6775 | |||
6770 | //handlerTextureRequest = OnRequestTexture; | 6776 | //handlerTextureRequest = OnRequestTexture; |
6771 | 6777 | ||
6772 | //if (handlerTextureRequest != null) | 6778 | //if (handlerTextureRequest != null) |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs index a9bc7d2..84a4959 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPClient.cs | |||
@@ -304,8 +304,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
304 | 304 | ||
305 | int total = resend + land + wind + cloud + task + texture + asset + state; | 305 | int total = resend + land + wind + cloud + task + texture + asset + state; |
306 | 306 | ||
307 | m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, State={8}, Total={9}", | 307 | //m_log.DebugFormat("[LLUDPCLIENT]: {0} is setting throttles. Resend={1}, Land={2}, Wind={3}, Cloud={4}, Task={5}, Texture={6}, Asset={7}, State={8}, Total={9}", |
308 | AgentID, resend, land, wind, cloud, task, texture, asset, state, total); | 308 | // AgentID, resend, land, wind, cloud, task, texture, asset, state, total); |
309 | 309 | ||
310 | // Update the token buckets with new throttle values | 310 | // Update the token buckets with new throttle values |
311 | TokenBucket bucket; | 311 | TokenBucket bucket; |
@@ -372,7 +372,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
372 | OpenSim.Framework.LocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category]; | 372 | OpenSim.Framework.LocklessQueue<OutgoingPacket> queue = m_packetOutboxes[category]; |
373 | TokenBucket bucket = m_throttleCategories[category]; | 373 | TokenBucket bucket = m_throttleCategories[category]; |
374 | 374 | ||
375 | if (m_throttleCategories[category].RemoveTokens(packet.Buffer.DataLength)) | 375 | if (bucket.RemoveTokens(packet.Buffer.DataLength)) |
376 | { | 376 | { |
377 | // Enough tokens were removed from the bucket, the packet will not be queued | 377 | // Enough tokens were removed from the bucket, the packet will not be queued |
378 | return false; | 378 | return false; |
@@ -497,16 +497,33 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
497 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; | 497 | SRTT = (1.0f - ALPHA) * SRTT + ALPHA * r; |
498 | } | 498 | } |
499 | 499 | ||
500 | RTO = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); | 500 | int rto = (int)(SRTT + Math.Max(m_udpServer.TickCountResolution, K * RTTVAR)); |
501 | 501 | ||
502 | // Clamp the retransmission timeout to manageable values | 502 | // Clamp the retransmission timeout to manageable values |
503 | RTO = Utils.Clamp(RTO, 3000, 10000); | 503 | rto = Utils.Clamp(RTO, 3000, 60000); |
504 | |||
505 | RTO = rto; | ||
504 | 506 | ||
505 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + | 507 | //m_log.Debug("[LLUDPCLIENT]: Setting agent " + this.Agent.FullName + "'s RTO to " + RTO + "ms with an RTTVAR of " + |
506 | // RTTVAR + " based on new RTT of " + r + "ms"); | 508 | // RTTVAR + " based on new RTT of " + r + "ms"); |
507 | } | 509 | } |
508 | 510 | ||
509 | /// <summary> | 511 | /// <summary> |
512 | /// Exponential backoff of the retransmission timeout, per section 5.5 | ||
513 | /// of RFC 2988 | ||
514 | /// </summary> | ||
515 | public void BackoffRTO() | ||
516 | { | ||
517 | // Reset SRTT and RTTVAR, we assume they are bogus since things | ||
518 | // didn't work out and we're backing off the timeout | ||
519 | SRTT = 0.0f; | ||
520 | RTTVAR = 0.0f; | ||
521 | |||
522 | // Double the retransmission timeout | ||
523 | RTO = Math.Min(RTO * 2, 60000); | ||
524 | } | ||
525 | |||
526 | /// <summary> | ||
510 | /// Does an early check to see if this queue empty callback is already | 527 | /// Does an early check to see if this queue empty callback is already |
511 | /// running, then asynchronously firing the event | 528 | /// running, then asynchronously firing the event |
512 | /// </summary> | 529 | /// </summary> |
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs index a9f4b2c..74d3262 100644 --- a/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs +++ b/OpenSim/Region/ClientStack/LindenUDP/LLUDPServer.cs | |||
@@ -98,6 +98,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
98 | 98 | ||
99 | /// <summary>The measured resolution of Environment.TickCount</summary> | 99 | /// <summary>The measured resolution of Environment.TickCount</summary> |
100 | public readonly float TickCountResolution; | 100 | public readonly float TickCountResolution; |
101 | /// <summary>Number of terse prim updates to put on the queue each time the | ||
102 | /// OnQueueEmpty event is triggered for updates</summary> | ||
103 | public readonly int PrimTerseUpdatesPerPacket; | ||
104 | /// <summary>Number of terse avatar updates to put on the queue each time the | ||
105 | /// OnQueueEmpty event is triggered for updates</summary> | ||
106 | public readonly int AvatarTerseUpdatesPerPacket; | ||
107 | /// <summary>Number of full prim updates to put on the queue each time the | ||
108 | /// OnQueueEmpty event is triggered for updates</summary> | ||
109 | public readonly int PrimFullUpdatesPerPacket; | ||
110 | /// <summary>Number of texture packets to put on the queue each time the | ||
111 | /// OnQueueEmpty event is triggered for textures</summary> | ||
112 | public readonly int TextureSendLimit; | ||
101 | 113 | ||
102 | /// <summary>Handlers for incoming packets</summary> | 114 | /// <summary>Handlers for incoming packets</summary> |
103 | //PacketEventDictionary packetEvents = new PacketEventDictionary(); | 115 | //PacketEventDictionary packetEvents = new PacketEventDictionary(); |
@@ -172,6 +184,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
172 | m_asyncPacketHandling = config.GetBoolean("async_packet_handling", false); | 184 | m_asyncPacketHandling = config.GetBoolean("async_packet_handling", false); |
173 | m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0); | 185 | m_recvBufferSize = config.GetInt("client_socket_rcvbuf_size", 0); |
174 | sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0); | 186 | sceneThrottleBps = config.GetInt("scene_throttle_max_bps", 0); |
187 | |||
188 | PrimTerseUpdatesPerPacket = config.GetInt("PrimTerseUpdatesPerPacket", 25); | ||
189 | AvatarTerseUpdatesPerPacket = config.GetInt("AvatarTerseUpdatesPerPacket", 10); | ||
190 | PrimFullUpdatesPerPacket = config.GetInt("PrimFullUpdatesPerPacket", 100); | ||
191 | TextureSendLimit = config.GetInt("TextureSendLimit", 20); | ||
192 | } | ||
193 | else | ||
194 | { | ||
195 | PrimTerseUpdatesPerPacket = 25; | ||
196 | AvatarTerseUpdatesPerPacket = 10; | ||
197 | PrimFullUpdatesPerPacket = 100; | ||
198 | TextureSendLimit = 20; | ||
175 | } | 199 | } |
176 | 200 | ||
177 | m_throttle = new TokenBucket(null, sceneThrottleBps, sceneThrottleBps); | 201 | m_throttle = new TokenBucket(null, sceneThrottleBps, sceneThrottleBps); |
@@ -187,14 +211,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
187 | 211 | ||
188 | base.Start(m_recvBufferSize, m_asyncPacketHandling); | 212 | base.Start(m_recvBufferSize, m_asyncPacketHandling); |
189 | 213 | ||
190 | // Start the incoming packet processing thread | 214 | // Start the packet processing threads |
191 | Thread incomingThread = new Thread(IncomingPacketHandler); | 215 | Watchdog.StartThread(IncomingPacketHandler, "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false); |
192 | incomingThread.Name = "Incoming Packets (" + m_scene.RegionInfo.RegionName + ")"; | 216 | Watchdog.StartThread(OutgoingPacketHandler, "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")", ThreadPriority.Normal, false); |
193 | incomingThread.Start(); | ||
194 | |||
195 | Thread outgoingThread = new Thread(OutgoingPacketHandler); | ||
196 | outgoingThread.Name = "Outgoing Packets (" + m_scene.RegionInfo.RegionName + ")"; | ||
197 | outgoingThread.Start(); | ||
198 | } | 217 | } |
199 | 218 | ||
200 | public new void Stop() | 219 | public new void Stop() |
@@ -243,7 +262,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
243 | for (int i = 0; i < packetCount; i++) | 262 | for (int i = 0; i < packetCount; i++) |
244 | { | 263 | { |
245 | byte[] data = datas[i]; | 264 | byte[] data = datas[i]; |
246 | m_scene.ClientManager.ForEach( | 265 | m_scene.ForEachClient( |
247 | delegate(IClientAPI client) | 266 | delegate(IClientAPI client) |
248 | { | 267 | { |
249 | if (client is LLClientView) | 268 | if (client is LLClientView) |
@@ -255,7 +274,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
255 | else | 274 | else |
256 | { | 275 | { |
257 | byte[] data = packet.ToBytes(); | 276 | byte[] data = packet.ToBytes(); |
258 | m_scene.ClientManager.ForEach( | 277 | m_scene.ForEachClient( |
259 | delegate(IClientAPI client) | 278 | delegate(IClientAPI client) |
260 | { | 279 | { |
261 | if (client is LLClientView) | 280 | if (client is LLClientView) |
@@ -412,6 +431,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
412 | { | 431 | { |
413 | m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); | 432 | m_log.Debug("[LLUDPSERVER]: Resending " + expiredPackets.Count + " packets to " + udpClient.AgentID + ", RTO=" + udpClient.RTO); |
414 | 433 | ||
434 | // Exponential backoff of the retransmission timeout | ||
435 | udpClient.BackoffRTO(); | ||
436 | |||
415 | // Resend packets | 437 | // Resend packets |
416 | for (int i = 0; i < expiredPackets.Count; i++) | 438 | for (int i = 0; i < expiredPackets.Count; i++) |
417 | { | 439 | { |
@@ -548,27 +570,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
548 | // UseCircuitCode handling | 570 | // UseCircuitCode handling |
549 | if (packet.Type == PacketType.UseCircuitCode) | 571 | if (packet.Type == PacketType.UseCircuitCode) |
550 | { | 572 | { |
551 | Util.FireAndForget( | 573 | m_log.Debug("[LLUDPSERVER]: Handling UseCircuitCode packet from " + buffer.RemoteEndPoint); |
552 | delegate(object o) | 574 | object[] array = new object[] { buffer, packet }; |
553 | { | ||
554 | IPEndPoint remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; | ||
555 | 575 | ||
556 | // Begin the process of adding the client to the simulator | 576 | if (m_asyncPacketHandling) |
557 | AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint); | 577 | Util.FireAndForget(HandleUseCircuitCode, array); |
578 | else | ||
579 | HandleUseCircuitCode(array); | ||
558 | 580 | ||
559 | // Acknowledge the UseCircuitCode packet | ||
560 | SendAckImmediate(remoteEndPoint, packet.Header.Sequence); | ||
561 | } | ||
562 | ); | ||
563 | return; | 581 | return; |
564 | } | 582 | } |
565 | 583 | ||
566 | // Determine which agent this packet came from | 584 | // Determine which agent this packet came from |
567 | IClientAPI client; | 585 | IClientAPI client; |
568 | if (!m_scene.ClientManager.TryGetValue(address, out client) || !(client is LLClientView)) | 586 | if (!m_scene.TryGetClient(address, out client) || !(client is LLClientView)) |
569 | { | 587 | { |
570 | m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + | 588 | m_log.Debug("[LLUDPSERVER]: Received a " + packet.Type + " packet from an unrecognized source: " + address + " in " + m_scene.RegionInfo.RegionName); |
571 | " in " + m_scene.RegionInfo.RegionName + ", currently tracking " + m_scene.ClientManager.Count + " clients"); | ||
572 | return; | 589 | return; |
573 | } | 590 | } |
574 | 591 | ||
@@ -670,6 +687,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
670 | packetInbox.Enqueue(new IncomingPacket(udpClient, packet)); | 687 | packetInbox.Enqueue(new IncomingPacket(udpClient, packet)); |
671 | } | 688 | } |
672 | 689 | ||
690 | private void HandleUseCircuitCode(object o) | ||
691 | { | ||
692 | object[] array = (object[])o; | ||
693 | UDPPacketBuffer buffer = (UDPPacketBuffer)array[0]; | ||
694 | UseCircuitCodePacket packet = (UseCircuitCodePacket)array[1]; | ||
695 | |||
696 | IPEndPoint remoteEndPoint = (IPEndPoint)buffer.RemoteEndPoint; | ||
697 | |||
698 | // Begin the process of adding the client to the simulator | ||
699 | AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint); | ||
700 | |||
701 | // Acknowledge the UseCircuitCode packet | ||
702 | SendAckImmediate(remoteEndPoint, packet.Header.Sequence); | ||
703 | } | ||
704 | |||
673 | private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber) | 705 | private void SendAckImmediate(IPEndPoint remoteEndpoint, uint sequenceNumber) |
674 | { | 706 | { |
675 | PacketAckPacket ack = new PacketAckPacket(); | 707 | PacketAckPacket ack = new PacketAckPacket(); |
@@ -731,8 +763,9 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
731 | { | 763 | { |
732 | // Create the LLUDPClient | 764 | // Create the LLUDPClient |
733 | LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint); | 765 | LLUDPClient udpClient = new LLUDPClient(this, m_throttleRates, m_throttle, circuitCode, agentID, remoteEndPoint); |
766 | IClientAPI existingClient; | ||
734 | 767 | ||
735 | if (!m_scene.ClientManager.ContainsKey(agentID)) | 768 | if (!m_scene.TryGetClient(agentID, out existingClient)) |
736 | { | 769 | { |
737 | // Create the LLClientView | 770 | // Create the LLClientView |
738 | LLClientView client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode); | 771 | LLClientView client = new LLClientView(remoteEndPoint, m_scene, this, udpClient, sessionInfo, agentID, sessionID, circuitCode); |
@@ -752,7 +785,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
752 | { | 785 | { |
753 | // Remove this client from the scene | 786 | // Remove this client from the scene |
754 | IClientAPI client; | 787 | IClientAPI client; |
755 | if (m_scene.ClientManager.TryGetValue(udpClient.AgentID, out client)) | 788 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) |
756 | client.Close(); | 789 | client.Close(); |
757 | } | 790 | } |
758 | 791 | ||
@@ -768,6 +801,14 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
768 | { | 801 | { |
769 | IncomingPacket incomingPacket = null; | 802 | IncomingPacket incomingPacket = null; |
770 | 803 | ||
804 | // HACK: This is a test to try and rate limit packet handling on Mono. | ||
805 | // If it works, a more elegant solution can be devised | ||
806 | if (Util.FireAndForgetCount() < 2) | ||
807 | { | ||
808 | //m_log.Debug("[LLUDPSERVER]: Incoming packet handler is sleeping"); | ||
809 | Thread.Sleep(30); | ||
810 | } | ||
811 | |||
771 | if (packetInbox.Dequeue(100, ref incomingPacket)) | 812 | if (packetInbox.Dequeue(100, ref incomingPacket)) |
772 | Util.FireAndForget(ProcessInPacket, incomingPacket); | 813 | Util.FireAndForget(ProcessInPacket, incomingPacket); |
773 | } | 814 | } |
@@ -775,11 +816,15 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
775 | { | 816 | { |
776 | m_log.Error("[LLUDPSERVER]: Error in the incoming packet handler loop: " + ex.Message, ex); | 817 | m_log.Error("[LLUDPSERVER]: Error in the incoming packet handler loop: " + ex.Message, ex); |
777 | } | 818 | } |
819 | |||
820 | Watchdog.UpdateThread(); | ||
778 | } | 821 | } |
779 | 822 | ||
780 | if (packetInbox.Count > 0) | 823 | if (packetInbox.Count > 0) |
781 | m_log.Warn("[LLUDPSERVER]: IncomingPacketHandler is shutting down, dropping " + packetInbox.Count + " packets"); | 824 | m_log.Warn("[LLUDPSERVER]: IncomingPacketHandler is shutting down, dropping " + packetInbox.Count + " packets"); |
782 | packetInbox.Clear(); | 825 | packetInbox.Clear(); |
826 | |||
827 | Watchdog.RemoveThread(); | ||
783 | } | 828 | } |
784 | 829 | ||
785 | private void OutgoingPacketHandler() | 830 | private void OutgoingPacketHandler() |
@@ -788,6 +833,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
788 | // on to en-US to avoid number parsing issues | 833 | // on to en-US to avoid number parsing issues |
789 | Culture.SetCurrentCulture(); | 834 | Culture.SetCurrentCulture(); |
790 | 835 | ||
836 | // Typecast the function to an Action<IClientAPI> once here to avoid allocating a new | ||
837 | // Action generic every round | ||
838 | Action<IClientAPI> clientPacketHandler = ClientOutgoingPacketHandler; | ||
839 | |||
791 | while (base.IsRunning) | 840 | while (base.IsRunning) |
792 | { | 841 | { |
793 | try | 842 | try |
@@ -836,18 +885,22 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
836 | 885 | ||
837 | // Handle outgoing packets, resends, acknowledgements, and pings for each | 886 | // Handle outgoing packets, resends, acknowledgements, and pings for each |
838 | // client. m_packetSent will be set to true if a packet is sent | 887 | // client. m_packetSent will be set to true if a packet is sent |
839 | m_scene.ClientManager.ForEachSync(ClientOutgoingPacketHandler); | 888 | m_scene.ForEachClient(clientPacketHandler, false); |
840 | 889 | ||
841 | // If nothing was sent, sleep for the minimum amount of time before a | 890 | // If nothing was sent, sleep for the minimum amount of time before a |
842 | // token bucket could get more tokens | 891 | // token bucket could get more tokens |
843 | if (!m_packetSent) | 892 | if (!m_packetSent) |
844 | Thread.Sleep((int)TickCountResolution); | 893 | Thread.Sleep((int)TickCountResolution); |
894 | |||
895 | Watchdog.UpdateThread(); | ||
845 | } | 896 | } |
846 | catch (Exception ex) | 897 | catch (Exception ex) |
847 | { | 898 | { |
848 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex); | 899 | m_log.Error("[LLUDPSERVER]: OutgoingPacketHandler loop threw an exception: " + ex.Message, ex); |
849 | } | 900 | } |
850 | } | 901 | } |
902 | |||
903 | Watchdog.RemoveThread(); | ||
851 | } | 904 | } |
852 | 905 | ||
853 | private void ClientOutgoingPacketHandler(IClientAPI client) | 906 | private void ClientOutgoingPacketHandler(IClientAPI client) |
@@ -897,7 +950,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
897 | } | 950 | } |
898 | 951 | ||
899 | // Make sure this client is still alive | 952 | // Make sure this client is still alive |
900 | if (m_scene.ClientManager.TryGetValue(udpClient.AgentID, out client)) | 953 | if (m_scene.TryGetClient(udpClient.AgentID, out client)) |
901 | { | 954 | { |
902 | try | 955 | try |
903 | { | 956 | { |
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 834aa14..ef7dce8 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | |||
@@ -38,9 +38,20 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
38 | public class XferModule : IRegionModule, IXfer | 38 | public class XferModule : IRegionModule, IXfer |
39 | { | 39 | { |
40 | private Scene m_scene; | 40 | private Scene m_scene; |
41 | private Dictionary<string, XferRequest> Requests = new Dictionary<string, XferRequest>(); | ||
42 | private List<XferRequest> RequestTime = new List<XferRequest>(); | ||
41 | public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); | 43 | public Dictionary<string, byte[]> NewFiles = new Dictionary<string, byte[]>(); |
42 | public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); | 44 | public Dictionary<ulong, XferDownLoad> Transfers = new Dictionary<ulong, XferDownLoad>(); |
45 | |||
43 | 46 | ||
47 | public struct XferRequest | ||
48 | { | ||
49 | public IClientAPI remoteClient; | ||
50 | public ulong xferID; | ||
51 | public string fileName; | ||
52 | public DateTime timeStamp; | ||
53 | } | ||
54 | |||
44 | #region IRegionModule Members | 55 | #region IRegionModule Members |
45 | 56 | ||
46 | public void Initialise(Scene scene, IConfigSource config) | 57 | public void Initialise(Scene scene, IConfigSource config) |
@@ -86,6 +97,13 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
86 | NewFiles.Add(fileName, data); | 97 | NewFiles.Add(fileName, data); |
87 | } | 98 | } |
88 | } | 99 | } |
100 | |||
101 | if (Requests.ContainsKey(fileName)) | ||
102 | { | ||
103 | RequestXfer(Requests[fileName].remoteClient, Requests[fileName].xferID, fileName); | ||
104 | Requests.Remove(fileName); | ||
105 | } | ||
106 | |||
89 | return true; | 107 | return true; |
90 | } | 108 | } |
91 | 109 | ||
@@ -105,7 +123,6 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
105 | /// <param name="fileName"></param> | 123 | /// <param name="fileName"></param> |
106 | public void RequestXfer(IClientAPI remoteClient, ulong xferID, string fileName) | 124 | public void RequestXfer(IClientAPI remoteClient, ulong xferID, string fileName) |
107 | { | 125 | { |
108 | |||
109 | lock (NewFiles) | 126 | lock (NewFiles) |
110 | { | 127 | { |
111 | if (NewFiles.ContainsKey(fileName)) | 128 | if (NewFiles.ContainsKey(fileName)) |
@@ -114,6 +131,7 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
114 | { | 131 | { |
115 | byte[] fileData = NewFiles[fileName]; | 132 | byte[] fileData = NewFiles[fileName]; |
116 | XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); | 133 | XferDownLoad transaction = new XferDownLoad(fileName, fileData, xferID, remoteClient); |
134 | |||
117 | Transfers.Add(xferID, transaction); | 135 | Transfers.Add(xferID, transaction); |
118 | NewFiles.Remove(fileName); | 136 | NewFiles.Remove(fileName); |
119 | 137 | ||
@@ -123,6 +141,30 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
123 | } | 141 | } |
124 | } | 142 | } |
125 | } | 143 | } |
144 | else | ||
145 | { | ||
146 | if (RequestTime.Count > 0) | ||
147 | { | ||
148 | TimeSpan ts = new TimeSpan(DateTime.UtcNow.Ticks - RequestTime[0].timeStamp.Ticks); | ||
149 | if (ts.TotalSeconds > 30) | ||
150 | { | ||
151 | Requests.Remove(RequestTime[0].fileName); | ||
152 | RequestTime.RemoveAt(0); | ||
153 | } | ||
154 | } | ||
155 | |||
156 | if (!Requests.ContainsKey(fileName)) | ||
157 | { | ||
158 | XferRequest nRequest = new XferRequest(); | ||
159 | nRequest.remoteClient = remoteClient; | ||
160 | nRequest.xferID = xferID; | ||
161 | nRequest.fileName = fileName; | ||
162 | nRequest.timeStamp = DateTime.UtcNow; | ||
163 | Requests.Add(fileName, nRequest); | ||
164 | RequestTime.Add(nRequest); | ||
165 | } | ||
166 | |||
167 | } | ||
126 | } | 168 | } |
127 | } | 169 | } |
128 | 170 | ||
@@ -177,7 +219,6 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
177 | Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); | 219 | Array.Copy(Utils.IntToBytes(Data.Length), 0, transferData, 0, 4); |
178 | Array.Copy(Data, 0, transferData, 4, Data.Length); | 220 | Array.Copy(Data, 0, transferData, 4, Data.Length); |
179 | Client.SendXferPacket(XferID, 0 + 0x80000000, transferData); | 221 | Client.SendXferPacket(XferID, 0 + 0x80000000, transferData); |
180 | |||
181 | complete = true; | 222 | complete = true; |
182 | } | 223 | } |
183 | else | 224 | else |
diff --git a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs index 9387bce..61b6d65 100644 --- a/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Combat/CombatModule.cs | |||
@@ -96,12 +96,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Combat.CombatModule | |||
96 | else | 96 | else |
97 | { | 97 | { |
98 | bool foundResult = false; | 98 | bool foundResult = false; |
99 | string resultstring = ""; | 99 | string resultstring = String.Empty; |
100 | List<ScenePresence> allav = DeadAvatar.Scene.GetScenePresences(); | 100 | ScenePresence[] allav = DeadAvatar.Scene.GetScenePresences(); |
101 | try | 101 | try |
102 | { | 102 | { |
103 | foreach (ScenePresence av in allav) | 103 | for (int i = 0; i < allav.Length; i++) |
104 | { | 104 | { |
105 | ScenePresence av = allav[i]; | ||
106 | |||
105 | if (av.LocalId == killerObjectLocalID) | 107 | if (av.LocalId == killerObjectLocalID) |
106 | { | 108 | { |
107 | av.ControllingClient.SendAlertMessage("You fragged " + DeadAvatar.Firstname + " " + DeadAvatar.Lastname); | 109 | av.ControllingClient.SendAlertMessage("You fragged " + DeadAvatar.Firstname + " " + DeadAvatar.Lastname); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs index ebebaf9..72ec869 100644 --- a/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Dialog/DialogModule.cs | |||
@@ -85,10 +85,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog | |||
85 | 85 | ||
86 | public void SendAlertToUser(string firstName, string lastName, string message, bool modal) | 86 | public void SendAlertToUser(string firstName, string lastName, string message, bool modal) |
87 | { | 87 | { |
88 | List<ScenePresence> presenceList = m_scene.GetScenePresences(); | 88 | ScenePresence[] presenceList = m_scene.GetScenePresences(); |
89 | 89 | ||
90 | foreach (ScenePresence presence in presenceList) | 90 | for (int i = 0; i < presenceList.Length; i++) |
91 | { | 91 | { |
92 | ScenePresence presence = presenceList[i]; | ||
93 | |||
92 | if (presence.Firstname == firstName && presence.Lastname == lastName) | 94 | if (presence.Firstname == firstName && presence.Lastname == lastName) |
93 | { | 95 | { |
94 | presence.ControllingClient.SendAgentAlertMessage(message, modal); | 96 | presence.ControllingClient.SendAgentAlertMessage(message, modal); |
@@ -99,10 +101,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog | |||
99 | 101 | ||
100 | public void SendGeneralAlert(string message) | 102 | public void SendGeneralAlert(string message) |
101 | { | 103 | { |
102 | List<ScenePresence> presenceList = m_scene.GetScenePresences(); | 104 | ScenePresence[] presenceList = m_scene.GetScenePresences(); |
103 | 105 | ||
104 | foreach (ScenePresence presence in presenceList) | 106 | for (int i = 0; i < presenceList.Length; i++) |
105 | { | 107 | { |
108 | ScenePresence presence = presenceList[i]; | ||
109 | |||
106 | if (!presence.IsChildAgent) | 110 | if (!presence.IsChildAgent) |
107 | presence.ControllingClient.SendAlertMessage(message); | 111 | presence.ControllingClient.SendAlertMessage(message); |
108 | } | 112 | } |
@@ -150,10 +154,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Dialog | |||
150 | public void SendNotificationToUsersInRegion( | 154 | public void SendNotificationToUsersInRegion( |
151 | UUID fromAvatarID, string fromAvatarName, string message) | 155 | UUID fromAvatarID, string fromAvatarName, string message) |
152 | { | 156 | { |
153 | List<ScenePresence> presenceList = m_scene.GetScenePresences(); | 157 | ScenePresence[] presences = m_scene.GetScenePresences(); |
154 | 158 | ||
155 | foreach (ScenePresence presence in presenceList) | 159 | for (int i = 0; i < presences.Length; i++) |
156 | { | 160 | { |
161 | ScenePresence presence = presences[i]; | ||
157 | if (!presence.IsChildAgent) | 162 | if (!presence.IsChildAgent) |
158 | presence.ControllingClient.SendBlueBoxMessage(fromAvatarID, fromAvatarName, message); | 163 | presence.ControllingClient.SendBlueBoxMessage(fromAvatarID, fromAvatarName, message); |
159 | } | 164 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs index 7855862..273c128 100644 --- a/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Gods/GodsModule.cs | |||
@@ -114,7 +114,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Gods | |||
114 | { | 114 | { |
115 | string reasonStr = Utils.BytesToString(reason); | 115 | string reasonStr = Utils.BytesToString(reason); |
116 | 116 | ||
117 | m_scene.ClientManager.ForEach( | 117 | m_scene.ForEachClient( |
118 | delegate(IClientAPI controller) | 118 | delegate(IClientAPI controller) |
119 | { | 119 | { |
120 | if (controller.AgentId != godID) | 120 | if (controller.AgentId != godID) |
diff --git a/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs b/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs index ad05bab..f5ab454 100644 --- a/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/InstantMessage/PresenceModule.cs | |||
@@ -274,8 +274,14 @@ namespace OpenSim.Region.CoreModules.Avatar.InstantMessage | |||
274 | } | 274 | } |
275 | m_RootAgents[agentID] = scene; | 275 | m_RootAgents[agentID] = scene; |
276 | } | 276 | } |
277 | |||
277 | // inform messaging server that agent changed the region | 278 | // inform messaging server that agent changed the region |
278 | NotifyMessageServerOfAgentLocation(agentID, scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle); | 279 | Util.FireAndForget( |
280 | delegate(object o) | ||
281 | { | ||
282 | NotifyMessageServerOfAgentLocation(agentID, scene.RegionInfo.RegionID, scene.RegionInfo.RegionHandle); | ||
283 | } | ||
284 | ); | ||
279 | } | 285 | } |
280 | 286 | ||
281 | private void OnEconomyDataRequest(UUID agentID) | 287 | private void OnEconomyDataRequest(UUID agentID) |
diff --git a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs index d636b1c..62500a2 100644 --- a/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs +++ b/OpenSim/Region/CoreModules/InterGrid/OpenGridProtocolModule.cs | |||
@@ -1208,10 +1208,7 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
1208 | if (homeScene.TryGetAvatar(avatarId,out avatar)) | 1208 | if (homeScene.TryGetAvatar(avatarId,out avatar)) |
1209 | { | 1209 | { |
1210 | KillAUser ku = new KillAUser(avatar,mod); | 1210 | KillAUser ku = new KillAUser(avatar,mod); |
1211 | Thread ta = new Thread(ku.ShutdownNoLogout); | 1211 | Watchdog.StartThread(ku.ShutdownNoLogout, "OGPShutdown", ThreadPriority.Normal, true); |
1212 | ta.IsBackground = true; | ||
1213 | ta.Name = "ShutdownThread"; | ||
1214 | ta.Start(); | ||
1215 | } | 1212 | } |
1216 | } | 1213 | } |
1217 | 1214 | ||
@@ -1261,7 +1258,13 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
1261 | 1258 | ||
1262 | avToBeKilled.ControllingClient.SendLogoutPacketWhenClosing = false; | 1259 | avToBeKilled.ControllingClient.SendLogoutPacketWhenClosing = false; |
1263 | 1260 | ||
1264 | Thread.Sleep(30000); | 1261 | int sleepMS = 30000; |
1262 | while (sleepMS > 0) | ||
1263 | { | ||
1264 | Watchdog.UpdateThread(); | ||
1265 | Thread.Sleep(1000); | ||
1266 | sleepMS -= 1000; | ||
1267 | } | ||
1265 | 1268 | ||
1266 | // test for child agent because they might have come back | 1269 | // test for child agent because they might have come back |
1267 | if (avToBeKilled.IsChildAgent) | 1270 | if (avToBeKilled.IsChildAgent) |
@@ -1270,6 +1273,8 @@ namespace OpenSim.Region.CoreModules.InterGrid | |||
1270 | avToBeKilled.ControllingClient.Close(); | 1273 | avToBeKilled.ControllingClient.Close(); |
1271 | } | 1274 | } |
1272 | } | 1275 | } |
1276 | |||
1277 | Watchdog.RemoveThread(); | ||
1273 | } | 1278 | } |
1274 | 1279 | ||
1275 | } | 1280 | } |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs index fe9c8d9..c9fce91 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/AssetsRequest.cs | |||
@@ -128,7 +128,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
128 | if (m_repliesRequired == 0) | 128 | if (m_repliesRequired == 0) |
129 | { | 129 | { |
130 | m_requestState = RequestState.Completed; | 130 | m_requestState = RequestState.Completed; |
131 | PerformAssetsRequestCallback(); | 131 | PerformAssetsRequestCallback(null); |
132 | return; | 132 | return; |
133 | } | 133 | } |
134 | 134 | ||
@@ -246,9 +246,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
246 | 246 | ||
247 | // We want to stop using the asset cache thread asap | 247 | // We want to stop using the asset cache thread asap |
248 | // as we now need to do the work of producing the rest of the archive | 248 | // as we now need to do the work of producing the rest of the archive |
249 | Thread newThread = new Thread(PerformAssetsRequestCallback); | 249 | Util.FireAndForget(PerformAssetsRequestCallback); |
250 | newThread.Name = "OpenSimulator archiving thread post assets receipt"; | ||
251 | newThread.Start(); | ||
252 | } | 250 | } |
253 | else | 251 | else |
254 | { | 252 | { |
@@ -265,7 +263,7 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
265 | /// <summary> | 263 | /// <summary> |
266 | /// Perform the callback on the original requester of the assets | 264 | /// Perform the callback on the original requester of the assets |
267 | /// </summary> | 265 | /// </summary> |
268 | protected void PerformAssetsRequestCallback() | 266 | protected void PerformAssetsRequestCallback(object o) |
269 | { | 267 | { |
270 | try | 268 | try |
271 | { | 269 | { |
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 3bb162e..e3a395e 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -414,9 +414,12 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
414 | private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID) | 414 | private void handleEstateTeleportAllUsersHomeRequest(IClientAPI remover_client, UUID invoice, UUID senderID) |
415 | { | 415 | { |
416 | // Get a fresh list that will not change as people get teleported away | 416 | // Get a fresh list that will not change as people get teleported away |
417 | List<ScenePresence> prescences = m_scene.GetScenePresences(); | 417 | ScenePresence[] presences = m_scene.GetScenePresences(); |
418 | foreach (ScenePresence p in prescences) | 418 | |
419 | for (int i = 0; i < presences.Length; i++) | ||
419 | { | 420 | { |
421 | ScenePresence p = presences[i]; | ||
422 | |||
420 | if (p.UUID != senderID) | 423 | if (p.UUID != senderID) |
421 | { | 424 | { |
422 | // make sure they are still there, we could be working down a long list | 425 | // make sure they are still there, we could be working down a long list |
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index 53c64cb..93a949a 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs | |||
@@ -264,10 +264,8 @@ namespace OpenSim.Region.CoreModules.World.Land | |||
264 | avatar.ControllingClient.SendAlertMessage( | 264 | avatar.ControllingClient.SendAlertMessage( |
265 | "You are not allowed on this parcel because you are banned. Please go away."); | 265 | "You are not allowed on this parcel because you are banned. Please go away."); |
266 | 266 | ||
267 | avatar.PhysicsActor.Position = | 267 | avatar.PhysicsActor.Position = avatar.lastKnownAllowedPosition; |
268 | new PhysicsVector(avatar.lastKnownAllowedPosition.X, avatar.lastKnownAllowedPosition.Y, | 268 | avatar.PhysicsActor.Velocity = Vector3.Zero; |
269 | avatar.lastKnownAllowedPosition.Z); | ||
270 | avatar.PhysicsActor.Velocity = new PhysicsVector(0, 0, 0); | ||
271 | } | 269 | } |
272 | else | 270 | else |
273 | { | 271 | { |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs index 5fd8369..285d36a 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/MapImageModule.cs | |||
@@ -98,27 +98,29 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
98 | } | 98 | } |
99 | terrainRenderer.Initialise(m_scene, m_config); | 99 | terrainRenderer.Initialise(m_scene, m_config); |
100 | 100 | ||
101 | Bitmap mapbmp = new Bitmap((int)Constants.RegionSize, (int)Constants.RegionSize); | 101 | using (Bitmap mapbmp = new Bitmap((int)Constants.RegionSize, (int)Constants.RegionSize)) |
102 | //long t = System.Environment.TickCount; | 102 | { |
103 | //for (int i = 0; i < 10; ++i) { | 103 | //long t = System.Environment.TickCount; |
104 | //for (int i = 0; i < 10; ++i) { | ||
104 | terrainRenderer.TerrainToBitmap(mapbmp); | 105 | terrainRenderer.TerrainToBitmap(mapbmp); |
105 | //} | 106 | //} |
106 | //t = System.Environment.TickCount - t; | 107 | //t = System.Environment.TickCount - t; |
107 | //m_log.InfoFormat("[MAPTILE] generation of 10 maptiles needed {0} ms", t); | 108 | //m_log.InfoFormat("[MAPTILE] generation of 10 maptiles needed {0} ms", t); |
108 | 109 | ||
109 | 110 | ||
110 | if (drawPrimVolume) | 111 | if (drawPrimVolume) |
111 | { | 112 | { |
112 | DrawObjectVolume(m_scene, mapbmp); | 113 | DrawObjectVolume(m_scene, mapbmp); |
113 | } | 114 | } |
114 | 115 | ||
115 | try | 116 | try |
116 | { | 117 | { |
117 | imageData = OpenJPEG.EncodeFromImage(mapbmp, true); | 118 | imageData = OpenJPEG.EncodeFromImage(mapbmp, true); |
118 | } | 119 | } |
119 | catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke | 120 | catch (Exception e) // LEGIT: Catching problems caused by OpenJPEG p/invoke |
120 | { | 121 | { |
121 | m_log.Error("Failed generating terrain map: " + e); | 122 | m_log.Error("Failed generating terrain map: " + e); |
123 | } | ||
122 | } | 124 | } |
123 | 125 | ||
124 | return imageData; | 126 | return imageData; |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 4e40084..f4b54aa 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -58,7 +58,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
58 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 58 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
59 | 59 | ||
60 | private static readonly string DEFAULT_WORLD_MAP_EXPORT_PATH = "exportmap.jpg"; | 60 | private static readonly string DEFAULT_WORLD_MAP_EXPORT_PATH = "exportmap.jpg"; |
61 | 61 | private static readonly UUID STOP_UUID = UUID.Random(); | |
62 | private static readonly string m_mapLayerPath = "0001/"; | 62 | private static readonly string m_mapLayerPath = "0001/"; |
63 | 63 | ||
64 | private OpenSim.Framework.BlockingQueue<MapRequestState> requests = new OpenSim.Framework.BlockingQueue<MapRequestState>(); | 64 | private OpenSim.Framework.BlockingQueue<MapRequestState> requests = new OpenSim.Framework.BlockingQueue<MapRequestState>(); |
@@ -74,7 +74,6 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
74 | private Dictionary<ulong, int> m_blacklistedregions = new Dictionary<ulong, int>(); | 74 | private Dictionary<ulong, int> m_blacklistedregions = new Dictionary<ulong, int>(); |
75 | private Dictionary<ulong, string> m_cachedRegionMapItemsAddress = new Dictionary<ulong, string>(); | 75 | private Dictionary<ulong, string> m_cachedRegionMapItemsAddress = new Dictionary<ulong, string>(); |
76 | private List<UUID> m_rootAgents = new List<UUID>(); | 76 | private List<UUID> m_rootAgents = new List<UUID>(); |
77 | private Thread mapItemReqThread; | ||
78 | private volatile bool threadrunning = false; | 77 | private volatile bool threadrunning = false; |
79 | 78 | ||
80 | //private int CacheRegionsDistance = 256; | 79 | //private int CacheRegionsDistance = 256; |
@@ -338,13 +337,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
338 | { | 337 | { |
339 | if (threadrunning) return; | 338 | if (threadrunning) return; |
340 | threadrunning = true; | 339 | threadrunning = true; |
340 | |||
341 | m_log.Debug("[WORLD MAP]: Starting remote MapItem request thread"); | 341 | m_log.Debug("[WORLD MAP]: Starting remote MapItem request thread"); |
342 | mapItemReqThread = new Thread(new ThreadStart(process)); | 342 | |
343 | mapItemReqThread.IsBackground = true; | 343 | Watchdog.StartThread(process, "MapItemRequestThread", ThreadPriority.BelowNormal, true); |
344 | mapItemReqThread.Name = "MapItemRequestThread"; | ||
345 | mapItemReqThread.Priority = ThreadPriority.BelowNormal; | ||
346 | mapItemReqThread.SetApartmentState(ApartmentState.MTA); | ||
347 | mapItemReqThread.Start(); | ||
348 | } | 344 | } |
349 | 345 | ||
350 | /// <summary> | 346 | /// <summary> |
@@ -353,7 +349,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
353 | private void StopThread() | 349 | private void StopThread() |
354 | { | 350 | { |
355 | MapRequestState st = new MapRequestState(); | 351 | MapRequestState st = new MapRequestState(); |
356 | st.agentID=UUID.Zero; | 352 | st.agentID=STOP_UUID; |
357 | st.EstateID=0; | 353 | st.EstateID=0; |
358 | st.flags=0; | 354 | st.flags=0; |
359 | st.godlike=false; | 355 | st.godlike=false; |
@@ -441,26 +437,29 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
441 | { | 437 | { |
442 | while (true) | 438 | while (true) |
443 | { | 439 | { |
444 | MapRequestState st = requests.Dequeue(); | 440 | MapRequestState st = requests.Dequeue(1000); |
445 | 441 | ||
446 | // end gracefully | 442 | // end gracefully |
447 | if (st.agentID == UUID.Zero) | 443 | if (st.agentID == STOP_UUID) |
448 | { | ||
449 | break; | 444 | break; |
450 | } | ||
451 | 445 | ||
452 | bool dorequest = true; | 446 | if (st.agentID != UUID.Zero) |
453 | lock (m_rootAgents) | ||
454 | { | 447 | { |
455 | if (!m_rootAgents.Contains(st.agentID)) | 448 | bool dorequest = true; |
456 | dorequest = false; | 449 | lock (m_rootAgents) |
457 | } | 450 | { |
451 | if (!m_rootAgents.Contains(st.agentID)) | ||
452 | dorequest = false; | ||
453 | } | ||
458 | 454 | ||
459 | if (dorequest) | 455 | if (dorequest) |
460 | { | 456 | { |
461 | OSDMap response = RequestMapItemsAsync("", st.agentID, st.flags, st.EstateID, st.godlike, st.itemtype, st.regionhandle); | 457 | OSDMap response = RequestMapItemsAsync("", st.agentID, st.flags, st.EstateID, st.godlike, st.itemtype, st.regionhandle); |
462 | RequestMapItemsCompleted(response); | 458 | RequestMapItemsCompleted(response); |
459 | } | ||
463 | } | 460 | } |
461 | |||
462 | Watchdog.UpdateThread(); | ||
464 | } | 463 | } |
465 | } | 464 | } |
466 | catch (Exception e) | 465 | catch (Exception e) |
@@ -469,6 +468,7 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
469 | } | 468 | } |
470 | 469 | ||
471 | threadrunning = false; | 470 | threadrunning = false; |
471 | Watchdog.RemoveThread(); | ||
472 | } | 472 | } |
473 | 473 | ||
474 | /// <summary> | 474 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Scenes/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/AnimationSet.cs index aa0c8b8..740d168 100644 --- a/OpenSim/Region/Framework/Scenes/AnimationSet.cs +++ b/OpenSim/Region/Framework/Scenes/AnimationSet.cs | |||
@@ -30,6 +30,8 @@ using System.Collections.Generic; | |||
30 | using OpenSim.Framework; | 30 | using OpenSim.Framework; |
31 | using OpenMetaverse; | 31 | using OpenMetaverse; |
32 | 32 | ||
33 | using Animation = OpenSim.Framework.Animation; | ||
34 | |||
33 | namespace OpenSim.Region.Framework.Scenes | 35 | namespace OpenSim.Region.Framework.Scenes |
34 | { | 36 | { |
35 | [Serializable] | 37 | [Serializable] |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index ac89f7b..1a91f0c 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -394,7 +394,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
394 | void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args) | 394 | void ProcessViewerEffect(IClientAPI remoteClient, List<ViewerEffectEventHandlerArg> args) |
395 | { | 395 | { |
396 | // TODO: don't create new blocks if recycling an old packet | 396 | // TODO: don't create new blocks if recycling an old packet |
397 | List<ViewerEffectPacket.EffectBlock> effectBlock = new List<ViewerEffectPacket.EffectBlock>(); | 397 | ViewerEffectPacket.EffectBlock[] effectBlockArray = new ViewerEffectPacket.EffectBlock[args.Count]; |
398 | for (int i = 0; i < args.Count; i++) | 398 | for (int i = 0; i < args.Count; i++) |
399 | { | 399 | { |
400 | ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock(); | 400 | ViewerEffectPacket.EffectBlock effect = new ViewerEffectPacket.EffectBlock(); |
@@ -404,11 +404,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
404 | effect.ID = args[i].ID; | 404 | effect.ID = args[i].ID; |
405 | effect.Type = args[i].Type; | 405 | effect.Type = args[i].Type; |
406 | effect.TypeData = args[i].TypeData; | 406 | effect.TypeData = args[i].TypeData; |
407 | effectBlock.Add(effect); | 407 | effectBlockArray[i] = effect; |
408 | } | 408 | } |
409 | ViewerEffectPacket.EffectBlock[] effectBlockArray = effectBlock.ToArray(); | ||
410 | 409 | ||
411 | ClientManager.ForEach( | 410 | ForEachClient( |
412 | delegate(IClientAPI client) | 411 | delegate(IClientAPI client) |
413 | { | 412 | { |
414 | if (client.AgentId != remoteClient.AgentId) | 413 | if (client.AgentId != remoteClient.AgentId) |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 5005ac9..7c3875d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -61,6 +61,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
61 | Time = 0, | 61 | Time = 0, |
62 | Distance = 1, | 62 | Distance = 1, |
63 | SimpleAngularDistance = 2, | 63 | SimpleAngularDistance = 2, |
64 | FrontBack = 3, | ||
64 | } | 65 | } |
65 | 66 | ||
66 | public delegate void SynchronizeSceneHandler(Scene scene); | 67 | public delegate void SynchronizeSceneHandler(Scene scene); |
@@ -81,8 +82,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
81 | 82 | ||
82 | protected Timer m_restartWaitTimer = new Timer(); | 83 | protected Timer m_restartWaitTimer = new Timer(); |
83 | 84 | ||
84 | protected Thread m_updateEntitiesThread; | ||
85 | |||
86 | public SimStatsReporter StatsReporter; | 85 | public SimStatsReporter StatsReporter; |
87 | 86 | ||
88 | protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); | 87 | protected List<RegionInfo> m_regionRestartNotifyList = new List<RegionInfo>(); |
@@ -107,11 +106,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
107 | public bool m_physicalPrim; | 106 | public bool m_physicalPrim; |
108 | public float m_maxNonphys = 256; | 107 | public float m_maxNonphys = 256; |
109 | public float m_maxPhys = 10; | 108 | public float m_maxPhys = 10; |
110 | public bool m_clampPrimSize = false; | 109 | public bool m_clampPrimSize; |
111 | public bool m_trustBinaries = false; | 110 | public bool m_trustBinaries; |
112 | public bool m_allowScriptCrossings = false; | 111 | public bool m_allowScriptCrossings; |
113 | public bool m_useFlySlow = false; | 112 | public bool m_useFlySlow; |
114 | public bool m_usePreJump = false; | 113 | public bool m_usePreJump; |
115 | public bool m_seeIntoRegionFromNeighbor; | 114 | public bool m_seeIntoRegionFromNeighbor; |
116 | // TODO: need to figure out how allow client agents but deny | 115 | // TODO: need to figure out how allow client agents but deny |
117 | // root agents when ACL denies access to root agent | 116 | // root agents when ACL denies access to root agent |
@@ -119,11 +118,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
119 | public int MaxUndoCount = 5; | 118 | public int MaxUndoCount = 5; |
120 | private int m_RestartTimerCounter; | 119 | private int m_RestartTimerCounter; |
121 | private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing | 120 | private readonly Timer m_restartTimer = new Timer(15000); // Wait before firing |
122 | private int m_incrementsof15seconds = 0; | 121 | private int m_incrementsof15seconds; |
123 | private volatile bool m_backingup = false; | 122 | private volatile bool m_backingup; |
123 | private bool m_useAsyncWhenPossible; | ||
124 | 124 | ||
125 | private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); | 125 | private Dictionary<UUID, ReturnInfo> m_returns = new Dictionary<UUID, ReturnInfo>(); |
126 | |||
127 | private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); | 126 | private Dictionary<UUID, SceneObjectGroup> m_groupsWithTargets = new Dictionary<UUID, SceneObjectGroup>(); |
128 | 127 | ||
129 | protected string m_simulatorVersion = "OpenSimulator Server"; | 128 | protected string m_simulatorVersion = "OpenSimulator Server"; |
@@ -143,8 +142,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
143 | 142 | ||
144 | public IXfer XferManager; | 143 | public IXfer XferManager; |
145 | 144 | ||
146 | protected IAssetService m_AssetService = null; | 145 | protected IAssetService m_AssetService; |
147 | protected IAuthorizationService m_AuthorizationService = null; | 146 | protected IAuthorizationService m_AuthorizationService; |
148 | 147 | ||
149 | private Object m_heartbeatLock = new Object(); | 148 | private Object m_heartbeatLock = new Object(); |
150 | 149 | ||
@@ -185,7 +184,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
185 | } | 184 | } |
186 | } | 185 | } |
187 | 186 | ||
188 | protected IInventoryService m_InventoryService = null; | 187 | protected IInventoryService m_InventoryService; |
189 | 188 | ||
190 | public IInventoryService InventoryService | 189 | public IInventoryService InventoryService |
191 | { | 190 | { |
@@ -205,7 +204,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
205 | } | 204 | } |
206 | } | 205 | } |
207 | 206 | ||
208 | protected IGridService m_GridService = null; | 207 | protected IGridService m_GridService; |
209 | 208 | ||
210 | public IGridService GridService | 209 | public IGridService GridService |
211 | { | 210 | { |
@@ -253,9 +252,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
253 | // Central Update Loop | 252 | // Central Update Loop |
254 | 253 | ||
255 | protected int m_fps = 10; | 254 | protected int m_fps = 10; |
256 | protected int m_frame = 0; | 255 | protected int m_frame; |
257 | protected float m_timespan = 0.089f; | 256 | protected float m_timespan = 0.089f; |
258 | protected DateTime m_lastupdate = DateTime.Now; | 257 | protected DateTime m_lastupdate = DateTime.UtcNow; |
259 | 258 | ||
260 | private int m_update_physics = 1; | 259 | private int m_update_physics = 1; |
261 | private int m_update_entitymovement = 1; | 260 | private int m_update_entitymovement = 1; |
@@ -266,26 +265,26 @@ namespace OpenSim.Region.Framework.Scenes | |||
266 | private int m_update_terrain = 50; | 265 | private int m_update_terrain = 50; |
267 | private int m_update_land = 1; | 266 | private int m_update_land = 1; |
268 | 267 | ||
269 | private int frameMS = 0; | 268 | private int frameMS; |
270 | private int physicsMS2 = 0; | 269 | private int physicsMS2; |
271 | private int physicsMS = 0; | 270 | private int physicsMS; |
272 | private int otherMS = 0; | 271 | private int otherMS; |
273 | 272 | ||
274 | private bool m_physics_enabled = true; | 273 | private bool m_physics_enabled = true; |
275 | private bool m_scripts_enabled = true; | 274 | private bool m_scripts_enabled = true; |
276 | private string m_defaultScriptEngine; | 275 | private string m_defaultScriptEngine; |
277 | private int m_LastLogin = 0; | 276 | private int m_LastLogin; |
278 | private Thread HeartbeatThread = null; | 277 | private Thread HeartbeatThread; |
279 | private volatile bool shuttingdown = false; | 278 | private volatile bool shuttingdown; |
280 | 279 | ||
281 | private int m_lastUpdate = Environment.TickCount; | 280 | private int m_lastUpdate = Environment.TickCount; |
282 | private bool m_firstHeartbeat = true; | 281 | private bool m_firstHeartbeat = true; |
283 | 282 | ||
284 | private UpdatePrioritizationSchemes m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; | 283 | private UpdatePrioritizationSchemes m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; |
285 | private bool m_reprioritization_enabled = true; | 284 | private bool m_reprioritization_enabled = true; |
286 | private double m_reprioritization_interval = 2000.0; | 285 | private double m_reprioritization_interval = 5000.0; |
287 | private double m_root_reprioritization_distance = 5.0; | 286 | private double m_root_reprioritization_distance = 10.0; |
288 | private double m_child_reprioritization_distance = 10.0; | 287 | private double m_child_reprioritization_distance = 20.0; |
289 | 288 | ||
290 | private object m_deleting_scene_object = new object(); | 289 | private object m_deleting_scene_object = new object(); |
291 | 290 | ||
@@ -480,6 +479,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
480 | // | 479 | // |
481 | IConfig startupConfig = m_config.Configs["Startup"]; | 480 | IConfig startupConfig = m_config.Configs["Startup"]; |
482 | 481 | ||
482 | // Should we try to run loops synchronously or asynchronously? | ||
483 | m_useAsyncWhenPossible = startupConfig.GetBoolean("use_async_when_possible", false); | ||
484 | |||
483 | //Animation states | 485 | //Animation states |
484 | m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); | 486 | m_useFlySlow = startupConfig.GetBoolean("enableflyslow", false); |
485 | // TODO: Change default to true once the feature is supported | 487 | // TODO: Change default to true once the feature is supported |
@@ -542,6 +544,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
542 | case "simpleangulardistance": | 544 | case "simpleangulardistance": |
543 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance; | 545 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.SimpleAngularDistance; |
544 | break; | 546 | break; |
547 | case "frontback": | ||
548 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.FrontBack; | ||
549 | break; | ||
545 | default: | 550 | default: |
546 | m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time"); | 551 | m_log.Warn("[SCENE]: UpdatePrioritizationScheme was not recognized, setting to default settomg of Time"); |
547 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; | 552 | m_update_prioritization_scheme = UpdatePrioritizationSchemes.Time; |
@@ -889,6 +894,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
889 | { | 894 | { |
890 | m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", RegionInfo.RegionName); | 895 | m_log.InfoFormat("[SCENE]: Closing down the single simulator: {0}", RegionInfo.RegionName); |
891 | 896 | ||
897 | m_restartTimer.Stop(); | ||
898 | m_restartTimer.Close(); | ||
899 | |||
892 | // Kick all ROOT agents with the message, 'The simulator is going down' | 900 | // Kick all ROOT agents with the message, 'The simulator is going down' |
893 | ForEachScenePresence(delegate(ScenePresence avatar) | 901 | ForEachScenePresence(delegate(ScenePresence avatar) |
894 | { | 902 | { |
@@ -945,11 +953,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
945 | HeartbeatThread = null; | 953 | HeartbeatThread = null; |
946 | } | 954 | } |
947 | m_lastUpdate = Environment.TickCount; | 955 | m_lastUpdate = Environment.TickCount; |
948 | HeartbeatThread = new Thread(new ParameterizedThreadStart(Heartbeat)); | 956 | |
949 | HeartbeatThread.SetApartmentState(ApartmentState.MTA); | 957 | HeartbeatThread = Watchdog.StartThread(Heartbeat, "Heartbeat for region " + RegionInfo.RegionName, ThreadPriority.Normal, false); |
950 | HeartbeatThread.Name = string.Format("Heartbeat for region {0}", RegionInfo.RegionName); | ||
951 | HeartbeatThread.Priority = ThreadPriority.AboveNormal; | ||
952 | HeartbeatThread.Start(); | ||
953 | } | 958 | } |
954 | 959 | ||
955 | /// <summary> | 960 | /// <summary> |
@@ -976,12 +981,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
976 | /// <summary> | 981 | /// <summary> |
977 | /// Performs per-frame updates regularly | 982 | /// Performs per-frame updates regularly |
978 | /// </summary> | 983 | /// </summary> |
979 | /// <param name="sender"></param> | 984 | private void Heartbeat() |
980 | /// <param name="e"></param> | ||
981 | private void Heartbeat(object sender) | ||
982 | { | 985 | { |
983 | if (!Monitor.TryEnter(m_heartbeatLock)) | 986 | if (!Monitor.TryEnter(m_heartbeatLock)) |
987 | { | ||
988 | Watchdog.RemoveThread(); | ||
984 | return; | 989 | return; |
990 | } | ||
985 | 991 | ||
986 | try | 992 | try |
987 | { | 993 | { |
@@ -998,6 +1004,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
998 | Monitor.Pulse(m_heartbeatLock); | 1004 | Monitor.Pulse(m_heartbeatLock); |
999 | Monitor.Exit(m_heartbeatLock); | 1005 | Monitor.Exit(m_heartbeatLock); |
1000 | } | 1006 | } |
1007 | |||
1008 | Watchdog.RemoveThread(); | ||
1001 | } | 1009 | } |
1002 | 1010 | ||
1003 | /// <summary> | 1011 | /// <summary> |
@@ -1016,10 +1024,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1016 | //#endif | 1024 | //#endif |
1017 | maintc = Environment.TickCount; | 1025 | maintc = Environment.TickCount; |
1018 | 1026 | ||
1019 | TimeSpan SinceLastFrame = DateTime.Now - m_lastupdate; | 1027 | TimeSpan SinceLastFrame = DateTime.UtcNow - m_lastupdate; |
1020 | float physicsFPS = 0; | 1028 | float physicsFPS = 0; |
1021 | 1029 | ||
1022 | frameMS = Environment.TickCount; | 1030 | frameMS = Environment.TickCount; |
1031 | |||
1023 | try | 1032 | try |
1024 | { | 1033 | { |
1025 | // Increment the frame counter | 1034 | // Increment the frame counter |
@@ -1101,6 +1110,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1101 | } | 1110 | } |
1102 | if (loginsdisabled && (m_frame > 20)) | 1111 | if (loginsdisabled && (m_frame > 20)) |
1103 | { | 1112 | { |
1113 | // In 99.9% of cases it is a bad idea to manually force garbage collection. However, | ||
1114 | // this is a rare case where we know we have just went through a long cycle of heap | ||
1115 | // allocations, and there is no more work to be done until someone logs in | ||
1116 | GC.Collect(); | ||
1117 | |||
1104 | m_log.Debug("[REGION]: Enabling Logins"); | 1118 | m_log.Debug("[REGION]: Enabling Logins"); |
1105 | loginsdisabled = false; | 1119 | loginsdisabled = false; |
1106 | } | 1120 | } |
@@ -1139,13 +1153,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
1139 | } | 1153 | } |
1140 | m_timedilation = tmpval; | 1154 | m_timedilation = tmpval; |
1141 | 1155 | ||
1142 | m_lastupdate = DateTime.Now; | 1156 | m_lastupdate = DateTime.UtcNow; |
1143 | } | 1157 | } |
1144 | maintc = Environment.TickCount - maintc; | 1158 | maintc = Environment.TickCount - maintc; |
1145 | maintc = (int)(m_timespan * 1000) - maintc; | 1159 | maintc = (int)(m_timespan * 1000) - maintc; |
1146 | 1160 | ||
1147 | if ((maintc < (m_timespan * 1000)) && maintc > 0) | 1161 | if ((maintc < (m_timespan * 1000)) && maintc > 0) |
1148 | Thread.Sleep(maintc); | 1162 | Thread.Sleep(maintc); |
1163 | |||
1164 | // Tell the watchdog that this thread is still alive | ||
1165 | Watchdog.UpdateThread(); | ||
1149 | } | 1166 | } |
1150 | } | 1167 | } |
1151 | 1168 | ||
@@ -1219,10 +1236,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1219 | if (!m_backingup) | 1236 | if (!m_backingup) |
1220 | { | 1237 | { |
1221 | m_backingup = true; | 1238 | m_backingup = true; |
1222 | 1239 | Util.FireAndForget(BackupWaitCallback); | |
1223 | System.ComponentModel.BackgroundWorker backupWorker = new System.ComponentModel.BackgroundWorker(); | ||
1224 | backupWorker.DoWork += delegate(object sender, System.ComponentModel.DoWorkEventArgs e) { Backup(); }; | ||
1225 | backupWorker.RunWorkerAsync(); | ||
1226 | } | 1240 | } |
1227 | } | 1241 | } |
1228 | 1242 | ||
@@ -1235,6 +1249,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1235 | } | 1249 | } |
1236 | 1250 | ||
1237 | /// <summary> | 1251 | /// <summary> |
1252 | /// Wrapper for Backup() that can be called with Util.FireAndForget() | ||
1253 | /// </summary> | ||
1254 | private void BackupWaitCallback(object o) | ||
1255 | { | ||
1256 | Backup(); | ||
1257 | } | ||
1258 | |||
1259 | /// <summary> | ||
1238 | /// Backup the scene. This acts as the main method of the backup thread. | 1260 | /// Backup the scene. This acts as the main method of the backup thread. |
1239 | /// </summary> | 1261 | /// </summary> |
1240 | /// <returns></returns> | 1262 | /// <returns></returns> |
@@ -2460,7 +2482,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2460 | /// <param name="client"></param> | 2482 | /// <param name="client"></param> |
2461 | public override void AddNewClient(IClientAPI client) | 2483 | public override void AddNewClient(IClientAPI client) |
2462 | { | 2484 | { |
2463 | ClientManager.Add(client); | 2485 | m_clientManager.Add(client); |
2464 | 2486 | ||
2465 | CheckHeartbeat(); | 2487 | CheckHeartbeat(); |
2466 | SubscribeToClientEvents(client); | 2488 | SubscribeToClientEvents(client); |
@@ -3099,7 +3121,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3099 | 3121 | ||
3100 | // Remove the avatar from the scene | 3122 | // Remove the avatar from the scene |
3101 | m_sceneGraph.RemoveScenePresence(agentID); | 3123 | m_sceneGraph.RemoveScenePresence(agentID); |
3102 | ClientManager.Remove(agentID); | 3124 | m_clientManager.Remove(agentID); |
3103 | 3125 | ||
3104 | try | 3126 | try |
3105 | { | 3127 | { |
@@ -3496,9 +3518,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3496 | public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) | 3518 | public virtual void AgentCrossing(UUID agentID, Vector3 position, bool isFlying) |
3497 | { | 3519 | { |
3498 | ScenePresence presence; | 3520 | ScenePresence presence; |
3499 | 3521 | m_sceneGraph.TryGetAvatar(agentID, out presence); | |
3500 | lock (m_sceneGraph.ScenePresences) | ||
3501 | m_sceneGraph.ScenePresences.TryGetValue(agentID, out presence); | ||
3502 | 3522 | ||
3503 | if (presence != null) | 3523 | if (presence != null) |
3504 | { | 3524 | { |
@@ -3709,8 +3729,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3709 | Vector3 lookAt, uint teleportFlags) | 3729 | Vector3 lookAt, uint teleportFlags) |
3710 | { | 3730 | { |
3711 | ScenePresence sp; | 3731 | ScenePresence sp; |
3712 | lock (m_sceneGraph.ScenePresences) | 3732 | m_sceneGraph.TryGetAvatar(remoteClient.AgentId, out sp); |
3713 | m_sceneGraph.ScenePresences.TryGetValue(remoteClient.AgentId, out sp); | ||
3714 | 3733 | ||
3715 | if (sp != null) | 3734 | if (sp != null) |
3716 | { | 3735 | { |
@@ -4112,7 +4131,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4112 | /// This list is a new object, so it can be iterated over without locking. | 4131 | /// This list is a new object, so it can be iterated over without locking. |
4113 | /// </summary> | 4132 | /// </summary> |
4114 | /// <returns></returns> | 4133 | /// <returns></returns> |
4115 | public List<ScenePresence> GetScenePresences() | 4134 | public ScenePresence[] GetScenePresences() |
4116 | { | 4135 | { |
4117 | return m_sceneGraph.GetScenePresences(); | 4136 | return m_sceneGraph.GetScenePresences(); |
4118 | } | 4137 | } |
@@ -4159,15 +4178,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
4159 | public void ForEachScenePresence(Action<ScenePresence> action) | 4178 | public void ForEachScenePresence(Action<ScenePresence> action) |
4160 | { | 4179 | { |
4161 | // We don't want to try to send messages if there are no avatars. | 4180 | // We don't want to try to send messages if there are no avatars. |
4162 | if (m_sceneGraph != null && m_sceneGraph.ScenePresences != null) | 4181 | if (m_sceneGraph != null) |
4163 | { | 4182 | { |
4164 | try | 4183 | try |
4165 | { | 4184 | { |
4166 | List<ScenePresence> presenceList = GetScenePresences(); | 4185 | ScenePresence[] presences = GetScenePresences(); |
4167 | foreach (ScenePresence presence in presenceList) | 4186 | for (int i = 0; i < presences.Length; i++) |
4168 | { | 4187 | action(presences[i]); |
4169 | action(presence); | ||
4170 | } | ||
4171 | } | 4188 | } |
4172 | catch (Exception e) | 4189 | catch (Exception e) |
4173 | { | 4190 | { |
@@ -4239,7 +4256,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
4239 | 4256 | ||
4240 | public void ForEachClient(Action<IClientAPI> action) | 4257 | public void ForEachClient(Action<IClientAPI> action) |
4241 | { | 4258 | { |
4242 | ClientManager.ForEach(action); | 4259 | ForEachClient(action, m_useAsyncWhenPossible); |
4260 | } | ||
4261 | |||
4262 | public void ForEachClient(Action<IClientAPI> action, bool doAsynchronous) | ||
4263 | { | ||
4264 | // FIXME: Asynchronous iteration is disabled until we have a threading model that | ||
4265 | // can support calling this function from an async packet handler without | ||
4266 | // potentially deadlocking | ||
4267 | m_clientManager.ForEachSync(action); | ||
4268 | |||
4269 | //if (doAsynchronous) | ||
4270 | // m_clientManager.ForEach(action); | ||
4271 | //else | ||
4272 | // m_clientManager.ForEachSync(action); | ||
4273 | } | ||
4274 | |||
4275 | public bool TryGetClient(UUID avatarID, out IClientAPI client) | ||
4276 | { | ||
4277 | return m_clientManager.TryGetValue(avatarID, out client); | ||
4278 | } | ||
4279 | |||
4280 | public bool TryGetClient(System.Net.IPEndPoint remoteEndPoint, out IClientAPI client) | ||
4281 | { | ||
4282 | return m_clientManager.TryGetValue(remoteEndPoint, out client); | ||
4243 | } | 4283 | } |
4244 | 4284 | ||
4245 | public void ForEachSOG(Action<SceneObjectGroup> action) | 4285 | public void ForEachSOG(Action<SceneObjectGroup> action) |
@@ -4571,7 +4611,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4571 | { | 4611 | { |
4572 | case PhysicsJointType.Ball: | 4612 | case PhysicsJointType.Ball: |
4573 | { | 4613 | { |
4574 | PhysicsVector jointAnchor = PhysicsScene.GetJointAnchor(joint); | 4614 | Vector3 jointAnchor = PhysicsScene.GetJointAnchor(joint); |
4575 | Vector3 proxyPos = new Vector3(jointAnchor.X, jointAnchor.Y, jointAnchor.Z); | 4615 | Vector3 proxyPos = new Vector3(jointAnchor.X, jointAnchor.Y, jointAnchor.Z); |
4576 | jointProxyObject.ParentGroup.UpdateGroupPosition(proxyPos); // schedules the entire group for a terse update | 4616 | jointProxyObject.ParentGroup.UpdateGroupPosition(proxyPos); // schedules the entire group for a terse update |
4577 | } | 4617 | } |
@@ -4579,7 +4619,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
4579 | 4619 | ||
4580 | case PhysicsJointType.Hinge: | 4620 | case PhysicsJointType.Hinge: |
4581 | { | 4621 | { |
4582 | PhysicsVector jointAnchor = PhysicsScene.GetJointAnchor(joint); | 4622 | Vector3 jointAnchor = PhysicsScene.GetJointAnchor(joint); |
4583 | 4623 | ||
4584 | // Normally, we would just ask the physics scene to return the axis for the joint. | 4624 | // Normally, we would just ask the physics scene to return the axis for the joint. |
4585 | // Unfortunately, ODE sometimes returns <0,0,0> for the joint axis, which should | 4625 | // Unfortunately, ODE sometimes returns <0,0,0> for the joint axis, which should |
diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index cf5c3c8..82731d1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs | |||
@@ -102,12 +102,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
102 | 102 | ||
103 | private readonly Mutex _primAllocateMutex = new Mutex(false); | 103 | private readonly Mutex _primAllocateMutex = new Mutex(false); |
104 | 104 | ||
105 | private readonly ClientManager m_clientManager = new ClientManager(); | 105 | protected readonly ClientManager m_clientManager = new ClientManager(); |
106 | |||
107 | public ClientManager ClientManager | ||
108 | { | ||
109 | get { return m_clientManager; } | ||
110 | } | ||
111 | 106 | ||
112 | public float TimeDilation | 107 | public float TimeDilation |
113 | { | 108 | { |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index deee6c3..db055f9 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -66,7 +66,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
66 | 66 | ||
67 | #region Fields | 67 | #region Fields |
68 | 68 | ||
69 | protected internal Dictionary<UUID, ScenePresence> ScenePresences = new Dictionary<UUID, ScenePresence>(); | 69 | protected Dictionary<UUID, ScenePresence> m_scenePresences = new Dictionary<UUID, ScenePresence>(); |
70 | protected ScenePresence[] m_scenePresenceArray = new ScenePresence[0]; | ||
71 | |||
70 | // SceneObjects is not currently populated or used. | 72 | // SceneObjects is not currently populated or used. |
71 | //public Dictionary<UUID, SceneObjectGroup> SceneObjects; | 73 | //public Dictionary<UUID, SceneObjectGroup> SceneObjects; |
72 | protected internal EntityManager Entities = new EntityManager(); | 74 | protected internal EntityManager Entities = new EntityManager(); |
@@ -126,10 +128,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
126 | 128 | ||
127 | protected internal void Close() | 129 | protected internal void Close() |
128 | { | 130 | { |
129 | lock (ScenePresences) | 131 | lock (m_scenePresences) |
130 | { | 132 | { |
131 | ScenePresences.Clear(); | 133 | m_scenePresences.Clear(); |
134 | m_scenePresenceArray = new ScenePresence[0]; | ||
132 | } | 135 | } |
136 | |||
133 | lock (m_dictionary_lock) | 137 | lock (m_dictionary_lock) |
134 | { | 138 | { |
135 | SceneObjectGroupsByFullID.Clear(); | 139 | SceneObjectGroupsByFullID.Clear(); |
@@ -157,11 +161,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
157 | 161 | ||
158 | protected internal void UpdatePresences() | 162 | protected internal void UpdatePresences() |
159 | { | 163 | { |
160 | List<ScenePresence> updateScenePresences = GetScenePresences(); | 164 | ScenePresence[] updateScenePresences = GetScenePresences(); |
161 | foreach (ScenePresence pres in updateScenePresences) | 165 | for (int i = 0; i < updateScenePresences.Length; i++) |
162 | { | 166 | updateScenePresences[i].Update(); |
163 | pres.Update(); | ||
164 | } | ||
165 | } | 167 | } |
166 | 168 | ||
167 | protected internal float UpdatePhysics(double elapsed) | 169 | protected internal float UpdatePhysics(double elapsed) |
@@ -190,15 +192,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
190 | 192 | ||
191 | protected internal void UpdateScenePresenceMovement() | 193 | protected internal void UpdateScenePresenceMovement() |
192 | { | 194 | { |
193 | List<ScenePresence> moveEntities = GetScenePresences(); | 195 | ScenePresence[] moveEntities = GetScenePresences(); |
194 | 196 | for (int i = 0; i < moveEntities.Length; i++) | |
195 | foreach (EntityBase entity in moveEntities) | 197 | moveEntities[i].UpdateMovement(); |
196 | { | ||
197 | //cfk. This throws occaisional exceptions on a heavily used region | ||
198 | //and I added this null check to try to preclude the exception. | ||
199 | if (entity != null) | ||
200 | entity.UpdateMovement(); | ||
201 | } | ||
202 | } | 198 | } |
203 | 199 | ||
204 | #endregion | 200 | #endregion |
@@ -645,9 +641,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
645 | 641 | ||
646 | Entities[presence.UUID] = presence; | 642 | Entities[presence.UUID] = presence; |
647 | 643 | ||
648 | lock (ScenePresences) | 644 | lock (m_scenePresences) |
649 | { | 645 | { |
650 | ScenePresences[presence.UUID] = presence; | 646 | if (!m_scenePresences.ContainsKey(presence.UUID)) |
647 | { | ||
648 | m_scenePresences.Add(presence.UUID, presence); | ||
649 | |||
650 | // Create a new array of ScenePresence references | ||
651 | int oldLength = m_scenePresenceArray.Length; | ||
652 | ScenePresence[] newArray = new ScenePresence[oldLength + 1]; | ||
653 | Array.Copy(m_scenePresenceArray, newArray, oldLength); | ||
654 | newArray[oldLength] = presence; | ||
655 | m_scenePresenceArray = newArray; | ||
656 | } | ||
657 | else | ||
658 | { | ||
659 | m_scenePresences[presence.UUID] = presence; | ||
660 | |||
661 | // Do a linear search through the array of ScenePresence references | ||
662 | // and update the modified entry | ||
663 | for (int i = 0; i < m_scenePresenceArray.Length; i++) | ||
664 | { | ||
665 | if (m_scenePresenceArray[i].UUID == presence.UUID) | ||
666 | { | ||
667 | m_scenePresenceArray[i] = presence; | ||
668 | break; | ||
669 | } | ||
670 | } | ||
671 | } | ||
651 | } | 672 | } |
652 | } | 673 | } |
653 | 674 | ||
@@ -663,16 +684,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
663 | agentID); | 684 | agentID); |
664 | } | 685 | } |
665 | 686 | ||
666 | lock (ScenePresences) | 687 | lock (m_scenePresences) |
667 | { | 688 | { |
668 | if (!ScenePresences.Remove(agentID)) | 689 | if (m_scenePresences.Remove(agentID)) |
690 | { | ||
691 | // Copy all of the elements from the previous array | ||
692 | // into the new array except the removed element | ||
693 | int oldLength = m_scenePresenceArray.Length; | ||
694 | ScenePresence[] newArray = new ScenePresence[oldLength - 1]; | ||
695 | int j = 0; | ||
696 | for (int i = 0; i < m_scenePresenceArray.Length; i++) | ||
697 | { | ||
698 | ScenePresence presence = m_scenePresenceArray[i]; | ||
699 | if (presence.UUID != agentID) | ||
700 | { | ||
701 | newArray[j] = presence; | ||
702 | ++j; | ||
703 | } | ||
704 | } | ||
705 | m_scenePresenceArray = newArray; | ||
706 | } | ||
707 | else | ||
669 | { | 708 | { |
670 | m_log.WarnFormat("[SCENE] Tried to remove non-existent scene presence with agent ID {0} from scene ScenePresences list", agentID); | 709 | m_log.WarnFormat("[SCENE] Tried to remove non-existent scene presence with agent ID {0} from scene ScenePresences list", agentID); |
671 | } | 710 | } |
672 | // else | ||
673 | // { | ||
674 | // m_log.InfoFormat("[SCENE] Removed scene presence {0} from scene presences list", agentID); | ||
675 | // } | ||
676 | } | 711 | } |
677 | } | 712 | } |
678 | 713 | ||
@@ -704,20 +739,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
704 | 739 | ||
705 | public void RecalculateStats() | 740 | public void RecalculateStats() |
706 | { | 741 | { |
707 | List<ScenePresence> SPList = GetScenePresences(); | 742 | ScenePresence[] presences = GetScenePresences(); |
708 | int rootcount = 0; | 743 | int rootcount = 0; |
709 | int childcount = 0; | 744 | int childcount = 0; |
710 | 745 | ||
711 | foreach (ScenePresence user in SPList) | 746 | for (int i = 0; i < presences.Length; i++) |
712 | { | 747 | { |
748 | ScenePresence user = presences[i]; | ||
713 | if (user.IsChildAgent) | 749 | if (user.IsChildAgent) |
714 | childcount++; | 750 | ++childcount; |
715 | else | 751 | else |
716 | rootcount++; | 752 | ++rootcount; |
717 | } | 753 | } |
754 | |||
718 | m_numRootAgents = rootcount; | 755 | m_numRootAgents = rootcount; |
719 | m_numChildAgents = childcount; | 756 | m_numChildAgents = childcount; |
720 | |||
721 | } | 757 | } |
722 | 758 | ||
723 | public int GetChildAgentCount() | 759 | public int GetChildAgentCount() |
@@ -767,12 +803,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
767 | /// locking is required to iterate over it. | 803 | /// locking is required to iterate over it. |
768 | /// </summary> | 804 | /// </summary> |
769 | /// <returns></returns> | 805 | /// <returns></returns> |
770 | protected internal List<ScenePresence> GetScenePresences() | 806 | protected internal ScenePresence[] GetScenePresences() |
771 | { | 807 | { |
772 | lock (ScenePresences) | 808 | return m_scenePresenceArray; |
773 | { | ||
774 | return new List<ScenePresence>(ScenePresences.Values); | ||
775 | } | ||
776 | } | 809 | } |
777 | 810 | ||
778 | protected internal List<ScenePresence> GetAvatars() | 811 | protected internal List<ScenePresence> GetAvatars() |
@@ -817,14 +850,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
817 | // No locking of scene presences here since we're passing back a list... | 850 | // No locking of scene presences here since we're passing back a list... |
818 | 851 | ||
819 | List<ScenePresence> result = new List<ScenePresence>(); | 852 | List<ScenePresence> result = new List<ScenePresence>(); |
820 | List<ScenePresence> ScenePresencesList = GetScenePresences(); | 853 | ScenePresence[] scenePresences = GetScenePresences(); |
821 | 854 | ||
822 | foreach (ScenePresence avatar in ScenePresencesList) | 855 | for (int i = 0; i < scenePresences.Length; i++) |
823 | { | 856 | { |
857 | ScenePresence avatar = scenePresences[i]; | ||
824 | if (filter(avatar)) | 858 | if (filter(avatar)) |
825 | { | ||
826 | result.Add(avatar); | 859 | result.Add(avatar); |
827 | } | ||
828 | } | 860 | } |
829 | 861 | ||
830 | return result; | 862 | return result; |
@@ -839,9 +871,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
839 | { | 871 | { |
840 | ScenePresence sp; | 872 | ScenePresence sp; |
841 | 873 | ||
842 | lock (ScenePresences) | 874 | lock (m_scenePresences) |
843 | { | 875 | { |
844 | ScenePresences.TryGetValue(agentID, out sp); | 876 | m_scenePresences.TryGetValue(agentID, out sp); |
845 | } | 877 | } |
846 | 878 | ||
847 | return sp; | 879 | return sp; |
@@ -1000,48 +1032,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
1000 | 1032 | ||
1001 | protected internal bool TryGetAvatar(UUID avatarId, out ScenePresence avatar) | 1033 | protected internal bool TryGetAvatar(UUID avatarId, out ScenePresence avatar) |
1002 | { | 1034 | { |
1003 | ScenePresence presence; | 1035 | lock (m_scenePresences) |
1004 | 1036 | return m_scenePresences.TryGetValue(avatarId, out avatar); | |
1005 | lock (ScenePresences) | ||
1006 | { | ||
1007 | if (ScenePresences.TryGetValue(avatarId, out presence)) | ||
1008 | { | ||
1009 | avatar = presence; | ||
1010 | return true; | ||
1011 | |||
1012 | //if (!presence.IsChildAgent) | ||
1013 | //{ | ||
1014 | // avatar = presence; | ||
1015 | // return true; | ||
1016 | //} | ||
1017 | //else | ||
1018 | //{ | ||
1019 | // m_log.WarnFormat( | ||
1020 | // "[INNER SCENE]: Requested avatar {0} could not be found in scene {1} since it is only registered as a child agent!", | ||
1021 | // avatarId, m_parentScene.RegionInfo.RegionName); | ||
1022 | //} | ||
1023 | } | ||
1024 | } | ||
1025 | |||
1026 | avatar = null; | ||
1027 | return false; | ||
1028 | } | 1037 | } |
1029 | 1038 | ||
1030 | protected internal bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) | 1039 | protected internal bool TryGetAvatarByName(string avatarName, out ScenePresence avatar) |
1031 | { | 1040 | { |
1032 | lock (ScenePresences) | 1041 | ScenePresence[] presences = GetScenePresences(); |
1042 | |||
1043 | for (int i = 0; i < presences.Length; i++) | ||
1033 | { | 1044 | { |
1034 | foreach (ScenePresence presence in ScenePresences.Values) | 1045 | ScenePresence presence = presences[i]; |
1046 | |||
1047 | if (!presence.IsChildAgent) | ||
1035 | { | 1048 | { |
1036 | if (!presence.IsChildAgent) | 1049 | if (String.Compare(avatarName, presence.ControllingClient.Name, true) == 0) |
1037 | { | 1050 | { |
1038 | string name = presence.ControllingClient.Name; | 1051 | avatar = presence; |
1039 | 1052 | return true; | |
1040 | if (String.Compare(avatarName, name, true) == 0) | ||
1041 | { | ||
1042 | avatar = presence; | ||
1043 | return true; | ||
1044 | } | ||
1045 | } | 1053 | } |
1046 | } | 1054 | } |
1047 | } | 1055 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneManager.cs b/OpenSim/Region/Framework/Scenes/SceneManager.cs index 3097929..dfaa7ea 100644 --- a/OpenSim/Region/Framework/Scenes/SceneManager.cs +++ b/OpenSim/Region/Framework/Scenes/SceneManager.cs | |||
@@ -411,41 +411,46 @@ namespace OpenSim.Region.Framework.Scenes | |||
411 | /// <param name="newDebug"></param> | 411 | /// <param name="newDebug"></param> |
412 | public void SetDebugPacketLevelOnCurrentScene(int newDebug) | 412 | public void SetDebugPacketLevelOnCurrentScene(int newDebug) |
413 | { | 413 | { |
414 | ForEachCurrentScene(delegate(Scene scene) | 414 | ForEachCurrentScene( |
415 | { | 415 | delegate(Scene scene) |
416 | List<ScenePresence> scenePresences = scene.GetScenePresences(); | 416 | { |
417 | ScenePresence[] scenePresences = scene.GetScenePresences(); | ||
418 | |||
419 | for (int i = 0; i < scenePresences.Length; i++) | ||
420 | { | ||
421 | ScenePresence scenePresence = scenePresences[i]; | ||
417 | 422 | ||
418 | foreach (ScenePresence scenePresence in scenePresences) | 423 | if (!scenePresence.IsChildAgent) |
419 | { | 424 | { |
420 | if (!scenePresence.IsChildAgent) | 425 | m_log.ErrorFormat("Packet debug for {0} {1} set to {2}", |
421 | { | 426 | scenePresence.Firstname, |
422 | m_log.ErrorFormat("Packet debug for {0} {1} set to {2}", | 427 | scenePresence.Lastname, |
423 | scenePresence.Firstname, | 428 | newDebug); |
424 | scenePresence.Lastname, | ||
425 | newDebug); | ||
426 | 429 | ||
427 | scenePresence.ControllingClient.SetDebugPacketLevel(newDebug); | 430 | scenePresence.ControllingClient.SetDebugPacketLevel(newDebug); |
428 | } | 431 | } |
429 | } | 432 | } |
430 | }); | 433 | } |
434 | ); | ||
431 | } | 435 | } |
432 | 436 | ||
433 | public List<ScenePresence> GetCurrentSceneAvatars() | 437 | public List<ScenePresence> GetCurrentSceneAvatars() |
434 | { | 438 | { |
435 | List<ScenePresence> avatars = new List<ScenePresence>(); | 439 | List<ScenePresence> avatars = new List<ScenePresence>(); |
436 | 440 | ||
437 | ForEachCurrentScene(delegate(Scene scene) | 441 | ForEachCurrentScene( |
438 | { | 442 | delegate(Scene scene) |
439 | List<ScenePresence> scenePresences = scene.GetScenePresences(); | ||
440 | |||
441 | foreach (ScenePresence scenePresence in scenePresences) | ||
442 | { | 443 | { |
443 | if (!scenePresence.IsChildAgent) | 444 | ScenePresence[] scenePresences = scene.GetScenePresences(); |
445 | |||
446 | for (int i = 0; i < scenePresences.Length; i++) | ||
444 | { | 447 | { |
445 | avatars.Add(scenePresence); | 448 | ScenePresence scenePresence = scenePresences[i]; |
449 | if (!scenePresence.IsChildAgent) | ||
450 | avatars.Add(scenePresence); | ||
446 | } | 451 | } |
447 | } | 452 | } |
448 | }); | 453 | ); |
449 | 454 | ||
450 | return avatars; | 455 | return avatars; |
451 | } | 456 | } |
@@ -456,7 +461,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
456 | 461 | ||
457 | ForEachCurrentScene(delegate(Scene scene) | 462 | ForEachCurrentScene(delegate(Scene scene) |
458 | { | 463 | { |
459 | List<ScenePresence> scenePresences = scene.GetScenePresences(); | 464 | ScenePresence[] scenePresences = scene.GetScenePresences(); |
460 | presences.AddRange(scenePresences); | 465 | presences.AddRange(scenePresences); |
461 | }); | 466 | }); |
462 | 467 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index fff807a..ab7abbe 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -493,8 +493,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
493 | 493 | ||
494 | public Vector3 GroupScale() | 494 | public Vector3 GroupScale() |
495 | { | 495 | { |
496 | Vector3 minScale = new Vector3(Constants.RegionSize,Constants.RegionSize,Constants.RegionSize); | 496 | Vector3 minScale = new Vector3(Constants.RegionSize, Constants.RegionSize, Constants.RegionSize); |
497 | Vector3 maxScale = new Vector3(0f,0f,0f); | 497 | Vector3 maxScale = Vector3.Zero; |
498 | Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); | 498 | Vector3 finalScale = new Vector3(0.5f, 0.5f, 0.5f); |
499 | 499 | ||
500 | lock (m_parts) | 500 | lock (m_parts) |
@@ -577,7 +577,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
577 | { | 577 | { |
578 | foreach (SceneObjectPart part in m_parts.Values) | 578 | foreach (SceneObjectPart part in m_parts.Values) |
579 | { | 579 | { |
580 | |||
581 | Vector3 worldPos = part.GetWorldPosition(); | 580 | Vector3 worldPos = part.GetWorldPosition(); |
582 | Vector3 offset = worldPos - AbsolutePosition; | 581 | Vector3 offset = worldPos - AbsolutePosition; |
583 | Quaternion worldRot; | 582 | Quaternion worldRot; |
@@ -1182,8 +1181,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1182 | { | 1181 | { |
1183 | // part.Inventory.RemoveScriptInstances(); | 1182 | // part.Inventory.RemoveScriptInstances(); |
1184 | 1183 | ||
1185 | List<ScenePresence> avatars = Scene.GetScenePresences(); | 1184 | ScenePresence[] avatars = Scene.GetScenePresences(); |
1186 | for (int i = 0; i < avatars.Count; i++) | 1185 | for (int i = 0; i < avatars.Length; i++) |
1187 | { | 1186 | { |
1188 | if (avatars[i].ParentID == LocalId) | 1187 | if (avatars[i].ParentID == LocalId) |
1189 | { | 1188 | { |
@@ -1335,7 +1334,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1335 | (parcel.LandData.GroupID != GroupID || | 1334 | (parcel.LandData.GroupID != GroupID || |
1336 | parcel.LandData.GroupID == UUID.Zero)) | 1335 | parcel.LandData.GroupID == UUID.Zero)) |
1337 | { | 1336 | { |
1338 | if ((DateTime.Now - RootPart.Rezzed).TotalMinutes > | 1337 | if ((DateTime.UtcNow - RootPart.Rezzed).TotalMinutes > |
1339 | parcel.LandData.OtherCleanTime) | 1338 | parcel.LandData.OtherCleanTime) |
1340 | { | 1339 | { |
1341 | DetachFromBackup(); | 1340 | DetachFromBackup(); |
@@ -1480,8 +1479,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1480 | dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape( | 1479 | dupe.RootPart.PhysActor = m_scene.PhysicsScene.AddPrimShape( |
1481 | dupe.RootPart.Name, | 1480 | dupe.RootPart.Name, |
1482 | pbs, | 1481 | pbs, |
1483 | new PhysicsVector(dupe.RootPart.AbsolutePosition.X, dupe.RootPart.AbsolutePosition.Y, dupe.RootPart.AbsolutePosition.Z), | 1482 | dupe.RootPart.AbsolutePosition, |
1484 | new PhysicsVector(dupe.RootPart.Scale.X, dupe.RootPart.Scale.Y, dupe.RootPart.Scale.Z), | 1483 | dupe.RootPart.Scale, |
1485 | dupe.RootPart.RotationOffset, | 1484 | dupe.RootPart.RotationOffset, |
1486 | dupe.RootPart.PhysActor.IsPhysical); | 1485 | dupe.RootPart.PhysActor.IsPhysical); |
1487 | 1486 | ||
@@ -1596,7 +1595,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1596 | */ | 1595 | */ |
1597 | } | 1596 | } |
1598 | 1597 | ||
1599 | public void applyImpulse(PhysicsVector impulse) | 1598 | public void applyImpulse(Vector3 impulse) |
1600 | { | 1599 | { |
1601 | // We check if rootpart is null here because scripts don't delete if you delete the host. | 1600 | // We check if rootpart is null here because scripts don't delete if you delete the host. |
1602 | // This means that unfortunately, we can pass a null physics actor to Simulate! | 1601 | // This means that unfortunately, we can pass a null physics actor to Simulate! |
@@ -1623,7 +1622,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1623 | } | 1622 | } |
1624 | } | 1623 | } |
1625 | 1624 | ||
1626 | public void applyAngularImpulse(PhysicsVector impulse) | 1625 | public void applyAngularImpulse(Vector3 impulse) |
1627 | { | 1626 | { |
1628 | // We check if rootpart is null here because scripts don't delete if you delete the host. | 1627 | // We check if rootpart is null here because scripts don't delete if you delete the host. |
1629 | // This means that unfortunately, we can pass a null physics actor to Simulate! | 1628 | // This means that unfortunately, we can pass a null physics actor to Simulate! |
@@ -1642,7 +1641,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1642 | } | 1641 | } |
1643 | } | 1642 | } |
1644 | 1643 | ||
1645 | public void setAngularImpulse(PhysicsVector impulse) | 1644 | public void setAngularImpulse(Vector3 impulse) |
1646 | { | 1645 | { |
1647 | // We check if rootpart is null here because scripts don't delete if you delete the host. | 1646 | // We check if rootpart is null here because scripts don't delete if you delete the host. |
1648 | // This means that unfortunately, we can pass a null physics actor to Simulate! | 1647 | // This means that unfortunately, we can pass a null physics actor to Simulate! |
@@ -1673,8 +1672,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
1673 | { | 1672 | { |
1674 | if (!IsAttachment) | 1673 | if (!IsAttachment) |
1675 | { | 1674 | { |
1676 | PhysicsVector torque = rootpart.PhysActor.Torque; | 1675 | Vector3 torque = rootpart.PhysActor.Torque; |
1677 | return new Vector3(torque.X, torque.Y, torque.Z); | 1676 | return torque; |
1678 | } | 1677 | } |
1679 | } | 1678 | } |
1680 | } | 1679 | } |
@@ -1707,7 +1706,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1707 | { | 1706 | { |
1708 | if (rootpart.PhysActor != null) | 1707 | if (rootpart.PhysActor != null) |
1709 | { | 1708 | { |
1710 | rootpart.PhysActor.PIDTarget = new PhysicsVector(target.X, target.Y, target.Z); | 1709 | rootpart.PhysActor.PIDTarget = target; |
1711 | rootpart.PhysActor.PIDTau = tau; | 1710 | rootpart.PhysActor.PIDTau = tau; |
1712 | rootpart.PhysActor.PIDActive = true; | 1711 | rootpart.PhysActor.PIDActive = true; |
1713 | } | 1712 | } |
@@ -2414,7 +2413,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2414 | if (m_rootPart.PhysActor.IsPhysical) | 2413 | if (m_rootPart.PhysActor.IsPhysical) |
2415 | { | 2414 | { |
2416 | Vector3 llmoveforce = pos - AbsolutePosition; | 2415 | Vector3 llmoveforce = pos - AbsolutePosition; |
2417 | PhysicsVector grabforce = new PhysicsVector(llmoveforce.X, llmoveforce.Y, llmoveforce.Z); | 2416 | Vector3 grabforce = llmoveforce; |
2418 | grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; | 2417 | grabforce = (grabforce / 10) * m_rootPart.PhysActor.Mass; |
2419 | m_rootPart.PhysActor.AddForce(grabforce,true); | 2418 | m_rootPart.PhysActor.AddForce(grabforce,true); |
2420 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 2419 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); |
@@ -2519,7 +2518,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2519 | rotationAxis.Normalize(); | 2518 | rotationAxis.Normalize(); |
2520 | 2519 | ||
2521 | //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis); | 2520 | //m_log.Error("SCENE OBJECT GROUP]: rotation axis is " + rotationAxis); |
2522 | PhysicsVector spinforce = new PhysicsVector(rotationAxis.X, rotationAxis.Y, rotationAxis.Z); | 2521 | Vector3 spinforce = new Vector3(rotationAxis.X, rotationAxis.Y, rotationAxis.Z); |
2523 | spinforce = (spinforce/8) * m_rootPart.PhysActor.Mass; // 8 is an arbitrary torque scaling factor | 2522 | spinforce = (spinforce/8) * m_rootPart.PhysActor.Mass; // 8 is an arbitrary torque scaling factor |
2524 | m_rootPart.PhysActor.AddAngularForce(spinforce,true); | 2523 | m_rootPart.PhysActor.AddAngularForce(spinforce,true); |
2525 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); | 2524 | m_scene.PhysicsScene.AddPhysicsActorTaint(m_rootPart.PhysActor); |
@@ -2746,8 +2745,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2746 | if (scale.Z > m_scene.m_maxPhys) | 2745 | if (scale.Z > m_scene.m_maxPhys) |
2747 | scale.Z = m_scene.m_maxPhys; | 2746 | scale.Z = m_scene.m_maxPhys; |
2748 | } | 2747 | } |
2749 | part.PhysActor.Size = | 2748 | part.PhysActor.Size = scale; |
2750 | new PhysicsVector(scale.X, scale.Y, scale.Z); | ||
2751 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 2749 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); |
2752 | } | 2750 | } |
2753 | //if (part.UUID != m_rootPart.UUID) | 2751 | //if (part.UUID != m_rootPart.UUID) |
@@ -2891,8 +2889,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2891 | 2889 | ||
2892 | if (part.PhysActor != null) | 2890 | if (part.PhysActor != null) |
2893 | { | 2891 | { |
2894 | part.PhysActor.Size = | 2892 | part.PhysActor.Size = prevScale; |
2895 | new PhysicsVector(prevScale.X, prevScale.Y, prevScale.Z); | ||
2896 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 2893 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); |
2897 | } | 2894 | } |
2898 | 2895 | ||
@@ -3405,6 +3402,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3405 | return GetPriorityByDistance(client); | 3402 | return GetPriorityByDistance(client); |
3406 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3403 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3407 | return GetPriorityBySimpleAngularDistance(client); | 3404 | return GetPriorityBySimpleAngularDistance(client); |
3405 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3406 | return GetPriorityByFrontBack(client); | ||
3408 | default: | 3407 | default: |
3409 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); | 3408 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); |
3410 | } | 3409 | } |
@@ -3437,6 +3436,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
3437 | return double.NaN; | 3436 | return double.NaN; |
3438 | } | 3437 | } |
3439 | 3438 | ||
3439 | private double GetPriorityByFrontBack(IClientAPI client) | ||
3440 | { | ||
3441 | ScenePresence presence = Scene.GetScenePresence(client.AgentId); | ||
3442 | if (presence != null) | ||
3443 | { | ||
3444 | return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis); | ||
3445 | } | ||
3446 | return double.NaN; | ||
3447 | } | ||
3448 | |||
3440 | public double GetPriorityByDistance(Vector3 position) | 3449 | public double GetPriorityByDistance(Vector3 position) |
3441 | { | 3450 | { |
3442 | return Vector3.Distance(AbsolutePosition, position); | 3451 | return Vector3.Distance(AbsolutePosition, position); |
@@ -3466,5 +3475,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
3466 | else | 3475 | else |
3467 | return double.MinValue; | 3476 | return double.MinValue; |
3468 | } | 3477 | } |
3478 | |||
3479 | public double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis) | ||
3480 | { | ||
3481 | // Distance | ||
3482 | double priority = Vector3.Distance(camPosition, AbsolutePosition); | ||
3483 | |||
3484 | // Scale | ||
3485 | //priority -= GroupScale().Length(); | ||
3486 | |||
3487 | // Plane equation | ||
3488 | float d = -Vector3.Dot(camPosition, camAtAxis); | ||
3489 | float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d; | ||
3490 | if (p < 0.0f) priority *= 2.0f; | ||
3491 | |||
3492 | return priority; | ||
3493 | } | ||
3469 | } | 3494 | } |
3470 | } | 3495 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 5f46f6f..7d889ee 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -102,16 +102,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
102 | 102 | ||
103 | #region Fields | 103 | #region Fields |
104 | 104 | ||
105 | public bool AllowedDrop = false; | 105 | public bool AllowedDrop; |
106 | 106 | ||
107 | [XmlIgnore] | 107 | [XmlIgnore] |
108 | public bool DIE_AT_EDGE = false; | 108 | public bool DIE_AT_EDGE; |
109 | 109 | ||
110 | // TODO: This needs to be persisted in next XML version update! | 110 | // TODO: This needs to be persisted in next XML version update! |
111 | [XmlIgnore] | 111 | [XmlIgnore] |
112 | public int[] PayPrice = {-2,-2,-2,-2,-2}; | 112 | public readonly int[] PayPrice = {-2,-2,-2,-2,-2}; |
113 | [XmlIgnore] | 113 | [XmlIgnore] |
114 | public PhysicsActor PhysActor = null; | 114 | public PhysicsActor PhysActor; |
115 | 115 | ||
116 | //Xantor 20080528 Sound stuff: | 116 | //Xantor 20080528 Sound stuff: |
117 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. | 117 | // Note: This isn't persisted in the database right now, as the fields for that aren't just there yet. |
@@ -130,55 +130,56 @@ namespace OpenSim.Region.Framework.Scenes | |||
130 | public double SoundRadius; | 130 | public double SoundRadius; |
131 | 131 | ||
132 | [XmlIgnore] | 132 | [XmlIgnore] |
133 | public uint TimeStampFull = 0; | 133 | public uint TimeStampFull; |
134 | 134 | ||
135 | [XmlIgnore] | 135 | [XmlIgnore] |
136 | public uint TimeStampLastActivity = 0; // Will be used for AutoReturn | 136 | public uint TimeStampLastActivity; // Will be used for AutoReturn |
137 | 137 | ||
138 | [XmlIgnore] | 138 | [XmlIgnore] |
139 | public uint TimeStampTerse = 0; | 139 | public uint TimeStampTerse; |
140 | 140 | ||
141 | [XmlIgnore] | 141 | [XmlIgnore] |
142 | public UUID FromItemID = UUID.Zero; | 142 | public UUID FromItemID; |
143 | 143 | ||
144 | /// <value> | 144 | /// <value> |
145 | /// The UUID of the user inventory item from which this object was rezzed if this is a root part. | 145 | /// The UUID of the user inventory item from which this object was rezzed if this is a root part. |
146 | /// If UUID.Zero then either this is not a root part or there is no connection with a user inventory item. | 146 | /// If UUID.Zero then either this is not a root part or there is no connection with a user inventory item. |
147 | /// </value> | 147 | /// </value> |
148 | private UUID m_fromUserInventoryItemID = UUID.Zero; | 148 | private UUID m_fromUserInventoryItemID; |
149 | 149 | ||
150 | [XmlIgnore] | 150 | [XmlIgnore] |
151 | public UUID FromUserInventoryItemID | 151 | public UUID FromUserInventoryItemID |
152 | { | 152 | { |
153 | get { return m_fromUserInventoryItemID; } | 153 | get { return m_fromUserInventoryItemID; } |
154 | } | 154 | } |
155 | 155 | ||
156 | [XmlIgnore] | 156 | [XmlIgnore] |
157 | public bool IsAttachment = false; | 157 | public bool IsAttachment; |
158 | 158 | ||
159 | [XmlIgnore] | 159 | [XmlIgnore] |
160 | public scriptEvents AggregateScriptEvents = 0; | 160 | public scriptEvents AggregateScriptEvents; |
161 | 161 | ||
162 | [XmlIgnore] | 162 | [XmlIgnore] |
163 | public UUID AttachedAvatar = UUID.Zero; | 163 | public UUID AttachedAvatar; |
164 | 164 | ||
165 | [XmlIgnore] | 165 | [XmlIgnore] |
166 | public Vector3 AttachedPos = Vector3.Zero; | 166 | public Vector3 AttachedPos; |
167 | 167 | ||
168 | [XmlIgnore] | 168 | [XmlIgnore] |
169 | public uint AttachmentPoint = (byte)0; | 169 | public uint AttachmentPoint; |
170 | 170 | ||
171 | [XmlIgnore] | 171 | [XmlIgnore] |
172 | public PhysicsVector RotationAxis = new PhysicsVector(1f,1f,1f); | 172 | public Vector3 RotationAxis = Vector3.One; |
173 | 173 | ||
174 | [XmlIgnore] | 174 | [XmlIgnore] |
175 | public bool VolumeDetectActive = false; // XmlIgnore set to avoid problems with persistance until I come to care for this | 175 | public bool VolumeDetectActive; // XmlIgnore set to avoid problems with persistance until I come to care for this |
176 | // Certainly this must be a persistant setting finally | 176 | // Certainly this must be a persistant setting finally |
177 | 177 | ||
178 | [XmlIgnore] | 178 | [XmlIgnore] |
179 | public bool IsWaitingForFirstSpinUpdatePacket = false; | 179 | public bool IsWaitingForFirstSpinUpdatePacket; |
180 | |||
180 | [XmlIgnore] | 181 | [XmlIgnore] |
181 | public Quaternion SpinOldOrientation = new Quaternion(); | 182 | public Quaternion SpinOldOrientation = Quaternion.Identity; |
182 | 183 | ||
183 | /// <summary> | 184 | /// <summary> |
184 | /// This part's inventory | 185 | /// This part's inventory |
@@ -191,34 +192,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
191 | protected SceneObjectPartInventory m_inventory; | 192 | protected SceneObjectPartInventory m_inventory; |
192 | 193 | ||
193 | [XmlIgnore] | 194 | [XmlIgnore] |
194 | public bool Undoing = false; | 195 | public bool Undoing; |
195 | 196 | ||
196 | [XmlIgnore] | 197 | [XmlIgnore] |
197 | private PrimFlags LocalFlags = 0; | 198 | private PrimFlags LocalFlags; |
198 | [XmlIgnore] | 199 | [XmlIgnore] |
199 | private float m_damage = -1.0f; | 200 | private float m_damage = -1.0f; |
200 | private byte[] m_TextureAnimation; | 201 | private byte[] m_TextureAnimation; |
201 | private byte m_clickAction = 0; | 202 | private byte m_clickAction; |
202 | private Color m_color = Color.Black; | 203 | private Color m_color = Color.Black; |
203 | private string m_description = String.Empty; | 204 | private string m_description = String.Empty; |
204 | private readonly List<uint> m_lastColliders = new List<uint>(); | 205 | private readonly List<uint> m_lastColliders = new List<uint>(); |
205 | // private PhysicsVector m_lastRotationalVelocity = PhysicsVector.Zero; | 206 | private int m_linkNum; |
206 | private int m_linkNum = 0; | ||
207 | [XmlIgnore] | 207 | [XmlIgnore] |
208 | private int m_scriptAccessPin = 0; | 208 | private int m_scriptAccessPin; |
209 | [XmlIgnore] | 209 | [XmlIgnore] |
210 | private readonly Dictionary<UUID, scriptEvents> m_scriptEvents = new Dictionary<UUID, scriptEvents>(); | 210 | private readonly Dictionary<UUID, scriptEvents> m_scriptEvents = new Dictionary<UUID, scriptEvents>(); |
211 | private string m_sitName = String.Empty; | 211 | private string m_sitName = String.Empty; |
212 | private Quaternion m_sitTargetOrientation = Quaternion.Identity; | 212 | private Quaternion m_sitTargetOrientation = Quaternion.Identity; |
213 | private Vector3 m_sitTargetPosition = Vector3.Zero; | 213 | private Vector3 m_sitTargetPosition; |
214 | private string m_sitAnimation = "SIT"; | 214 | private string m_sitAnimation = "SIT"; |
215 | private string m_text = String.Empty; | 215 | private string m_text = String.Empty; |
216 | private string m_touchName = String.Empty; | 216 | private string m_touchName = String.Empty; |
217 | private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); | 217 | private readonly UndoStack<UndoState> m_undo = new UndoStack<UndoState>(5); |
218 | private UUID _creatorID; | 218 | private UUID _creatorID; |
219 | 219 | ||
220 | 220 | private bool m_passTouches; | |
221 | private bool m_passTouches = false; | ||
222 | 221 | ||
223 | /// <summary> | 222 | /// <summary> |
224 | /// Only used internally to schedule client updates. | 223 | /// Only used internally to schedule client updates. |
@@ -236,28 +235,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
236 | //unkown if this will be kept, added as a way of removing the group position from the group class | 235 | //unkown if this will be kept, added as a way of removing the group position from the group class |
237 | protected Vector3 m_groupPosition; | 236 | protected Vector3 m_groupPosition; |
238 | protected uint m_localId; | 237 | protected uint m_localId; |
239 | protected Material m_material = (Material)3; // Wood | 238 | protected Material m_material = OpenMetaverse.Material.Wood; |
240 | protected string m_name; | 239 | protected string m_name; |
241 | protected Vector3 m_offsetPosition; | 240 | protected Vector3 m_offsetPosition; |
242 | 241 | ||
243 | // FIXME, TODO, ERROR: 'ParentGroup' can't be in here, move it out. | 242 | // FIXME, TODO, ERROR: 'ParentGroup' can't be in here, move it out. |
244 | protected SceneObjectGroup m_parentGroup; | 243 | protected SceneObjectGroup m_parentGroup; |
245 | protected byte[] m_particleSystem = new byte[0]; | 244 | protected byte[] m_particleSystem = Utils.EmptyBytes; |
246 | protected ulong m_regionHandle; | 245 | protected ulong m_regionHandle; |
247 | protected Quaternion m_rotationOffset; | 246 | protected Quaternion m_rotationOffset; |
248 | protected PrimitiveBaseShape m_shape = null; | 247 | protected PrimitiveBaseShape m_shape; |
249 | protected UUID m_uuid; | 248 | protected UUID m_uuid; |
250 | protected Vector3 m_velocity; | 249 | protected Vector3 m_velocity; |
251 | 250 | ||
251 | protected Vector3 m_lastPosition; | ||
252 | protected Quaternion m_lastRotation; | ||
253 | protected Vector3 m_lastVelocity; | ||
254 | protected Vector3 m_lastAcceleration; | ||
255 | protected Vector3 m_lastAngularVelocity; | ||
256 | |||
252 | // TODO: Those have to be changed into persistent properties at some later point, | 257 | // TODO: Those have to be changed into persistent properties at some later point, |
253 | // or sit-camera on vehicles will break on sim-crossing. | 258 | // or sit-camera on vehicles will break on sim-crossing. |
254 | private Vector3 m_cameraEyeOffset = new Vector3(0.0f, 0.0f, 0.0f); | 259 | private Vector3 m_cameraEyeOffset; |
255 | private Vector3 m_cameraAtOffset = new Vector3(0.0f, 0.0f, 0.0f); | 260 | private Vector3 m_cameraAtOffset; |
256 | private bool m_forceMouselook = false; | 261 | private bool m_forceMouselook; |
257 | 262 | ||
258 | // TODO: Collision sound should have default. | 263 | // TODO: Collision sound should have default. |
259 | private UUID m_collisionSound = UUID.Zero; | 264 | private UUID m_collisionSound; |
260 | private float m_collisionSoundVolume = 0.0f; | 265 | private float m_collisionSoundVolume; |
261 | 266 | ||
262 | #endregion Fields | 267 | #endregion Fields |
263 | 268 | ||
@@ -269,9 +274,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
269 | public SceneObjectPart() | 274 | public SceneObjectPart() |
270 | { | 275 | { |
271 | // It's not necessary to persist this | 276 | // It's not necessary to persist this |
272 | m_TextureAnimation = new byte[0]; | 277 | m_TextureAnimation = Utils.EmptyBytes; |
273 | m_particleSystem = new byte[0]; | 278 | m_particleSystem = Utils.EmptyBytes; |
274 | Rezzed = DateTime.Now; | 279 | Rezzed = DateTime.UtcNow; |
275 | 280 | ||
276 | m_inventory = new SceneObjectPartInventory(this); | 281 | m_inventory = new SceneObjectPartInventory(this); |
277 | } | 282 | } |
@@ -290,8 +295,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
290 | { | 295 | { |
291 | m_name = "Primitive"; | 296 | m_name = "Primitive"; |
292 | 297 | ||
293 | Rezzed = DateTime.Now; | 298 | Rezzed = DateTime.UtcNow; |
294 | _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | 299 | _creationDate = (int)Utils.DateTimeToUnixTime(Rezzed); |
295 | _ownerID = ownerID; | 300 | _ownerID = ownerID; |
296 | _creatorID = _ownerID; | 301 | _creatorID = _ownerID; |
297 | _lastOwnerID = UUID.Zero; | 302 | _lastOwnerID = UUID.Zero; |
@@ -299,19 +304,19 @@ namespace OpenSim.Region.Framework.Scenes | |||
299 | Shape = shape; | 304 | Shape = shape; |
300 | // Todo: Add More Object Parameter from above! | 305 | // Todo: Add More Object Parameter from above! |
301 | _ownershipCost = 0; | 306 | _ownershipCost = 0; |
302 | _objectSaleType = (byte) 0; | 307 | _objectSaleType = 0; |
303 | _salePrice = 0; | 308 | _salePrice = 0; |
304 | _category = (uint) 0; | 309 | _category = 0; |
305 | _lastOwnerID = _creatorID; | 310 | _lastOwnerID = _creatorID; |
306 | // End Todo: /// | 311 | // End Todo: /// |
307 | GroupPosition = groupPosition; | 312 | GroupPosition = groupPosition; |
308 | OffsetPosition = offsetPosition; | 313 | OffsetPosition = offsetPosition; |
309 | RotationOffset = rotationOffset; | 314 | RotationOffset = rotationOffset; |
310 | Velocity = new Vector3(0, 0, 0); | 315 | Velocity = Vector3.Zero; |
311 | AngularVelocity = new Vector3(0, 0, 0); | 316 | AngularVelocity = Vector3.Zero; |
312 | Acceleration = new Vector3(0, 0, 0); | 317 | Acceleration = Vector3.Zero; |
313 | m_TextureAnimation = new byte[0]; | 318 | m_TextureAnimation = Utils.EmptyBytes; |
314 | m_particleSystem = new byte[0]; | 319 | m_particleSystem = Utils.EmptyBytes; |
315 | 320 | ||
316 | // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, | 321 | // Prims currently only contain a single folder (Contents). From looking at the Second Life protocol, |
317 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from | 322 | // this appears to have the same UUID (!) as the prim. If this isn't the case, one can't drag items from |
@@ -532,13 +537,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
532 | // Root prim actually goes at Position | 537 | // Root prim actually goes at Position |
533 | if (_parentID == 0) | 538 | if (_parentID == 0) |
534 | { | 539 | { |
535 | PhysActor.Position = new PhysicsVector(value.X, value.Y, value.Z); | 540 | PhysActor.Position = value; |
536 | } | 541 | } |
537 | else | 542 | else |
538 | { | 543 | { |
539 | // To move the child prim in respect to the group position and rotation we have to calculate | 544 | // To move the child prim in respect to the group position and rotation we have to calculate |
540 | Vector3 resultingposition = GetWorldPosition(); | 545 | Vector3 resultingposition = GetWorldPosition(); |
541 | PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); | 546 | PhysActor.Position = resultingposition; |
542 | Quaternion resultingrot = GetWorldRotation(); | 547 | Quaternion resultingrot = GetWorldRotation(); |
543 | PhysActor.Orientation = resultingrot; | 548 | PhysActor.Orientation = resultingrot; |
544 | } | 549 | } |
@@ -580,7 +585,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
580 | if (_parentID != 0 && PhysActor != null) | 585 | if (_parentID != 0 && PhysActor != null) |
581 | { | 586 | { |
582 | Vector3 resultingposition = GetWorldPosition(); | 587 | Vector3 resultingposition = GetWorldPosition(); |
583 | PhysActor.Position = new PhysicsVector(resultingposition.X, resultingposition.Y, resultingposition.Z); | 588 | PhysActor.Position = resultingposition; |
584 | Quaternion resultingrot = GetWorldRotation(); | 589 | Quaternion resultingrot = GetWorldRotation(); |
585 | PhysActor.Orientation = resultingrot; | 590 | PhysActor.Orientation = resultingrot; |
586 | 591 | ||
@@ -670,7 +675,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
670 | { | 675 | { |
671 | if (PhysActor.IsPhysical) | 676 | if (PhysActor.IsPhysical) |
672 | { | 677 | { |
673 | PhysActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); | 678 | PhysActor.Velocity = value; |
674 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 679 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); |
675 | } | 680 | } |
676 | } | 681 | } |
@@ -812,7 +817,7 @@ if (m_shape != null) { | |||
812 | { | 817 | { |
813 | if (m_parentGroup.Scene.PhysicsScene != null) | 818 | if (m_parentGroup.Scene.PhysicsScene != null) |
814 | { | 819 | { |
815 | PhysActor.Size = new PhysicsVector(m_shape.Scale.X, m_shape.Scale.Y, m_shape.Scale.Z); | 820 | PhysActor.Size = m_shape.Scale; |
816 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | 821 | m_parentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); |
817 | } | 822 | } |
818 | } | 823 | } |
@@ -1077,8 +1082,8 @@ if (m_shape != null) { | |||
1077 | 1082 | ||
1078 | private void SendObjectPropertiesToClient(UUID AgentID) | 1083 | private void SendObjectPropertiesToClient(UUID AgentID) |
1079 | { | 1084 | { |
1080 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 1085 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
1081 | for (int i = 0; i < avatars.Count; i++) | 1086 | for (int i = 0; i < avatars.Length; i++) |
1082 | { | 1087 | { |
1083 | // Ugly reference :( | 1088 | // Ugly reference :( |
1084 | if (avatars[i].UUID == AgentID) | 1089 | if (avatars[i].UUID == AgentID) |
@@ -1140,8 +1145,8 @@ if (m_shape != null) { | |||
1140 | /// </summary> | 1145 | /// </summary> |
1141 | public void AddFullUpdateToAllAvatars() | 1146 | public void AddFullUpdateToAllAvatars() |
1142 | { | 1147 | { |
1143 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 1148 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
1144 | for (int i = 0; i < avatars.Count; i++) | 1149 | for (int i = 0; i < avatars.Length; i++) |
1145 | { | 1150 | { |
1146 | avatars[i].SceneViewer.QueuePartForUpdate(this); | 1151 | avatars[i].SceneViewer.QueuePartForUpdate(this); |
1147 | } | 1152 | } |
@@ -1165,8 +1170,8 @@ if (m_shape != null) { | |||
1165 | /// Terse updates | 1170 | /// Terse updates |
1166 | public void AddTerseUpdateToAllAvatars() | 1171 | public void AddTerseUpdateToAllAvatars() |
1167 | { | 1172 | { |
1168 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 1173 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
1169 | for (int i = 0; i < avatars.Count; i++) | 1174 | for (int i = 0; i < avatars.Length; i++) |
1170 | { | 1175 | { |
1171 | avatars[i].SceneViewer.QueuePartForUpdate(this); | 1176 | avatars[i].SceneViewer.QueuePartForUpdate(this); |
1172 | } | 1177 | } |
@@ -1220,7 +1225,7 @@ if (m_shape != null) { | |||
1220 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> | 1225 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> |
1221 | public void ApplyImpulse(Vector3 impulsei, bool localGlobalTF) | 1226 | public void ApplyImpulse(Vector3 impulsei, bool localGlobalTF) |
1222 | { | 1227 | { |
1223 | PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z); | 1228 | Vector3 impulse = impulsei; |
1224 | 1229 | ||
1225 | if (localGlobalTF) | 1230 | if (localGlobalTF) |
1226 | { | 1231 | { |
@@ -1228,7 +1233,7 @@ if (m_shape != null) { | |||
1228 | Quaternion AXgrot = grot; | 1233 | Quaternion AXgrot = grot; |
1229 | Vector3 AXimpulsei = impulsei; | 1234 | Vector3 AXimpulsei = impulsei; |
1230 | Vector3 newimpulse = AXimpulsei * AXgrot; | 1235 | Vector3 newimpulse = AXimpulsei * AXgrot; |
1231 | impulse = new PhysicsVector(newimpulse.X, newimpulse.Y, newimpulse.Z); | 1236 | impulse = newimpulse; |
1232 | } | 1237 | } |
1233 | 1238 | ||
1234 | if (m_parentGroup != null) | 1239 | if (m_parentGroup != null) |
@@ -1246,7 +1251,7 @@ if (m_shape != null) { | |||
1246 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> | 1251 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> |
1247 | public void ApplyAngularImpulse(Vector3 impulsei, bool localGlobalTF) | 1252 | public void ApplyAngularImpulse(Vector3 impulsei, bool localGlobalTF) |
1248 | { | 1253 | { |
1249 | PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z); | 1254 | Vector3 impulse = impulsei; |
1250 | 1255 | ||
1251 | if (localGlobalTF) | 1256 | if (localGlobalTF) |
1252 | { | 1257 | { |
@@ -1254,7 +1259,7 @@ if (m_shape != null) { | |||
1254 | Quaternion AXgrot = grot; | 1259 | Quaternion AXgrot = grot; |
1255 | Vector3 AXimpulsei = impulsei; | 1260 | Vector3 AXimpulsei = impulsei; |
1256 | Vector3 newimpulse = AXimpulsei * AXgrot; | 1261 | Vector3 newimpulse = AXimpulsei * AXgrot; |
1257 | impulse = new PhysicsVector(newimpulse.X, newimpulse.Y, newimpulse.Z); | 1262 | impulse = newimpulse; |
1258 | } | 1263 | } |
1259 | 1264 | ||
1260 | if (m_parentGroup != null) | 1265 | if (m_parentGroup != null) |
@@ -1272,7 +1277,7 @@ if (m_shape != null) { | |||
1272 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> | 1277 | /// <param name="localGlobalTF">true for the local frame, false for the global frame</param> |
1273 | public void SetAngularImpulse(Vector3 impulsei, bool localGlobalTF) | 1278 | public void SetAngularImpulse(Vector3 impulsei, bool localGlobalTF) |
1274 | { | 1279 | { |
1275 | PhysicsVector impulse = new PhysicsVector(impulsei.X, impulsei.Y, impulsei.Z); | 1280 | Vector3 impulse = impulsei; |
1276 | 1281 | ||
1277 | if (localGlobalTF) | 1282 | if (localGlobalTF) |
1278 | { | 1283 | { |
@@ -1280,7 +1285,7 @@ if (m_shape != null) { | |||
1280 | Quaternion AXgrot = grot; | 1285 | Quaternion AXgrot = grot; |
1281 | Vector3 AXimpulsei = impulsei; | 1286 | Vector3 AXimpulsei = impulsei; |
1282 | Vector3 newimpulse = AXimpulsei * AXgrot; | 1287 | Vector3 newimpulse = AXimpulsei * AXgrot; |
1283 | impulse = new PhysicsVector(newimpulse.X, newimpulse.Y, newimpulse.Z); | 1288 | impulse = newimpulse; |
1284 | } | 1289 | } |
1285 | 1290 | ||
1286 | if (m_parentGroup != null) | 1291 | if (m_parentGroup != null) |
@@ -1328,8 +1333,8 @@ if (m_shape != null) { | |||
1328 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( | 1333 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( |
1329 | Name, | 1334 | Name, |
1330 | Shape, | 1335 | Shape, |
1331 | new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z), | 1336 | AbsolutePosition, |
1332 | new PhysicsVector(Scale.X, Scale.Y, Scale.Z), | 1337 | Scale, |
1333 | RotationOffset, | 1338 | RotationOffset, |
1334 | RigidBody); | 1339 | RigidBody); |
1335 | 1340 | ||
@@ -1518,7 +1523,7 @@ if (m_shape != null) { | |||
1518 | PhysicsJoint joint; | 1523 | PhysicsJoint joint; |
1519 | 1524 | ||
1520 | joint = m_parentGroup.Scene.PhysicsScene.RequestJointCreation(Name, jointType, | 1525 | joint = m_parentGroup.Scene.PhysicsScene.RequestJointCreation(Name, jointType, |
1521 | new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z), | 1526 | AbsolutePosition, |
1522 | this.RotationOffset, | 1527 | this.RotationOffset, |
1523 | Description, | 1528 | Description, |
1524 | bodyNames, | 1529 | bodyNames, |
@@ -1703,12 +1708,12 @@ if (m_shape != null) { | |||
1703 | } | 1708 | } |
1704 | } | 1709 | } |
1705 | 1710 | ||
1706 | public PhysicsVector GetForce() | 1711 | public Vector3 GetForce() |
1707 | { | 1712 | { |
1708 | if (PhysActor != null) | 1713 | if (PhysActor != null) |
1709 | return PhysActor.Force; | 1714 | return PhysActor.Force; |
1710 | else | 1715 | else |
1711 | return new PhysicsVector(); | 1716 | return Vector3.Zero; |
1712 | } | 1717 | } |
1713 | 1718 | ||
1714 | public void GetProperties(IClientAPI client) | 1719 | public void GetProperties(IClientAPI client) |
@@ -1894,24 +1899,24 @@ if (m_shape != null) { | |||
1894 | } | 1899 | } |
1895 | else | 1900 | else |
1896 | { | 1901 | { |
1897 | List<ScenePresence> avlist = m_parentGroup.Scene.GetScenePresences(); | 1902 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); |
1898 | if (avlist != null) | 1903 | |
1904 | for (int i = 0; i < avlist.Length; i++) | ||
1899 | { | 1905 | { |
1900 | foreach (ScenePresence av in avlist) | 1906 | ScenePresence av = avlist[i]; |
1907 | |||
1908 | if (av.LocalId == localId) | ||
1901 | { | 1909 | { |
1902 | if (av.LocalId == localId) | 1910 | DetectedObject detobj = new DetectedObject(); |
1903 | { | 1911 | detobj.keyUUID = av.UUID; |
1904 | DetectedObject detobj = new DetectedObject(); | 1912 | detobj.nameStr = av.ControllingClient.Name; |
1905 | detobj.keyUUID = av.UUID; | 1913 | detobj.ownerUUID = av.UUID; |
1906 | detobj.nameStr = av.ControllingClient.Name; | 1914 | detobj.posVector = av.AbsolutePosition; |
1907 | detobj.ownerUUID = av.UUID; | 1915 | detobj.rotQuat = av.Rotation; |
1908 | detobj.posVector = av.AbsolutePosition; | 1916 | detobj.velVector = av.Velocity; |
1909 | detobj.rotQuat = av.Rotation; | 1917 | detobj.colliderType = 0; |
1910 | detobj.velVector = av.Velocity; | 1918 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; |
1911 | detobj.colliderType = 0; | 1919 | colliding.Add(detobj); |
1912 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
1913 | colliding.Add(detobj); | ||
1914 | } | ||
1915 | } | 1920 | } |
1916 | } | 1921 | } |
1917 | } | 1922 | } |
@@ -1965,26 +1970,25 @@ if (m_shape != null) { | |||
1965 | } | 1970 | } |
1966 | else | 1971 | else |
1967 | { | 1972 | { |
1968 | List<ScenePresence> avlist = m_parentGroup.Scene.GetScenePresences(); | 1973 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); |
1969 | if (avlist != null) | 1974 | |
1975 | for (int i = 0; i < avlist.Length; i++) | ||
1970 | { | 1976 | { |
1971 | foreach (ScenePresence av in avlist) | 1977 | ScenePresence av = avlist[i]; |
1978 | |||
1979 | if (av.LocalId == localId) | ||
1972 | { | 1980 | { |
1973 | if (av.LocalId == localId) | 1981 | DetectedObject detobj = new DetectedObject(); |
1974 | { | 1982 | detobj.keyUUID = av.UUID; |
1975 | DetectedObject detobj = new DetectedObject(); | 1983 | detobj.nameStr = av.Name; |
1976 | detobj.keyUUID = av.UUID; | 1984 | detobj.ownerUUID = av.UUID; |
1977 | detobj.nameStr = av.Name; | 1985 | detobj.posVector = av.AbsolutePosition; |
1978 | detobj.ownerUUID = av.UUID; | 1986 | detobj.rotQuat = av.Rotation; |
1979 | detobj.posVector = av.AbsolutePosition; | 1987 | detobj.velVector = av.Velocity; |
1980 | detobj.rotQuat = av.Rotation; | 1988 | detobj.colliderType = 0; |
1981 | detobj.velVector = av.Velocity; | 1989 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; |
1982 | detobj.colliderType = 0; | 1990 | colliding.Add(detobj); |
1983 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
1984 | colliding.Add(detobj); | ||
1985 | } | ||
1986 | } | 1991 | } |
1987 | |||
1988 | } | 1992 | } |
1989 | } | 1993 | } |
1990 | } | 1994 | } |
@@ -2035,24 +2039,24 @@ if (m_shape != null) { | |||
2035 | } | 2039 | } |
2036 | else | 2040 | else |
2037 | { | 2041 | { |
2038 | List<ScenePresence> avlist = m_parentGroup.Scene.GetScenePresences(); | 2042 | ScenePresence[] avlist = m_parentGroup.Scene.GetScenePresences(); |
2039 | if (avlist != null) | 2043 | |
2044 | for (int i = 0; i < avlist.Length; i++) | ||
2040 | { | 2045 | { |
2041 | foreach (ScenePresence av in avlist) | 2046 | ScenePresence av = avlist[i]; |
2047 | |||
2048 | if (av.LocalId == localId) | ||
2042 | { | 2049 | { |
2043 | if (av.LocalId == localId) | 2050 | DetectedObject detobj = new DetectedObject(); |
2044 | { | 2051 | detobj.keyUUID = av.UUID; |
2045 | DetectedObject detobj = new DetectedObject(); | 2052 | detobj.nameStr = av.Name; |
2046 | detobj.keyUUID = av.UUID; | 2053 | detobj.ownerUUID = av.UUID; |
2047 | detobj.nameStr = av.Name; | 2054 | detobj.posVector = av.AbsolutePosition; |
2048 | detobj.ownerUUID = av.UUID; | 2055 | detobj.rotQuat = av.Rotation; |
2049 | detobj.posVector = av.AbsolutePosition; | 2056 | detobj.velVector = av.Velocity; |
2050 | detobj.rotQuat = av.Rotation; | 2057 | detobj.colliderType = 0; |
2051 | detobj.velVector = av.Velocity; | 2058 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; |
2052 | detobj.colliderType = 0; | 2059 | colliding.Add(detobj); |
2053 | detobj.groupUUID = av.ControllingClient.ActiveGroupId; | ||
2054 | colliding.Add(detobj); | ||
2055 | } | ||
2056 | } | 2060 | } |
2057 | } | 2061 | } |
2058 | } | 2062 | } |
@@ -2074,7 +2078,7 @@ if (m_shape != null) { | |||
2074 | } | 2078 | } |
2075 | } | 2079 | } |
2076 | 2080 | ||
2077 | public void PhysicsOutOfBounds(PhysicsVector pos) | 2081 | public void PhysicsOutOfBounds(Vector3 pos) |
2078 | { | 2082 | { |
2079 | m_log.Error("[PHYSICS]: Physical Object went out of bounds."); | 2083 | m_log.Error("[PHYSICS]: Physical Object went out of bounds."); |
2080 | 2084 | ||
@@ -2317,8 +2321,8 @@ if (m_shape != null) { | |||
2317 | /// </summary> | 2321 | /// </summary> |
2318 | public void SendFullUpdateToAllClients() | 2322 | public void SendFullUpdateToAllClients() |
2319 | { | 2323 | { |
2320 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 2324 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
2321 | for (int i = 0; i < avatars.Count; i++) | 2325 | for (int i = 0; i < avatars.Length; i++) |
2322 | { | 2326 | { |
2323 | // Ugly reference :( | 2327 | // Ugly reference :( |
2324 | m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this, | 2328 | m_parentGroup.SendPartFullUpdate(avatars[i].ControllingClient, this, |
@@ -2328,8 +2332,8 @@ if (m_shape != null) { | |||
2328 | 2332 | ||
2329 | public void SendFullUpdateToAllClientsExcept(UUID agentID) | 2333 | public void SendFullUpdateToAllClientsExcept(UUID agentID) |
2330 | { | 2334 | { |
2331 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 2335 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
2332 | for (int i = 0; i < avatars.Count; i++) | 2336 | for (int i = 0; i < avatars.Length; i++) |
2333 | { | 2337 | { |
2334 | // Ugly reference :( | 2338 | // Ugly reference :( |
2335 | if (avatars[i].UUID != agentID) | 2339 | if (avatars[i].UUID != agentID) |
@@ -2394,18 +2398,36 @@ if (m_shape != null) { | |||
2394 | /// </summary> | 2398 | /// </summary> |
2395 | public void SendScheduledUpdates() | 2399 | public void SendScheduledUpdates() |
2396 | { | 2400 | { |
2397 | if (m_updateFlag == 1) //some change has been made so update the clients | 2401 | const float VELOCITY_TOLERANCE = 0.01f; |
2402 | const float POSITION_TOLERANCE = 0.1f; | ||
2403 | |||
2404 | if (m_updateFlag == 1) | ||
2398 | { | 2405 | { |
2399 | AddTerseUpdateToAllAvatars(); | 2406 | // Throw away duplicate or insignificant updates |
2400 | ClearUpdateSchedule(); | 2407 | if (RotationOffset != m_lastRotation || |
2408 | Acceleration != m_lastAcceleration || | ||
2409 | (Velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || | ||
2410 | (RotationalVelocity - m_lastAngularVelocity).Length() > VELOCITY_TOLERANCE || | ||
2411 | (OffsetPosition - m_lastPosition).Length() > POSITION_TOLERANCE) | ||
2412 | { | ||
2413 | AddTerseUpdateToAllAvatars(); | ||
2414 | ClearUpdateSchedule(); | ||
2401 | 2415 | ||
2402 | // This causes the Scene to 'poll' physical objects every couple of frames | 2416 | // This causes the Scene to 'poll' physical objects every couple of frames |
2403 | // bad, so it's been replaced by an event driven method. | 2417 | // bad, so it's been replaced by an event driven method. |
2404 | //if ((ObjectFlags & (uint)PrimFlags.Physics) != 0) | 2418 | //if ((ObjectFlags & (uint)PrimFlags.Physics) != 0) |
2405 | //{ | 2419 | //{ |
2406 | // Only send the constant terse updates on physical objects! | 2420 | // Only send the constant terse updates on physical objects! |
2407 | //ScheduleTerseUpdate(); | 2421 | //ScheduleTerseUpdate(); |
2408 | //} | 2422 | //} |
2423 | |||
2424 | // Update the "last" values | ||
2425 | m_lastPosition = OffsetPosition; | ||
2426 | m_lastRotation = RotationOffset; | ||
2427 | m_lastVelocity = Velocity; | ||
2428 | m_lastAcceleration = Acceleration; | ||
2429 | m_lastAngularVelocity = RotationalVelocity; | ||
2430 | } | ||
2409 | } | 2431 | } |
2410 | else | 2432 | else |
2411 | { | 2433 | { |
@@ -2472,8 +2494,8 @@ if (m_shape != null) { | |||
2472 | /// </summary> | 2494 | /// </summary> |
2473 | public void SendTerseUpdateToAllClients() | 2495 | public void SendTerseUpdateToAllClients() |
2474 | { | 2496 | { |
2475 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 2497 | ScenePresence[] avatars = m_parentGroup.Scene.GetScenePresences(); |
2476 | for (int i = 0; i < avatars.Count; i++) | 2498 | for (int i = 0; i < avatars.Length; i++) |
2477 | { | 2499 | { |
2478 | SendTerseUpdateToClient(avatars[i].ControllingClient); | 2500 | SendTerseUpdateToClient(avatars[i].ControllingClient); |
2479 | } | 2501 | } |
@@ -2547,7 +2569,7 @@ if (m_shape != null) { | |||
2547 | } | 2569 | } |
2548 | } | 2570 | } |
2549 | 2571 | ||
2550 | public void SetForce(PhysicsVector force) | 2572 | public void SetForce(Vector3 force) |
2551 | { | 2573 | { |
2552 | if (PhysActor != null) | 2574 | if (PhysActor != null) |
2553 | { | 2575 | { |
@@ -2571,7 +2593,7 @@ if (m_shape != null) { | |||
2571 | } | 2593 | } |
2572 | } | 2594 | } |
2573 | 2595 | ||
2574 | public void SetVehicleVectorParam(int param, PhysicsVector value) | 2596 | public void SetVehicleVectorParam(int param, Vector3 value) |
2575 | { | 2597 | { |
2576 | if (PhysActor != null) | 2598 | if (PhysActor != null) |
2577 | { | 2599 | { |
@@ -3420,8 +3442,8 @@ if (m_shape != null) { | |||
3420 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( | 3442 | PhysActor = m_parentGroup.Scene.PhysicsScene.AddPrimShape( |
3421 | Name, | 3443 | Name, |
3422 | Shape, | 3444 | Shape, |
3423 | new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z), | 3445 | AbsolutePosition, |
3424 | new PhysicsVector(Scale.X, Scale.Y, Scale.Z), | 3446 | Scale, |
3425 | RotationOffset, | 3447 | RotationOffset, |
3426 | UsePhysics); | 3448 | UsePhysics); |
3427 | 3449 | ||
@@ -3561,7 +3583,7 @@ if (m_shape != null) { | |||
3561 | // in SL. | 3583 | // in SL. |
3562 | // | 3584 | // |
3563 | if (ParentGroup.RootPart != this) | 3585 | if (ParentGroup.RootPart != this) |
3564 | ParentGroup.RootPart.Rezzed = DateTime.Now; | 3586 | ParentGroup.RootPart.Rezzed = DateTime.UtcNow; |
3565 | 3587 | ||
3566 | ParentGroup.HasGroupChanged = true; | 3588 | ParentGroup.HasGroupChanged = true; |
3567 | ScheduleFullUpdate(); | 3589 | ScheduleFullUpdate(); |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index d7113bf..87fac0c 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -93,12 +93,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
93 | public Vector3 lastKnownAllowedPosition; | 93 | public Vector3 lastKnownAllowedPosition; |
94 | public bool sentMessageAboutRestrictedParcelFlyingDown; | 94 | public bool sentMessageAboutRestrictedParcelFlyingDown; |
95 | 95 | ||
96 | 96 | private Vector3 m_lastPosition; | |
97 | private Quaternion m_lastRotation; | ||
98 | private Vector3 m_lastVelocity; | ||
97 | 99 | ||
98 | private bool m_updateflag; | 100 | private bool m_updateflag; |
99 | private byte m_movementflag; | 101 | private byte m_movementflag; |
100 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); | 102 | private readonly List<NewForce> m_forcesList = new List<NewForce>(); |
101 | private short m_updateCount; | ||
102 | private uint m_requestedSitTargetID; | 103 | private uint m_requestedSitTargetID; |
103 | private UUID m_requestedSitTargetUUID = UUID.Zero; | 104 | private UUID m_requestedSitTargetUUID = UUID.Zero; |
104 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; | 105 | private SendCourseLocationsMethod m_sendCourseLocationsMethod; |
@@ -145,12 +146,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
145 | public string JID = string.Empty; | 146 | public string JID = string.Empty; |
146 | 147 | ||
147 | // Agent moves with a PID controller causing a force to be exerted. | 148 | // Agent moves with a PID controller causing a force to be exerted. |
148 | private bool m_newForce; | ||
149 | private bool m_newCoarseLocations = true; | 149 | private bool m_newCoarseLocations = true; |
150 | private float m_health = 100f; | 150 | private float m_health = 100f; |
151 | 151 | ||
152 | private Vector3 m_lastVelocity = Vector3.Zero; | ||
153 | |||
154 | // Default AV Height | 152 | // Default AV Height |
155 | private float m_avHeight = 127.0f; | 153 | private float m_avHeight = 127.0f; |
156 | 154 | ||
@@ -158,16 +156,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
158 | protected ulong crossingFromRegion; | 156 | protected ulong crossingFromRegion; |
159 | 157 | ||
160 | private readonly Vector3[] Dir_Vectors = new Vector3[6]; | 158 | private readonly Vector3[] Dir_Vectors = new Vector3[6]; |
161 | |||
162 | /// <value> | ||
163 | /// The avatar position last sent to clients | ||
164 | /// </value> | ||
165 | private Vector3 lastPhysPos = Vector3.Zero; | ||
166 | |||
167 | /// <value> | ||
168 | /// The avatar body rotation last sent to clients | ||
169 | /// </value> | ||
170 | private Quaternion lastPhysRot = Quaternion.Identity; | ||
171 | 159 | ||
172 | // Position of agent's camera in world (region cordinates) | 160 | // Position of agent's camera in world (region cordinates) |
173 | protected Vector3 m_CameraCenter = Vector3.Zero; | 161 | protected Vector3 m_CameraCenter = Vector3.Zero; |
@@ -297,6 +285,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
297 | get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); } | 285 | get { return Util.Axes2Rot(m_CameraAtAxis, m_CameraLeftAxis, m_CameraUpAxis); } |
298 | } | 286 | } |
299 | 287 | ||
288 | public Vector3 CameraAtAxis | ||
289 | { | ||
290 | get { return m_CameraAtAxis; } | ||
291 | } | ||
292 | |||
293 | public Vector3 CameraLeftAxis | ||
294 | { | ||
295 | get { return m_CameraLeftAxis; } | ||
296 | } | ||
297 | |||
298 | public Vector3 CameraUpAxis | ||
299 | { | ||
300 | get { return m_CameraUpAxis; } | ||
301 | } | ||
302 | |||
300 | public Vector3 Lookat | 303 | public Vector3 Lookat |
301 | { | 304 | { |
302 | get | 305 | get |
@@ -431,7 +434,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
431 | { | 434 | { |
432 | lock (m_scene.SyncRoot) | 435 | lock (m_scene.SyncRoot) |
433 | { | 436 | { |
434 | m_physicsActor.Position = new PhysicsVector(value.X, value.Y, value.Z); | 437 | m_physicsActor.Position = value; |
435 | } | 438 | } |
436 | } | 439 | } |
437 | catch (Exception e) | 440 | catch (Exception e) |
@@ -471,7 +474,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
471 | { | 474 | { |
472 | lock (m_scene.SyncRoot) | 475 | lock (m_scene.SyncRoot) |
473 | { | 476 | { |
474 | m_physicsActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); | 477 | m_physicsActor.Velocity = value; |
475 | } | 478 | } |
476 | } | 479 | } |
477 | catch (Exception e) | 480 | catch (Exception e) |
@@ -869,14 +872,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
869 | 872 | ||
870 | m_isChildAgent = false; | 873 | m_isChildAgent = false; |
871 | 874 | ||
872 | List<ScenePresence> AnimAgents = m_scene.GetScenePresences(); | 875 | ScenePresence[] animAgents = m_scene.GetScenePresences(); |
873 | foreach (ScenePresence p in AnimAgents) | 876 | for (int i = 0; i < animAgents.Length; i++) |
874 | { | 877 | { |
875 | if (p != this) | 878 | ScenePresence presence = animAgents[i]; |
876 | p.SendAnimPackToClient(ControllingClient); | 879 | |
880 | if (presence != this) | ||
881 | presence.SendAnimPackToClient(ControllingClient); | ||
877 | } | 882 | } |
878 | m_scene.EventManager.TriggerOnMakeRootAgent(this); | ||
879 | 883 | ||
884 | m_scene.EventManager.TriggerOnMakeRootAgent(this); | ||
880 | } | 885 | } |
881 | 886 | ||
882 | /// <summary> | 887 | /// <summary> |
@@ -1041,7 +1046,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1041 | m_avHeight = height; | 1046 | m_avHeight = height; |
1042 | if (PhysicsActor != null && !IsChildAgent) | 1047 | if (PhysicsActor != null && !IsChildAgent) |
1043 | { | 1048 | { |
1044 | PhysicsVector SetSize = new PhysicsVector(0.45f, 0.6f, m_avHeight); | 1049 | Vector3 SetSize = new Vector3(0.45f, 0.6f, m_avHeight); |
1045 | PhysicsActor.Size = SetSize; | 1050 | PhysicsActor.Size = SetSize; |
1046 | } | 1051 | } |
1047 | } | 1052 | } |
@@ -1106,18 +1111,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
1106 | CameraConstraintActive = true; | 1111 | CameraConstraintActive = true; |
1107 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); | 1112 | //m_log.DebugFormat("[RAYCASTRESULT]: {0}, {1}, {2}, {3}", hitYN, collisionPoint, localid, distance); |
1108 | 1113 | ||
1109 | Vector3 normal = Vector3.Normalize(new Vector3(0,0,collisionPoint.Z) - collisionPoint); | 1114 | Vector3 normal = Vector3.Normalize(new Vector3(0f, 0f, collisionPoint.Z) - collisionPoint); |
1110 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); | 1115 | ControllingClient.SendCameraConstraint(new Vector4(normal.X, normal.Y, normal.Z, -1 * Vector3.Distance(new Vector3(0,0,collisionPoint.Z),collisionPoint))); |
1111 | } | 1116 | } |
1112 | else | 1117 | else |
1113 | { | 1118 | { |
1114 | if (((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | 1119 | if ((m_pos - m_lastPosition).Length() > 0.02f || |
1115 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | 1120 | (m_velocity - m_lastVelocity).Length() > 0.02f || |
1116 | || lastPhysRot != m_bodyRot)) | 1121 | m_bodyRot != m_lastRotation) |
1117 | { | 1122 | { |
1118 | if (CameraConstraintActive) | 1123 | if (CameraConstraintActive) |
1119 | { | 1124 | { |
1120 | ControllingClient.SendCameraConstraint(new Vector4(0, 0.5f, 0.9f, -3000f)); | 1125 | ControllingClient.SendCameraConstraint(new Vector4(0f, 0.5f, 0.9f, -3000f)); |
1121 | CameraConstraintActive = false; | 1126 | CameraConstraintActive = false; |
1122 | } | 1127 | } |
1123 | } | 1128 | } |
@@ -2356,6 +2361,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2356 | 2361 | ||
2357 | public override void Update() | 2362 | public override void Update() |
2358 | { | 2363 | { |
2364 | const float VELOCITY_TOLERANCE = 0.01f; | ||
2365 | const float POSITION_TOLERANCE = 10.0f; | ||
2366 | |||
2359 | SendPrimUpdates(); | 2367 | SendPrimUpdates(); |
2360 | 2368 | ||
2361 | if (m_newCoarseLocations) | 2369 | if (m_newCoarseLocations) |
@@ -2366,28 +2374,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
2366 | 2374 | ||
2367 | if (m_isChildAgent == false) | 2375 | if (m_isChildAgent == false) |
2368 | { | 2376 | { |
2369 | if (m_newForce) // user movement 'forces' (ie commands to move) | 2377 | // Throw away duplicate or insignificant updates |
2370 | { | 2378 | if (m_bodyRot != m_lastRotation || |
2371 | SendTerseUpdateToAllClients(); | 2379 | (m_velocity - m_lastVelocity).Length() > VELOCITY_TOLERANCE || |
2372 | m_updateCount = 0; | 2380 | (m_pos - m_lastPosition).Length() > POSITION_TOLERANCE) |
2373 | } | ||
2374 | else if (m_movementflag != 0) // scripted movement (?) | ||
2375 | { | ||
2376 | m_updateCount++; | ||
2377 | if (m_updateCount > 3) | ||
2378 | { | ||
2379 | SendTerseUpdateToAllClients(); | ||
2380 | m_updateCount = 0; | ||
2381 | } | ||
2382 | } | ||
2383 | else if ((Util.GetDistanceTo(lastPhysPos, AbsolutePosition) > 0.02) | ||
2384 | || (Util.GetDistanceTo(m_lastVelocity, m_velocity) > 0.02) | ||
2385 | || lastPhysRot != m_bodyRot) | ||
2386 | { | 2381 | { |
2387 | // Send Terse Update to all clients updates lastPhysPos and m_lastVelocity | ||
2388 | // doing the above assures us that we know what we sent the clients last | ||
2389 | SendTerseUpdateToAllClients(); | 2382 | SendTerseUpdateToAllClients(); |
2390 | m_updateCount = 0; | 2383 | |
2384 | // Update the "last" values | ||
2385 | m_lastPosition = m_pos; | ||
2386 | m_lastRotation = m_bodyRot; | ||
2387 | m_lastVelocity = m_velocity; | ||
2391 | } | 2388 | } |
2392 | 2389 | ||
2393 | // followed suggestion from mic bowman. reversed the two lines below. | 2390 | // followed suggestion from mic bowman. reversed the two lines below. |
@@ -2417,7 +2414,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2417 | pos.Z -= m_appearance.HipOffset; | 2414 | pos.Z -= m_appearance.HipOffset; |
2418 | 2415 | ||
2419 | remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, | 2416 | remoteClient.SendAvatarTerseUpdate(new SendAvatarTerseData(m_regionHandle, (ushort)(m_scene.TimeDilation * ushort.MaxValue), LocalId, |
2420 | pos, m_velocity, Vector3.Zero, m_rotation, Vector4.Zero, m_uuid, null, GetUpdatePriority(remoteClient))); | 2417 | pos, m_velocity, Vector3.Zero, m_bodyRot, Vector4.UnitW, m_uuid, null, GetUpdatePriority(remoteClient))); |
2421 | 2418 | ||
2422 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); | 2419 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); |
2423 | m_scene.StatsReporter.AddAgentUpdates(1); | 2420 | m_scene.StatsReporter.AddAgentUpdates(1); |
@@ -2430,15 +2427,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2430 | public void SendTerseUpdateToAllClients() | 2427 | public void SendTerseUpdateToAllClients() |
2431 | { | 2428 | { |
2432 | m_perfMonMS = Environment.TickCount; | 2429 | m_perfMonMS = Environment.TickCount; |
2433 | 2430 | ||
2434 | m_scene.ForEachClient(SendTerseUpdateToClient); | 2431 | m_scene.ForEachClient(SendTerseUpdateToClient); |
2435 | 2432 | ||
2436 | m_lastVelocity = m_velocity; | ||
2437 | lastPhysPos = AbsolutePosition; | ||
2438 | lastPhysRot = m_bodyRot; | ||
2439 | |||
2440 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); | 2433 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); |
2441 | |||
2442 | } | 2434 | } |
2443 | 2435 | ||
2444 | public void SendCoarseLocations() | 2436 | public void SendCoarseLocations() |
@@ -2517,15 +2509,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2517 | if (m_appearance.Texture == null) | 2509 | if (m_appearance.Texture == null) |
2518 | return; | 2510 | return; |
2519 | 2511 | ||
2520 | // Note: because Quaternion is a struct, it can't be null | ||
2521 | Quaternion rot = m_bodyRot; | ||
2522 | |||
2523 | Vector3 pos = m_pos; | 2512 | Vector3 pos = m_pos; |
2524 | pos.Z -= m_appearance.HipOffset; | 2513 | pos.Z -= m_appearance.HipOffset; |
2525 | 2514 | ||
2526 | remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, | 2515 | remoteAvatar.m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, |
2527 | LocalId, m_pos, m_appearance.Texture.GetBytes(), | 2516 | LocalId, pos, m_appearance.Texture.GetBytes(), |
2528 | m_parentID, rot)); | 2517 | m_parentID, m_bodyRot)); |
2529 | m_scene.StatsReporter.AddAgentUpdates(1); | 2518 | m_scene.StatsReporter.AddAgentUpdates(1); |
2530 | } | 2519 | } |
2531 | 2520 | ||
@@ -2536,9 +2525,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2536 | { | 2525 | { |
2537 | m_perfMonMS = Environment.TickCount; | 2526 | m_perfMonMS = Environment.TickCount; |
2538 | 2527 | ||
2539 | List<ScenePresence> avatars = m_scene.GetScenePresences(); | 2528 | ScenePresence[] avatars = m_scene.GetScenePresences(); |
2540 | foreach (ScenePresence avatar in avatars) | 2529 | |
2530 | for (int i = 0; i < avatars.Length; i++) | ||
2541 | { | 2531 | { |
2532 | ScenePresence avatar = avatars[i]; | ||
2533 | |||
2542 | // only send if this is the root (children are only "listening posts" in a foreign region) | 2534 | // only send if this is the root (children are only "listening posts" in a foreign region) |
2543 | if (!IsChildAgent) | 2535 | if (!IsChildAgent) |
2544 | { | 2536 | { |
@@ -2556,7 +2548,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2556 | } | 2548 | } |
2557 | } | 2549 | } |
2558 | 2550 | ||
2559 | m_scene.StatsReporter.AddAgentUpdates(avatars.Count); | 2551 | m_scene.StatsReporter.AddAgentUpdates(avatars.Length); |
2560 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); | 2552 | m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS); |
2561 | 2553 | ||
2562 | //SendAnimPack(); | 2554 | //SendAnimPack(); |
@@ -2588,14 +2580,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2588 | // the inventory arrives | 2580 | // the inventory arrives |
2589 | // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); | 2581 | // m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance); |
2590 | 2582 | ||
2591 | // Note: because Quaternion is a struct, it can't be null | ||
2592 | Quaternion rot = m_bodyRot; | ||
2593 | |||
2594 | Vector3 pos = m_pos; | 2583 | Vector3 pos = m_pos; |
2595 | pos.Z -= m_appearance.HipOffset; | 2584 | pos.Z -= m_appearance.HipOffset; |
2596 | 2585 | ||
2597 | m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, | 2586 | m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, |
2598 | m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot)); | 2587 | pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); |
2599 | 2588 | ||
2600 | if (!m_isChildAgent) | 2589 | if (!m_isChildAgent) |
2601 | { | 2590 | { |
@@ -2679,7 +2668,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2679 | { | 2668 | { |
2680 | if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) | 2669 | if (m_scene.AssetService.Get(face.TextureID.ToString()) == null) |
2681 | { | 2670 | { |
2682 | m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + (AppearanceManager.TextureIndex)j + ") for avatar " + this.Name); | 2671 | m_log.Warn("[APPEARANCE]: Missing baked texture " + face.TextureID + " (" + j + ") for avatar " + this.Name); |
2683 | this.ControllingClient.SendRebakeAvatarTextures(face.TextureID); | 2672 | this.ControllingClient.SendRebakeAvatarTextures(face.TextureID); |
2684 | } | 2673 | } |
2685 | } | 2674 | } |
@@ -2700,9 +2689,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2700 | m_startAnimationSet = true; | 2689 | m_startAnimationSet = true; |
2701 | } | 2690 | } |
2702 | 2691 | ||
2703 | Quaternion rot = m_bodyRot; | 2692 | Vector3 pos = m_pos; |
2693 | pos.Z -= m_appearance.HipOffset; | ||
2694 | |||
2704 | m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, | 2695 | m_controllingClient.SendAvatarData(new SendAvatarData(m_regionInfo.RegionHandle, m_firstname, m_lastname, m_grouptitle, m_uuid, LocalId, |
2705 | m_pos, m_appearance.Texture.GetBytes(), m_parentID, rot)); | 2696 | pos, m_appearance.Texture.GetBytes(), m_parentID, m_bodyRot)); |
2706 | 2697 | ||
2707 | } | 2698 | } |
2708 | 2699 | ||
@@ -3300,7 +3291,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3300 | /// </summary> | 3291 | /// </summary> |
3301 | public override void UpdateMovement() | 3292 | public override void UpdateMovement() |
3302 | { | 3293 | { |
3303 | m_newForce = false; | ||
3304 | lock (m_forcesList) | 3294 | lock (m_forcesList) |
3305 | { | 3295 | { |
3306 | if (m_forcesList.Count > 0) | 3296 | if (m_forcesList.Count > 0) |
@@ -3322,7 +3312,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3322 | // Ignoring this causes no movement to be sent to the physics engine... | 3312 | // Ignoring this causes no movement to be sent to the physics engine... |
3323 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! | 3313 | // which when the scene is moving at 1 frame every 10 seconds, it doesn't really matter! |
3324 | } | 3314 | } |
3325 | m_newForce = true; | ||
3326 | 3315 | ||
3327 | m_forcesList.Clear(); | 3316 | m_forcesList.Clear(); |
3328 | } | 3317 | } |
@@ -3356,20 +3345,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
3356 | 3345 | ||
3357 | PhysicsScene scene = m_scene.PhysicsScene; | 3346 | PhysicsScene scene = m_scene.PhysicsScene; |
3358 | 3347 | ||
3359 | PhysicsVector pVec = | 3348 | Vector3 pVec = AbsolutePosition; |
3360 | new PhysicsVector(AbsolutePosition.X, AbsolutePosition.Y, | ||
3361 | AbsolutePosition.Z); | ||
3362 | 3349 | ||
3363 | // Old bug where the height was in centimeters instead of meters | 3350 | // Old bug where the height was in centimeters instead of meters |
3364 | if (m_avHeight == 127.0f) | 3351 | if (m_avHeight == 127.0f) |
3365 | { | 3352 | { |
3366 | m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new PhysicsVector(0, 0, 1.56f), | 3353 | m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, new Vector3(0f, 0f, 1.56f), |
3367 | isFlying); | 3354 | isFlying); |
3368 | } | 3355 | } |
3369 | else | 3356 | else |
3370 | { | 3357 | { |
3371 | m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, | 3358 | m_physicsActor = scene.AddAvatar(Firstname + "." + Lastname, pVec, |
3372 | new PhysicsVector(0, 0, m_avHeight), isFlying); | 3359 | new Vector3(0f, 0f, m_avHeight), isFlying); |
3373 | } | 3360 | } |
3374 | scene.AddPhysicsActorTaint(m_physicsActor); | 3361 | scene.AddPhysicsActorTaint(m_physicsActor); |
3375 | //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients; | 3362 | //m_physicsActor.OnRequestTerseUpdate += SendTerseUpdateToAllClients; |
@@ -3380,7 +3367,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3380 | 3367 | ||
3381 | } | 3368 | } |
3382 | 3369 | ||
3383 | private void OutOfBoundsCall(PhysicsVector pos) | 3370 | private void OutOfBoundsCall(Vector3 pos) |
3384 | { | 3371 | { |
3385 | //bool flying = m_physicsActor.Flying; | 3372 | //bool flying = m_physicsActor.Flying; |
3386 | //RemoveFromPhysicalScene(); | 3373 | //RemoveFromPhysicalScene(); |
@@ -3603,7 +3590,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3603 | */ | 3590 | */ |
3604 | } | 3591 | } |
3605 | 3592 | ||
3606 | internal void PushForce(PhysicsVector impulse) | 3593 | internal void PushForce(Vector3 impulse) |
3607 | { | 3594 | { |
3608 | if (PhysicsActor != null) | 3595 | if (PhysicsActor != null) |
3609 | { | 3596 | { |
@@ -3866,6 +3853,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3866 | return GetPriorityByDistance(client); | 3853 | return GetPriorityByDistance(client); |
3867 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3854 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3868 | return GetPriorityByDistance(client); | 3855 | return GetPriorityByDistance(client); |
3856 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3857 | return GetPriorityByFrontBack(client); | ||
3869 | default: | 3858 | default: |
3870 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); | 3859 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined."); |
3871 | } | 3860 | } |
@@ -3887,11 +3876,34 @@ namespace OpenSim.Region.Framework.Scenes | |||
3887 | return double.NaN; | 3876 | return double.NaN; |
3888 | } | 3877 | } |
3889 | 3878 | ||
3879 | private double GetPriorityByFrontBack(IClientAPI client) | ||
3880 | { | ||
3881 | ScenePresence presence = Scene.GetScenePresence(client.AgentId); | ||
3882 | if (presence != null) | ||
3883 | { | ||
3884 | return GetPriorityByFrontBack(presence.CameraPosition, presence.CameraAtAxis); | ||
3885 | } | ||
3886 | return double.NaN; | ||
3887 | } | ||
3888 | |||
3890 | private double GetPriorityByDistance(Vector3 position) | 3889 | private double GetPriorityByDistance(Vector3 position) |
3891 | { | 3890 | { |
3892 | return Vector3.Distance(AbsolutePosition, position); | 3891 | return Vector3.Distance(AbsolutePosition, position); |
3893 | } | 3892 | } |
3894 | 3893 | ||
3894 | private double GetPriorityByFrontBack(Vector3 camPosition, Vector3 camAtAxis) | ||
3895 | { | ||
3896 | // Distance | ||
3897 | double priority = Vector3.Distance(camPosition, AbsolutePosition); | ||
3898 | |||
3899 | // Plane equation | ||
3900 | float d = -Vector3.Dot(camPosition, camAtAxis); | ||
3901 | float p = Vector3.Dot(camAtAxis, AbsolutePosition) + d; | ||
3902 | if (p < 0.0f) priority *= 2.0f; | ||
3903 | |||
3904 | return priority; | ||
3905 | } | ||
3906 | |||
3895 | private double GetSOGUpdatePriority(SceneObjectGroup sog) | 3907 | private double GetSOGUpdatePriority(SceneObjectGroup sog) |
3896 | { | 3908 | { |
3897 | switch (Scene.UpdatePrioritizationScheme) | 3909 | switch (Scene.UpdatePrioritizationScheme) |
@@ -3902,6 +3914,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3902 | return sog.GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); | 3914 | return sog.GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); |
3903 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3915 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3904 | return sog.GetPriorityBySimpleAngularDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); | 3916 | return sog.GetPriorityBySimpleAngularDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); |
3917 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3918 | return sog.GetPriorityByFrontBack(CameraPosition, CameraAtAxis); | ||
3905 | default: | 3919 | default: |
3906 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); | 3920 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); |
3907 | } | 3921 | } |
@@ -3928,6 +3942,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3928 | case Scene.UpdatePrioritizationSchemes.Distance: | 3942 | case Scene.UpdatePrioritizationSchemes.Distance: |
3929 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: | 3943 | case Scene.UpdatePrioritizationSchemes.SimpleAngularDistance: |
3930 | return GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); | 3944 | return GetPriorityByDistance((IsChildAgent) ? AbsolutePosition : CameraPosition); |
3945 | case Scenes.Scene.UpdatePrioritizationSchemes.FrontBack: | ||
3946 | return GetPriorityByFrontBack(CameraPosition, CameraAtAxis); | ||
3931 | default: | 3947 | default: |
3932 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); | 3948 | throw new InvalidOperationException("UpdatePrioritizationScheme not defined"); |
3933 | } | 3949 | } |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index df03b8d..4b0d01a 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs | |||
@@ -67,9 +67,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
67 | { | 67 | { |
68 | m_client = client; | 68 | m_client = client; |
69 | m_scene = scene; | 69 | m_scene = scene; |
70 | 70 | ||
71 | Thread loopThread = new Thread(InternalLoop); | 71 | Watchdog.StartThread(InternalLoop, "IRCClientView", ThreadPriority.Normal, false); |
72 | loopThread.Start(); | ||
73 | } | 72 | } |
74 | 73 | ||
75 | private void SendServerCommand(string command) | 74 | private void SendServerCommand(string command) |
@@ -102,7 +101,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
102 | { | 101 | { |
103 | try | 102 | try |
104 | { | 103 | { |
105 | string strbuf = ""; | 104 | string strbuf = String.Empty; |
106 | 105 | ||
107 | while (m_connected && m_client.Connected) | 106 | while (m_connected && m_client.Connected) |
108 | { | 107 | { |
@@ -140,6 +139,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
140 | } | 139 | } |
141 | 140 | ||
142 | Thread.Sleep(0); | 141 | Thread.Sleep(0); |
142 | Watchdog.UpdateThread(); | ||
143 | } | 143 | } |
144 | } | 144 | } |
145 | catch (IOException) | 145 | catch (IOException) |
@@ -156,6 +156,8 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
156 | 156 | ||
157 | m_log.Warn("[IRCd] Disconnected client."); | 157 | m_log.Warn("[IRCd] Disconnected client."); |
158 | } | 158 | } |
159 | |||
160 | Watchdog.RemoveThread(); | ||
159 | } | 161 | } |
160 | 162 | ||
161 | private void ProcessInMessage(string message, string command) | 163 | private void ProcessInMessage(string message, string command) |
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs index 91ce9f1..eb39026 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCServer.cs | |||
@@ -33,6 +33,7 @@ using System.Reflection; | |||
33 | using System.Text; | 33 | using System.Text; |
34 | using System.Threading; | 34 | using System.Threading; |
35 | using log4net; | 35 | using log4net; |
36 | using OpenSim.Framework; | ||
36 | using OpenSim.Region.Framework.Scenes; | 37 | using OpenSim.Region.Framework.Scenes; |
37 | 38 | ||
38 | namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | 39 | namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server |
@@ -56,8 +57,7 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
56 | 57 | ||
57 | m_listener.Start(50); | 58 | m_listener.Start(50); |
58 | 59 | ||
59 | Thread thread = new Thread(ListenLoop); | 60 | Watchdog.StartThread(ListenLoop, "IRCServer", ThreadPriority.Normal, false); |
60 | thread.Start(); | ||
61 | m_baseScene = baseScene; | 61 | m_baseScene = baseScene; |
62 | } | 62 | } |
63 | 63 | ||
@@ -72,7 +72,10 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
72 | while (m_running) | 72 | while (m_running) |
73 | { | 73 | { |
74 | AcceptClient(m_listener.AcceptTcpClient()); | 74 | AcceptClient(m_listener.AcceptTcpClient()); |
75 | Watchdog.UpdateThread(); | ||
75 | } | 76 | } |
77 | |||
78 | Watchdog.RemoveThread(); | ||
76 | } | 79 | } |
77 | 80 | ||
78 | private void AcceptClient(TcpClient client) | 81 | private void AcceptClient(TcpClient client) |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index b2544fa..f24869b 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | |||
@@ -94,7 +94,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
94 | } | 94 | } |
95 | private Dictionary<UUID, GroupRequestIDInfo> m_clientRequestIDInfo = new Dictionary<UUID, GroupRequestIDInfo>(); | 95 | private Dictionary<UUID, GroupRequestIDInfo> m_clientRequestIDInfo = new Dictionary<UUID, GroupRequestIDInfo>(); |
96 | private const int m_clientRequestIDFlushTimeOut = 300000; // Every 5 minutes | 96 | private const int m_clientRequestIDFlushTimeOut = 300000; // Every 5 minutes |
97 | private Timer m_clientRequestIDFlushTimer = new Timer(); | 97 | private Timer m_clientRequestIDFlushTimer; |
98 | 98 | ||
99 | 99 | ||
100 | // Configuration settings | 100 | // Configuration settings |
@@ -133,6 +133,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
133 | m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true); | 133 | m_groupNoticesEnabled = groupsConfig.GetBoolean("NoticesEnabled", true); |
134 | m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true); | 134 | m_debugEnabled = groupsConfig.GetBoolean("DebugEnabled", true); |
135 | 135 | ||
136 | m_clientRequestIDFlushTimer = new Timer(); | ||
136 | m_clientRequestIDFlushTimer.Interval = m_clientRequestIDFlushTimeOut; | 137 | m_clientRequestIDFlushTimer.Interval = m_clientRequestIDFlushTimeOut; |
137 | m_clientRequestIDFlushTimer.Elapsed += FlushClientRequestIDInfoCache; | 138 | m_clientRequestIDFlushTimer.Elapsed += FlushClientRequestIDInfoCache; |
138 | m_clientRequestIDFlushTimer.AutoReset = true; | 139 | m_clientRequestIDFlushTimer.AutoReset = true; |
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs index 16fe9e9..8d6c41d 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/CMController.cs | |||
@@ -86,7 +86,6 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
86 | /// </value> | 86 | /// </value> |
87 | Hashtable m_sceneList = Hashtable.Synchronized(new Hashtable()); | 87 | Hashtable m_sceneList = Hashtable.Synchronized(new Hashtable()); |
88 | State m_state = State.NONE; | 88 | State m_state = State.NONE; |
89 | Thread m_thread = null; | ||
90 | CMView m_view = null; | 89 | CMView m_view = null; |
91 | 90 | ||
92 | #endregion Fields | 91 | #endregion Fields |
@@ -148,10 +147,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
148 | lock (this) | 147 | lock (this) |
149 | { | 148 | { |
150 | m_estateModule = scene.RequestModuleInterface<IEstateModule>(); | 149 | m_estateModule = scene.RequestModuleInterface<IEstateModule>(); |
151 | m_thread = new Thread(MainLoop); | 150 | Watchdog.StartThread(MainLoop, "Content Management", ThreadPriority.Normal, true); |
152 | m_thread.Name = "Content Management"; | ||
153 | m_thread.IsBackground = true; | ||
154 | m_thread.Start(); | ||
155 | m_state = State.NONE; | 151 | m_state = State.NONE; |
156 | } | 152 | } |
157 | } | 153 | } |
@@ -200,6 +196,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
200 | m_log.Debug("[CONTENT MANAGEMENT] MAIN LOOP -- uuuuuuuuuh, what?"); | 196 | m_log.Debug("[CONTENT MANAGEMENT] MAIN LOOP -- uuuuuuuuuh, what?"); |
201 | break; | 197 | break; |
202 | } | 198 | } |
199 | |||
200 | Watchdog.UpdateThread(); | ||
203 | } | 201 | } |
204 | } | 202 | } |
205 | catch (Exception e) | 203 | catch (Exception e) |
@@ -209,6 +207,8 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
209 | "[CONTENT MANAGEMENT]: Content management thread terminating with exception. PLEASE REBOOT YOUR SIM - CONTENT MANAGEMENT WILL NOT BE AVAILABLE UNTIL YOU DO. Exception is {0}", | 207 | "[CONTENT MANAGEMENT]: Content management thread terminating with exception. PLEASE REBOOT YOUR SIM - CONTENT MANAGEMENT WILL NOT BE AVAILABLE UNTIL YOU DO. Exception is {0}", |
210 | e); | 208 | e); |
211 | } | 209 | } |
210 | |||
211 | Watchdog.RemoveThread(); | ||
212 | } | 212 | } |
213 | 213 | ||
214 | /// <summary> | 214 | /// <summary> |
diff --git a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs index b6513e2..1a72971 100644 --- a/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs +++ b/OpenSim/Region/OptionalModules/ContentManagementSystem/MetaEntity.cs | |||
@@ -183,10 +183,12 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
183 | public virtual void HideFromAll() | 183 | public virtual void HideFromAll() |
184 | { | 184 | { |
185 | foreach (SceneObjectPart part in m_Entity.Children.Values) | 185 | foreach (SceneObjectPart part in m_Entity.Children.Values) |
186 | m_Entity.Scene.ClientManager.ForEach( | 186 | { |
187 | m_Entity.Scene.ForEachClient( | ||
187 | delegate(IClientAPI controller) | 188 | delegate(IClientAPI controller) |
188 | { controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); } | 189 | { controller.SendKillObject(m_Entity.RegionHandle, part.LocalId); } |
189 | ); | 190 | ); |
191 | } | ||
190 | } | 192 | } |
191 | 193 | ||
192 | public void SendFullUpdate(IClientAPI client) | 194 | public void SendFullUpdate(IClientAPI client) |
@@ -202,7 +204,7 @@ namespace OpenSim.Region.OptionalModules.ContentManagement | |||
202 | 204 | ||
203 | public void SendFullUpdateToAll() | 205 | public void SendFullUpdateToAll() |
204 | { | 206 | { |
205 | m_Entity.Scene.ClientManager.ForEach( | 207 | m_Entity.Scene.ForEachClient( |
206 | delegate(IClientAPI controller) | 208 | delegate(IClientAPI controller) |
207 | { m_Entity.SendFullUpdateToClient(controller); } | 209 | { m_Entity.SendFullUpdateToClient(controller); } |
208 | ); | 210 | ); |
diff --git a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs index 292e345..1f1ebae 100644 --- a/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs +++ b/OpenSim/Region/OptionalModules/Scripting/Minimodule/SOPObject.cs | |||
@@ -525,8 +525,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
525 | { | 525 | { |
526 | get | 526 | get |
527 | { | 527 | { |
528 | PhysicsVector tmp = GetSOP().PhysActor.GeometricCenter; | 528 | Vector3 tmp = GetSOP().PhysActor.GeometricCenter; |
529 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 529 | return tmp; |
530 | } | 530 | } |
531 | } | 531 | } |
532 | 532 | ||
@@ -534,8 +534,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
534 | { | 534 | { |
535 | get | 535 | get |
536 | { | 536 | { |
537 | PhysicsVector tmp = GetSOP().PhysActor.CenterOfMass; | 537 | Vector3 tmp = GetSOP().PhysActor.CenterOfMass; |
538 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 538 | return tmp; |
539 | } | 539 | } |
540 | } | 540 | } |
541 | 541 | ||
@@ -543,15 +543,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
543 | { | 543 | { |
544 | get | 544 | get |
545 | { | 545 | { |
546 | PhysicsVector tmp = GetSOP().PhysActor.RotationalVelocity; | 546 | Vector3 tmp = GetSOP().PhysActor.RotationalVelocity; |
547 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 547 | return tmp; |
548 | } | 548 | } |
549 | set | 549 | set |
550 | { | 550 | { |
551 | if (!CanEdit()) | 551 | if (!CanEdit()) |
552 | return; | 552 | return; |
553 | 553 | ||
554 | GetSOP().PhysActor.RotationalVelocity = new PhysicsVector(value.X, value.Y, value.Z); | 554 | GetSOP().PhysActor.RotationalVelocity = value; |
555 | } | 555 | } |
556 | } | 556 | } |
557 | 557 | ||
@@ -559,15 +559,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
559 | { | 559 | { |
560 | get | 560 | get |
561 | { | 561 | { |
562 | PhysicsVector tmp = GetSOP().PhysActor.Velocity; | 562 | Vector3 tmp = GetSOP().PhysActor.Velocity; |
563 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 563 | return tmp; |
564 | } | 564 | } |
565 | set | 565 | set |
566 | { | 566 | { |
567 | if (!CanEdit()) | 567 | if (!CanEdit()) |
568 | return; | 568 | return; |
569 | 569 | ||
570 | GetSOP().PhysActor.Velocity = new PhysicsVector(value.X, value.Y, value.Z); | 570 | GetSOP().PhysActor.Velocity = value; |
571 | } | 571 | } |
572 | } | 572 | } |
573 | 573 | ||
@@ -575,15 +575,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
575 | { | 575 | { |
576 | get | 576 | get |
577 | { | 577 | { |
578 | PhysicsVector tmp = GetSOP().PhysActor.Torque; | 578 | Vector3 tmp = GetSOP().PhysActor.Torque; |
579 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 579 | return tmp; |
580 | } | 580 | } |
581 | set | 581 | set |
582 | { | 582 | { |
583 | if (!CanEdit()) | 583 | if (!CanEdit()) |
584 | return; | 584 | return; |
585 | 585 | ||
586 | GetSOP().PhysActor.Torque = new PhysicsVector(value.X, value.Y, value.Z); | 586 | GetSOP().PhysActor.Torque = value; |
587 | } | 587 | } |
588 | } | 588 | } |
589 | 589 | ||
@@ -591,8 +591,8 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
591 | { | 591 | { |
592 | get | 592 | get |
593 | { | 593 | { |
594 | PhysicsVector tmp = GetSOP().PhysActor.Acceleration; | 594 | Vector3 tmp = GetSOP().PhysActor.Acceleration; |
595 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 595 | return tmp; |
596 | } | 596 | } |
597 | } | 597 | } |
598 | 598 | ||
@@ -600,15 +600,15 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
600 | { | 600 | { |
601 | get | 601 | get |
602 | { | 602 | { |
603 | PhysicsVector tmp = GetSOP().PhysActor.Force; | 603 | Vector3 tmp = GetSOP().PhysActor.Force; |
604 | return new Vector3(tmp.X, tmp.Y, tmp.Z); | 604 | return tmp; |
605 | } | 605 | } |
606 | set | 606 | set |
607 | { | 607 | { |
608 | if (!CanEdit()) | 608 | if (!CanEdit()) |
609 | return; | 609 | return; |
610 | 610 | ||
611 | GetSOP().PhysActor.Force = new PhysicsVector(value.X, value.Y, value.Z); | 611 | GetSOP().PhysActor.Force = value; |
612 | } | 612 | } |
613 | } | 613 | } |
614 | 614 | ||
@@ -627,7 +627,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
627 | if (!CanEdit()) | 627 | if (!CanEdit()) |
628 | return; | 628 | return; |
629 | 629 | ||
630 | GetSOP().PhysActor.AddForce(new PhysicsVector(force.X, force.Y, force.Z), pushforce); | 630 | GetSOP().PhysActor.AddForce(force, pushforce); |
631 | } | 631 | } |
632 | 632 | ||
633 | public void AddAngularForce(Vector3 force, bool pushforce) | 633 | public void AddAngularForce(Vector3 force, bool pushforce) |
@@ -635,7 +635,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
635 | if (!CanEdit()) | 635 | if (!CanEdit()) |
636 | return; | 636 | return; |
637 | 637 | ||
638 | GetSOP().PhysActor.AddAngularForce(new PhysicsVector(force.X, force.Y, force.Z), pushforce); | 638 | GetSOP().PhysActor.AddAngularForce(force, pushforce); |
639 | } | 639 | } |
640 | 640 | ||
641 | public void SetMomentum(Vector3 momentum) | 641 | public void SetMomentum(Vector3 momentum) |
@@ -643,7 +643,7 @@ namespace OpenSim.Region.OptionalModules.Scripting.Minimodule | |||
643 | if (!CanEdit()) | 643 | if (!CanEdit()) |
644 | return; | 644 | return; |
645 | 645 | ||
646 | GetSOP().PhysActor.SetMomentum(new PhysicsVector(momentum.X, momentum.Y, momentum.Z)); | 646 | GetSOP().PhysActor.SetMomentum(momentum); |
647 | } | 647 | } |
648 | 648 | ||
649 | #endregion | 649 | #endregion |
diff --git a/OpenSim/Region/OptionalModules/SvnSerialiser/SvnBackupModule.cs b/OpenSim/Region/OptionalModules/SvnSerialiser/SvnBackupModule.cs index fc1c608..3490a8b 100644 --- a/OpenSim/Region/OptionalModules/SvnSerialiser/SvnBackupModule.cs +++ b/OpenSim/Region/OptionalModules/SvnSerialiser/SvnBackupModule.cs | |||
@@ -45,13 +45,13 @@ namespace OpenSim.Region.Modules.SvnSerialiser | |||
45 | public class SvnBackupModule : IRegionModule | 45 | public class SvnBackupModule : IRegionModule |
46 | { | 46 | { |
47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 47 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
48 | private readonly List<Scene> m_scenes = new List<Scene>(); | ||
49 | private readonly Timer m_timer = new Timer(); | ||
50 | 48 | ||
51 | private bool m_enabled = false; | 49 | private List<Scene> m_scenes; |
52 | private bool m_installBackupOnLoad = false; | 50 | private Timer m_timer; |
51 | private bool m_enabled; | ||
52 | private bool m_installBackupOnLoad; | ||
53 | private IRegionSerialiserModule m_serialiser; | 53 | private IRegionSerialiserModule m_serialiser; |
54 | private bool m_svnAutoSave = false; | 54 | private bool m_svnAutoSave; |
55 | private SvnClient m_svnClient; | 55 | private SvnClient m_svnClient; |
56 | private string m_svndir = "SVNmodule" + Slash.DirectorySeparatorChar + "repo"; | 56 | private string m_svndir = "SVNmodule" + Slash.DirectorySeparatorChar + "repo"; |
57 | private string m_svnpass = "password"; | 57 | private string m_svnpass = "password"; |
@@ -204,6 +204,9 @@ namespace OpenSim.Region.Modules.SvnSerialiser | |||
204 | 204 | ||
205 | public void Initialise(Scene scene, IConfigSource source) | 205 | public void Initialise(Scene scene, IConfigSource source) |
206 | { | 206 | { |
207 | m_scenes = new List<Scene>(); | ||
208 | m_timer = new Timer(); | ||
209 | |||
207 | try | 210 | try |
208 | { | 211 | { |
209 | if (!source.Configs["SVN"].GetBoolean("Enabled", false)) | 212 | if (!source.Configs["SVN"].GetBoolean("Enabled", false)) |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs index 41a6255..ac39a53 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs | |||
@@ -41,12 +41,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
41 | { | 41 | { |
42 | // private const bool m_enabled = false; | 42 | // private const bool m_enabled = false; |
43 | 43 | ||
44 | private Mutex m_createMutex = new Mutex(false); | 44 | private Mutex m_createMutex; |
45 | 45 | private Timer m_timer; | |
46 | private Timer m_timer = new Timer(500); | ||
47 | 46 | ||
48 | private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>(); | 47 | private Dictionary<UUID,NPCAvatar> m_avatars = new Dictionary<UUID, NPCAvatar>(); |
49 | |||
50 | private Dictionary<UUID,AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>(); | 48 | private Dictionary<UUID,AvatarAppearance> m_appearanceCache = new Dictionary<UUID, AvatarAppearance>(); |
51 | 49 | ||
52 | // Timer vars. | 50 | // Timer vars. |
@@ -138,10 +136,13 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
138 | 136 | ||
139 | public void Initialise(Scene scene, IConfigSource source) | 137 | public void Initialise(Scene scene, IConfigSource source) |
140 | { | 138 | { |
141 | scene.RegisterModuleInterface<INPCModule>(this); | 139 | m_createMutex = new Mutex(false); |
142 | 140 | ||
141 | m_timer = new Timer(500); | ||
143 | m_timer.Elapsed += m_timer_Elapsed; | 142 | m_timer.Elapsed += m_timer_Elapsed; |
144 | m_timer.Start(); | 143 | m_timer.Start(); |
144 | |||
145 | scene.RegisterModuleInterface<INPCModule>(this); | ||
145 | } | 146 | } |
146 | 147 | ||
147 | void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) | 148 | void m_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) |
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs index 2b905b6..f411dd7 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsActor.cs | |||
@@ -36,20 +36,16 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
36 | { | 36 | { |
37 | public class BasicActor : PhysicsActor | 37 | public class BasicActor : PhysicsActor |
38 | { | 38 | { |
39 | private PhysicsVector _position; | 39 | private Vector3 _position; |
40 | private PhysicsVector _velocity; | 40 | private Vector3 _velocity; |
41 | private PhysicsVector _acceleration; | 41 | private Vector3 _acceleration; |
42 | private PhysicsVector _size; | 42 | private Vector3 _size; |
43 | private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; | 43 | private Vector3 m_rotationalVelocity; |
44 | private bool flying; | 44 | private bool flying; |
45 | private bool iscolliding; | 45 | private bool iscolliding; |
46 | 46 | ||
47 | public BasicActor() | 47 | public BasicActor() |
48 | { | 48 | { |
49 | _velocity = new PhysicsVector(); | ||
50 | _position = new PhysicsVector(); | ||
51 | _acceleration = new PhysicsVector(); | ||
52 | _size = new PhysicsVector(); | ||
53 | } | 49 | } |
54 | 50 | ||
55 | public override int PhysicsActorType | 51 | public override int PhysicsActorType |
@@ -58,7 +54,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
58 | set { return; } | 54 | set { return; } |
59 | } | 55 | } |
60 | 56 | ||
61 | public override PhysicsVector RotationalVelocity | 57 | public override Vector3 RotationalVelocity |
62 | { | 58 | { |
63 | get { return m_rotationalVelocity; } | 59 | get { return m_rotationalVelocity; } |
64 | set { m_rotationalVelocity = value; } | 60 | set { m_rotationalVelocity = value; } |
@@ -137,13 +133,13 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
137 | get { return false; } | 133 | get { return false; } |
138 | } | 134 | } |
139 | 135 | ||
140 | public override PhysicsVector Position | 136 | public override Vector3 Position |
141 | { | 137 | { |
142 | get { return _position; } | 138 | get { return _position; } |
143 | set { _position = value; } | 139 | set { _position = value; } |
144 | } | 140 | } |
145 | 141 | ||
146 | public override PhysicsVector Size | 142 | public override Vector3 Size |
147 | { | 143 | { |
148 | get { return _size; } | 144 | get { return _size; } |
149 | set { | 145 | set { |
@@ -162,9 +158,9 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
162 | get { return 0f; } | 158 | get { return 0f; } |
163 | } | 159 | } |
164 | 160 | ||
165 | public override PhysicsVector Force | 161 | public override Vector3 Force |
166 | { | 162 | { |
167 | get { return PhysicsVector.Zero; } | 163 | get { return Vector3.Zero; } |
168 | set { return; } | 164 | set { return; } |
169 | } | 165 | } |
170 | 166 | ||
@@ -179,7 +175,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
179 | 175 | ||
180 | } | 176 | } |
181 | 177 | ||
182 | public override void VehicleVectorParam(int param, PhysicsVector value) | 178 | public override void VehicleVectorParam(int param, Vector3 value) |
183 | { | 179 | { |
184 | 180 | ||
185 | } | 181 | } |
@@ -194,25 +190,25 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
194 | 190 | ||
195 | } | 191 | } |
196 | 192 | ||
197 | public override PhysicsVector CenterOfMass | 193 | public override Vector3 CenterOfMass |
198 | { | 194 | { |
199 | get { return PhysicsVector.Zero; } | 195 | get { return Vector3.Zero; } |
200 | } | 196 | } |
201 | 197 | ||
202 | public override PhysicsVector GeometricCenter | 198 | public override Vector3 GeometricCenter |
203 | { | 199 | { |
204 | get { return PhysicsVector.Zero; } | 200 | get { return Vector3.Zero; } |
205 | } | 201 | } |
206 | 202 | ||
207 | public override PhysicsVector Velocity | 203 | public override Vector3 Velocity |
208 | { | 204 | { |
209 | get { return _velocity; } | 205 | get { return _velocity; } |
210 | set { _velocity = value; } | 206 | set { _velocity = value; } |
211 | } | 207 | } |
212 | 208 | ||
213 | public override PhysicsVector Torque | 209 | public override Vector3 Torque |
214 | { | 210 | { |
215 | get { return PhysicsVector.Zero; } | 211 | get { return Vector3.Zero; } |
216 | set { return; } | 212 | set { return; } |
217 | } | 213 | } |
218 | 214 | ||
@@ -228,7 +224,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
228 | set { } | 224 | set { } |
229 | } | 225 | } |
230 | 226 | ||
231 | public override PhysicsVector Acceleration | 227 | public override Vector3 Acceleration |
232 | { | 228 | { |
233 | get { return _acceleration; } | 229 | get { return _acceleration; } |
234 | } | 230 | } |
@@ -247,24 +243,24 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
247 | { | 243 | { |
248 | } | 244 | } |
249 | 245 | ||
250 | public override void LockAngularMotion(PhysicsVector axis) | 246 | public override void LockAngularMotion(Vector3 axis) |
251 | { | 247 | { |
252 | } | 248 | } |
253 | 249 | ||
254 | public void SetAcceleration(PhysicsVector accel) | 250 | public void SetAcceleration(Vector3 accel) |
255 | { | 251 | { |
256 | _acceleration = accel; | 252 | _acceleration = accel; |
257 | } | 253 | } |
258 | 254 | ||
259 | public override void AddForce(PhysicsVector force, bool pushforce) | 255 | public override void AddForce(Vector3 force, bool pushforce) |
260 | { | 256 | { |
261 | } | 257 | } |
262 | 258 | ||
263 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 259 | public override void AddAngularForce(Vector3 force, bool pushforce) |
264 | { | 260 | { |
265 | } | 261 | } |
266 | 262 | ||
267 | public override void SetMomentum(PhysicsVector momentum) | 263 | public override void SetMomentum(Vector3 momentum) |
268 | { | 264 | { |
269 | } | 265 | } |
270 | 266 | ||
@@ -272,7 +268,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
272 | { | 268 | { |
273 | } | 269 | } |
274 | 270 | ||
275 | public override PhysicsVector PIDTarget | 271 | public override Vector3 PIDTarget |
276 | { | 272 | { |
277 | set { return; } | 273 | set { return; } |
278 | } | 274 | } |
diff --git a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs index 66bd099..b6e1cb4 100644 --- a/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs +++ b/OpenSim/Region/Physics/BasicPhysicsPlugin/BasicPhysicsScene.cs | |||
@@ -54,7 +54,7 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
54 | { | 54 | { |
55 | 55 | ||
56 | } | 56 | } |
57 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 57 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
58 | { | 58 | { |
59 | BasicActor act = new BasicActor(); | 59 | BasicActor act = new BasicActor(); |
60 | act.Position = position; | 60 | act.Position = position; |
@@ -77,20 +77,20 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
77 | } | 77 | } |
78 | 78 | ||
79 | /* | 79 | /* |
80 | public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) | 80 | public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation) |
81 | { | 81 | { |
82 | return null; | 82 | return null; |
83 | } | 83 | } |
84 | */ | 84 | */ |
85 | 85 | ||
86 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 86 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
87 | PhysicsVector size, Quaternion rotation) | 87 | Vector3 size, Quaternion rotation) |
88 | { | 88 | { |
89 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 89 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
90 | } | 90 | } |
91 | 91 | ||
92 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 92 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
93 | PhysicsVector size, Quaternion rotation, bool isPhysical) | 93 | Vector3 size, Quaternion rotation, bool isPhysical) |
94 | { | 94 | { |
95 | return null; | 95 | return null; |
96 | } | 96 | } |
@@ -105,26 +105,28 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
105 | for (int i = 0; i < _actors.Count; ++i) | 105 | for (int i = 0; i < _actors.Count; ++i) |
106 | { | 106 | { |
107 | BasicActor actor = _actors[i]; | 107 | BasicActor actor = _actors[i]; |
108 | Vector3 actorPosition = actor.Position; | ||
109 | Vector3 actorVelocity = actor.Velocity; | ||
108 | 110 | ||
109 | actor.Position.X += actor.Velocity.X*timeStep; | 111 | actorPosition.X += actor.Velocity.X*timeStep; |
110 | actor.Position.Y += actor.Velocity.Y*timeStep; | 112 | actorPosition.Y += actor.Velocity.Y*timeStep; |
111 | 113 | ||
112 | if (actor.Position.Y < 0) | 114 | if (actor.Position.Y < 0) |
113 | { | 115 | { |
114 | actor.Position.Y = 0.1F; | 116 | actorPosition.Y = 0.1F; |
115 | } | 117 | } |
116 | else if (actor.Position.Y >= Constants.RegionSize) | 118 | else if (actor.Position.Y >= Constants.RegionSize) |
117 | { | 119 | { |
118 | actor.Position.Y = ((int)Constants.RegionSize - 0.1f); | 120 | actorPosition.Y = ((int)Constants.RegionSize - 0.1f); |
119 | } | 121 | } |
120 | 122 | ||
121 | if (actor.Position.X < 0) | 123 | if (actor.Position.X < 0) |
122 | { | 124 | { |
123 | actor.Position.X = 0.1F; | 125 | actorPosition.X = 0.1F; |
124 | } | 126 | } |
125 | else if (actor.Position.X >= Constants.RegionSize) | 127 | else if (actor.Position.X >= Constants.RegionSize) |
126 | { | 128 | { |
127 | actor.Position.X = ((int)Constants.RegionSize - 0.1f); | 129 | actorPosition.X = ((int)Constants.RegionSize - 0.1f); |
128 | } | 130 | } |
129 | 131 | ||
130 | float height = _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + actor.Size.Z; | 132 | float height = _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + actor.Size.Z; |
@@ -133,23 +135,27 @@ namespace OpenSim.Region.Physics.BasicPhysicsPlugin | |||
133 | if (actor.Position.Z + (actor.Velocity.Z*timeStep) < | 135 | if (actor.Position.Z + (actor.Velocity.Z*timeStep) < |
134 | _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + 2) | 136 | _heightMap[(int)actor.Position.Y * Constants.RegionSize + (int)actor.Position.X] + 2) |
135 | { | 137 | { |
136 | actor.Position.Z = height; | 138 | actorPosition.Z = height; |
137 | actor.Velocity.Z = 0; | 139 | actorVelocity.Z = 0; |
138 | actor.IsColliding = true; | 140 | actor.IsColliding = true; |
139 | } | 141 | } |
140 | else | 142 | else |
141 | { | 143 | { |
142 | actor.Position.Z += actor.Velocity.Z*timeStep; | 144 | actorPosition.Z += actor.Velocity.Z*timeStep; |
143 | actor.IsColliding = false; | 145 | actor.IsColliding = false; |
144 | } | 146 | } |
145 | } | 147 | } |
146 | else | 148 | else |
147 | { | 149 | { |
148 | actor.Position.Z = height; | 150 | actorPosition.Z = height; |
149 | actor.Velocity.Z = 0; | 151 | actorVelocity.Z = 0; |
150 | actor.IsColliding = true; | 152 | actor.IsColliding = true; |
151 | } | 153 | } |
154 | |||
155 | actor.Position = actorPosition; | ||
156 | actor.Velocity = actorVelocity; | ||
152 | } | 157 | } |
158 | |||
153 | return fps; | 159 | return fps; |
154 | } | 160 | } |
155 | 161 | ||
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs index d7aed3c..98681d6 100644 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs +++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETCharacter.cs | |||
@@ -60,15 +60,15 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
60 | private btQuaternion m_bodyOrientation; | 60 | private btQuaternion m_bodyOrientation; |
61 | private btDefaultMotionState m_bodyMotionState; | 61 | private btDefaultMotionState m_bodyMotionState; |
62 | private btGeneric6DofConstraint m_aMotor; | 62 | private btGeneric6DofConstraint m_aMotor; |
63 | // private PhysicsVector m_movementComparision; | 63 | // private Vector3 m_movementComparision; |
64 | private PhysicsVector m_position; | 64 | private Vector3 m_position; |
65 | private PhysicsVector m_zeroPosition; | 65 | private Vector3 m_zeroPosition; |
66 | private bool m_zeroFlag = false; | 66 | private bool m_zeroFlag = false; |
67 | private bool m_lastUpdateSent = false; | 67 | private bool m_lastUpdateSent = false; |
68 | private PhysicsVector m_velocity; | 68 | private Vector3 m_velocity; |
69 | private PhysicsVector m_target_velocity; | 69 | private Vector3 m_target_velocity; |
70 | private PhysicsVector m_acceleration; | 70 | private Vector3 m_acceleration; |
71 | private PhysicsVector m_rotationalVelocity; | 71 | private Vector3 m_rotationalVelocity; |
72 | private bool m_pidControllerActive = true; | 72 | private bool m_pidControllerActive = true; |
73 | public float PID_D = 80.0f; | 73 | public float PID_D = 80.0f; |
74 | public float PID_P = 90.0f; | 74 | public float PID_P = 90.0f; |
@@ -96,8 +96,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
96 | private float m_tainted_CAPSULE_LENGTH; // set when the capsule length changes. | 96 | private float m_tainted_CAPSULE_LENGTH; // set when the capsule length changes. |
97 | private bool m_taintRemove = false; | 97 | private bool m_taintRemove = false; |
98 | // private bool m_taintedPosition = false; | 98 | // private bool m_taintedPosition = false; |
99 | // private PhysicsVector m_taintedPosition_value; | 99 | // private Vector3 m_taintedPosition_value; |
100 | private PhysicsVector m_taintedForce; | 100 | private Vector3 m_taintedForce; |
101 | 101 | ||
102 | private float m_buoyancy = 0f; | 102 | private float m_buoyancy = 0f; |
103 | 103 | ||
@@ -115,14 +115,10 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
115 | public int m_eventsubscription = 0; | 115 | public int m_eventsubscription = 0; |
116 | // private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); | 116 | // private CollisionEventUpdate CollisionEventsThisFrame = new CollisionEventUpdate(); |
117 | 117 | ||
118 | public BulletDotNETCharacter(string avName, BulletDotNETScene parent_scene, PhysicsVector pos, PhysicsVector size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) | 118 | 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) |
119 | { | 119 | { |
120 | m_taintedForce = new PhysicsVector(); | ||
121 | m_velocity = new PhysicsVector(); | ||
122 | m_target_velocity = new PhysicsVector(); | ||
123 | m_position = pos; | 120 | m_position = pos; |
124 | m_zeroPosition = new PhysicsVector(pos.X, pos.Y, pos.Z); // this is a class, not a struct. Must make new, or m_zeroPosition will == position regardless | 121 | m_zeroPosition = pos; |
125 | m_acceleration = new PhysicsVector(); | ||
126 | m_parent_scene = parent_scene; | 122 | m_parent_scene = parent_scene; |
127 | PID_D = pid_d; | 123 | PID_D = pid_d; |
128 | PID_P = pid_p; | 124 | PID_P = pid_p; |
@@ -161,9 +157,6 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
161 | tempTrans1 = new btTransform(tempQuat1, tempVector1); | 157 | tempTrans1 = new btTransform(tempQuat1, tempVector1); |
162 | // m_movementComparision = new PhysicsVector(0, 0, 0); | 158 | // m_movementComparision = new PhysicsVector(0, 0, 0); |
163 | m_CapsuleOrientationAxis = new btVector3(1, 0, 1); | 159 | m_CapsuleOrientationAxis = new btVector3(1, 0, 1); |
164 | |||
165 | |||
166 | |||
167 | } | 160 | } |
168 | 161 | ||
169 | /// <summary> | 162 | /// <summary> |
@@ -254,18 +247,18 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
254 | get { return m_zeroFlag; } | 247 | get { return m_zeroFlag; } |
255 | } | 248 | } |
256 | 249 | ||
257 | public override PhysicsVector Size | 250 | public override Vector3 Size |
258 | { | 251 | { |
259 | get { return new PhysicsVector(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); } | 252 | get { return new Vector3(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); } |
260 | set | 253 | set |
261 | { | 254 | { |
262 | m_pidControllerActive = true; | 255 | m_pidControllerActive = true; |
263 | 256 | ||
264 | PhysicsVector SetSize = value; | 257 | Vector3 SetSize = value; |
265 | m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; | 258 | m_tainted_CAPSULE_LENGTH = (SetSize.Z * 1.15f) - CAPSULE_RADIUS * 2.0f; |
266 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); | 259 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); |
267 | 260 | ||
268 | Velocity = new PhysicsVector(0f, 0f, 0f); | 261 | Velocity = Vector3.Zero; |
269 | 262 | ||
270 | m_parent_scene.AddPhysicsActorTaint(this); | 263 | m_parent_scene.AddPhysicsActorTaint(this); |
271 | } | 264 | } |
@@ -317,12 +310,12 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
317 | 310 | ||
318 | } | 311 | } |
319 | 312 | ||
320 | public override void LockAngularMotion(PhysicsVector axis) | 313 | public override void LockAngularMotion(Vector3 axis) |
321 | { | 314 | { |
322 | 315 | ||
323 | } | 316 | } |
324 | 317 | ||
325 | public override PhysicsVector Position | 318 | public override Vector3 Position |
326 | { | 319 | { |
327 | get { return m_position; } | 320 | get { return m_position; } |
328 | set | 321 | set |
@@ -342,9 +335,9 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
342 | } | 335 | } |
343 | } | 336 | } |
344 | 337 | ||
345 | public override PhysicsVector Force | 338 | public override Vector3 Force |
346 | { | 339 | { |
347 | get { return new PhysicsVector(m_target_velocity.X, m_target_velocity.Y, m_target_velocity.Z); } | 340 | get { return m_target_velocity; } |
348 | set { return; } | 341 | set { return; } |
349 | } | 342 | } |
350 | 343 | ||
@@ -359,7 +352,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
359 | 352 | ||
360 | } | 353 | } |
361 | 354 | ||
362 | public override void VehicleVectorParam(int param, PhysicsVector value) | 355 | public override void VehicleVectorParam(int param, Vector3 value) |
363 | { | 356 | { |
364 | 357 | ||
365 | } | 358 | } |
@@ -374,23 +367,22 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
374 | 367 | ||
375 | } | 368 | } |
376 | 369 | ||
377 | public override PhysicsVector GeometricCenter | 370 | public override Vector3 GeometricCenter |
378 | { | 371 | { |
379 | get { return PhysicsVector.Zero; } | 372 | get { return Vector3.Zero; } |
380 | } | 373 | } |
381 | 374 | ||
382 | public override PhysicsVector CenterOfMass | 375 | public override Vector3 CenterOfMass |
383 | { | 376 | { |
384 | get { return PhysicsVector.Zero; } | 377 | get { return Vector3.Zero; } |
385 | } | 378 | } |
386 | 379 | ||
387 | public override PhysicsVector Velocity | 380 | public override Vector3 Velocity |
388 | { | 381 | { |
389 | get | 382 | get |
390 | { | 383 | { |
391 | // There's a problem with PhysicsVector.Zero! Don't Use it Here! | ||
392 | if (m_zeroFlag) | 384 | if (m_zeroFlag) |
393 | return new PhysicsVector(0f, 0f, 0f); | 385 | return Vector3.Zero; |
394 | m_lastUpdateSent = false; | 386 | m_lastUpdateSent = false; |
395 | return m_velocity; | 387 | return m_velocity; |
396 | } | 388 | } |
@@ -401,9 +393,9 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
401 | } | 393 | } |
402 | } | 394 | } |
403 | 395 | ||
404 | public override PhysicsVector Torque | 396 | public override Vector3 Torque |
405 | { | 397 | { |
406 | get { return PhysicsVector.Zero; } | 398 | get { return Vector3.Zero; } |
407 | set { return; } | 399 | set { return; } |
408 | } | 400 | } |
409 | 401 | ||
@@ -413,7 +405,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
413 | set { } | 405 | set { } |
414 | } | 406 | } |
415 | 407 | ||
416 | public override PhysicsVector Acceleration | 408 | public override Vector3 Acceleration |
417 | { | 409 | { |
418 | get { return m_acceleration; } | 410 | get { return m_acceleration; } |
419 | } | 411 | } |
@@ -586,7 +578,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
586 | set { return; } | 578 | set { return; } |
587 | } | 579 | } |
588 | 580 | ||
589 | public override PhysicsVector RotationalVelocity | 581 | public override Vector3 RotationalVelocity |
590 | { | 582 | { |
591 | get { return m_rotationalVelocity; } | 583 | get { return m_rotationalVelocity; } |
592 | set { m_rotationalVelocity = value; } | 584 | set { m_rotationalVelocity = value; } |
@@ -604,7 +596,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
604 | set { m_buoyancy = value; } | 596 | set { m_buoyancy = value; } |
605 | } | 597 | } |
606 | 598 | ||
607 | public override PhysicsVector PIDTarget { set { return; } } | 599 | public override Vector3 PIDTarget { set { return; } } |
608 | public override bool PIDActive { set { return; } } | 600 | public override bool PIDActive { set { return; } } |
609 | public override float PIDTau { set { return; } } | 601 | public override float PIDTau { set { return; } } |
610 | 602 | ||
@@ -640,7 +632,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
640 | /// </summary> | 632 | /// </summary> |
641 | /// <param name="force"></param> | 633 | /// <param name="force"></param> |
642 | /// <param name="pushforce">Is this a push by a script?</param> | 634 | /// <param name="pushforce">Is this a push by a script?</param> |
643 | public override void AddForce(PhysicsVector force, bool pushforce) | 635 | public override void AddForce(Vector3 force, bool pushforce) |
644 | { | 636 | { |
645 | if (pushforce) | 637 | if (pushforce) |
646 | { | 638 | { |
@@ -662,7 +654,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
662 | //m_lastUpdateSent = false; | 654 | //m_lastUpdateSent = false; |
663 | } | 655 | } |
664 | 656 | ||
665 | public void doForce(PhysicsVector force, bool now) | 657 | public void doForce(Vector3 force, bool now) |
666 | { | 658 | { |
667 | 659 | ||
668 | tempVector3.setValue(force.X, force.Y, force.Z); | 660 | tempVector3.setValue(force.X, force.Y, force.Z); |
@@ -677,7 +669,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
677 | } | 669 | } |
678 | } | 670 | } |
679 | 671 | ||
680 | public void doImpulse(PhysicsVector force, bool now) | 672 | public void doImpulse(Vector3 force, bool now) |
681 | { | 673 | { |
682 | 674 | ||
683 | tempVector3.setValue(force.X, force.Y, force.Z); | 675 | tempVector3.setValue(force.X, force.Y, force.Z); |
@@ -692,12 +684,12 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
692 | } | 684 | } |
693 | } | 685 | } |
694 | 686 | ||
695 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 687 | public override void AddAngularForce(Vector3 force, bool pushforce) |
696 | { | 688 | { |
697 | 689 | ||
698 | } | 690 | } |
699 | 691 | ||
700 | public override void SetMomentum(PhysicsVector momentum) | 692 | public override void SetMomentum(Vector3 momentum) |
701 | { | 693 | { |
702 | 694 | ||
703 | } | 695 | } |
@@ -814,7 +806,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
814 | 806 | ||
815 | AvatarGeomAndBodyCreation(m_position.X, m_position.Y, | 807 | AvatarGeomAndBodyCreation(m_position.X, m_position.Y, |
816 | m_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2)); | 808 | m_position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2)); |
817 | Velocity = new PhysicsVector(0f, 0f, 0f); | 809 | Velocity = Vector3.Zero; |
818 | 810 | ||
819 | } | 811 | } |
820 | else | 812 | else |
@@ -858,9 +850,9 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
858 | } | 850 | } |
859 | //PidStatus = true; | 851 | //PidStatus = true; |
860 | 852 | ||
861 | PhysicsVector vec = new PhysicsVector(); | 853 | Vector3 vec = Vector3.Zero; |
862 | 854 | ||
863 | PhysicsVector vel = new PhysicsVector(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); | 855 | Vector3 vel = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); |
864 | 856 | ||
865 | float movementdivisor = 1f; | 857 | float movementdivisor = 1f; |
866 | 858 | ||
@@ -891,7 +883,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
891 | // Avatar to Avatar collisions | 883 | // Avatar to Avatar collisions |
892 | // Prim to avatar collisions | 884 | // Prim to avatar collisions |
893 | 885 | ||
894 | PhysicsVector pos = new PhysicsVector(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); | 886 | Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); |
895 | vec.X = (m_target_velocity.X - vel.X) * (PID_D) + (m_zeroPosition.X - pos.X) * (PID_P * 2); | 887 | vec.X = (m_target_velocity.X - vel.X) * (PID_D) + (m_zeroPosition.X - pos.X) * (PID_P * 2); |
896 | vec.Y = (m_target_velocity.Y - vel.Y) * (PID_D) + (m_zeroPosition.Y - pos.Y) * (PID_P * 2); | 888 | vec.Y = (m_target_velocity.Y - vel.Y) * (PID_D) + (m_zeroPosition.Y - pos.Y) * (PID_P * 2); |
897 | if (m_flying) | 889 | if (m_flying) |
@@ -933,7 +925,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
933 | { | 925 | { |
934 | // We're colliding with something and we're not flying but we're moving | 926 | // We're colliding with something and we're not flying but we're moving |
935 | // This means we're walking or running. | 927 | // This means we're walking or running. |
936 | PhysicsVector pos = new PhysicsVector(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); | 928 | Vector3 pos = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); |
937 | vec.Z = (m_target_velocity.Z - vel.Z) * PID_D + (m_zeroPosition.Z - pos.Z) * PID_P; | 929 | vec.Z = (m_target_velocity.Z - vel.Z) * PID_D + (m_zeroPosition.Z - pos.Z) * PID_P; |
938 | if (m_target_velocity.X > 0) | 930 | if (m_target_velocity.X > 0) |
939 | { | 931 | { |
@@ -1022,7 +1014,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1022 | tempVector2 = Body.getInterpolationLinearVelocity(); | 1014 | tempVector2 = Body.getInterpolationLinearVelocity(); |
1023 | 1015 | ||
1024 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! | 1016 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! |
1025 | PhysicsVector vec = new PhysicsVector(tempVector1.getX(),tempVector1.getY(),tempVector1.getZ()); | 1017 | Vector3 vec = new Vector3(tempVector1.getX(), tempVector1.getY(), tempVector1.getZ()); |
1026 | 1018 | ||
1027 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) | 1019 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) |
1028 | if (vec.X < -10.0f) vec.X = 0.0f; | 1020 | if (vec.X < -10.0f) vec.X = 0.0f; |
@@ -1054,7 +1046,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1054 | else | 1046 | else |
1055 | { | 1047 | { |
1056 | m_lastUpdateSent = false; | 1048 | m_lastUpdateSent = false; |
1057 | vec = new PhysicsVector(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); | 1049 | vec = new Vector3(tempVector2.getX(), tempVector2.getY(), tempVector2.getZ()); |
1058 | m_velocity.X = (vec.X); | 1050 | m_velocity.X = (vec.X); |
1059 | m_velocity.Y = (vec.Y); | 1051 | m_velocity.Y = (vec.Y); |
1060 | 1052 | ||
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs index 977b463..d931f126 100644 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs +++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETPrim.cs | |||
@@ -43,44 +43,43 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
43 | { | 43 | { |
44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 44 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
45 | 45 | ||
46 | private PhysicsVector _position; | 46 | private Vector3 _position; |
47 | private PhysicsVector m_zeroPosition; | 47 | private Vector3 m_zeroPosition; |
48 | private PhysicsVector _velocity; | 48 | private Vector3 _velocity; |
49 | private PhysicsVector _torque = new PhysicsVector(0, 0, 0); | 49 | private Vector3 _torque; |
50 | private PhysicsVector m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f); | 50 | private Vector3 m_lastVelocity; |
51 | private PhysicsVector m_lastposition = new PhysicsVector(0.0f, 0.0f, 0.0f); | 51 | private Vector3 m_lastposition; |
52 | private Quaternion m_lastorientation = new Quaternion(); | 52 | private Quaternion m_lastorientation = Quaternion.Identity; |
53 | private PhysicsVector m_rotationalVelocity; | 53 | private Vector3 m_rotationalVelocity; |
54 | private PhysicsVector _size; | 54 | private Vector3 _size; |
55 | private PhysicsVector _acceleration; | 55 | private Vector3 _acceleration; |
56 | // private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f); | 56 | // private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f); |
57 | private Quaternion _orientation; | 57 | private Quaternion _orientation; |
58 | private PhysicsVector m_taintposition; | 58 | private Vector3 m_taintposition; |
59 | private PhysicsVector m_taintsize; | 59 | private Vector3 m_taintsize; |
60 | private PhysicsVector m_taintVelocity = new PhysicsVector(0, 0, 0); | 60 | private Vector3 m_taintVelocity; |
61 | private PhysicsVector m_taintTorque = new PhysicsVector(0, 0, 0); | 61 | private Vector3 m_taintTorque; |
62 | private Quaternion m_taintrot; | 62 | private Quaternion m_taintrot; |
63 | private PhysicsVector m_angularlock = new PhysicsVector(1f, 1f, 1f); | 63 | private Vector3 m_angularlock = Vector3.One; |
64 | private PhysicsVector m_taintAngularLock = new PhysicsVector(1f, 1f, 1f); | 64 | private Vector3 m_taintAngularLock = Vector3.One; |
65 | // private btGeneric6DofConstraint Amotor; | 65 | // private btGeneric6DofConstraint Amotor; |
66 | 66 | ||
67 | private PhysicsVector m_PIDTarget = new PhysicsVector(0, 0, 0); | 67 | private Vector3 m_PIDTarget; |
68 | private float m_PIDTau = 0f; | 68 | private float m_PIDTau; |
69 | private float m_PIDHoverHeight = 0f; | 69 | private float m_PIDHoverHeight; |
70 | private float m_PIDHoverTau = 0f; | 70 | private float m_PIDHoverTau; |
71 | private bool m_useHoverPID = false; | 71 | private bool m_useHoverPID; |
72 | private PIDHoverType m_PIDHoverType = PIDHoverType.Ground; | 72 | private PIDHoverType m_PIDHoverType = PIDHoverType.Ground; |
73 | private float m_targetHoverHeight = 0f; | 73 | private float m_targetHoverHeight; |
74 | private float m_groundHeight = 0f; | 74 | private float m_groundHeight; |
75 | private float m_waterHeight = 0f; | 75 | private float m_waterHeight; |
76 | private float PID_D = 35f; | 76 | private float PID_D = 35f; |
77 | private float PID_G = 25f; | 77 | private float PID_G = 25f; |
78 | // private float m_tensor = 5f; | 78 | // private float m_tensor = 5f; |
79 | // private int body_autodisable_frames = 20; | 79 | // private int body_autodisable_frames = 20; |
80 | private IMesh primMesh = null; | 80 | private IMesh primMesh; |
81 | |||
82 | private bool m_usePID = false; | ||
83 | 81 | ||
82 | private bool m_usePID; | ||
84 | 83 | ||
85 | private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom | 84 | private const CollisionCategories m_default_collisionFlags = (CollisionCategories.Geom |
86 | | CollisionCategories.Space | 85 | | CollisionCategories.Space |
@@ -88,11 +87,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
88 | | CollisionCategories.Character | 87 | | CollisionCategories.Character |
89 | ); | 88 | ); |
90 | 89 | ||
91 | private bool m_taintshape = false; | 90 | private bool m_taintshape; |
92 | private bool m_taintPhysics = false; | 91 | private bool m_taintPhysics; |
93 | // private bool m_collidesLand = true; | 92 | // private bool m_collidesLand = true; |
94 | private bool m_collidesWater = false; | 93 | private bool m_collidesWater; |
95 | public bool m_returnCollisions = false; | 94 | public bool m_returnCollisions; |
96 | 95 | ||
97 | // Default we're a Geometry | 96 | // Default we're a Geometry |
98 | // private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); | 97 | // private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); |
@@ -100,23 +99,23 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
100 | // Default, Collide with Other Geometries, spaces and Bodies | 99 | // Default, Collide with Other Geometries, spaces and Bodies |
101 | // private CollisionCategories m_collisionFlags = m_default_collisionFlags; | 100 | // private CollisionCategories m_collisionFlags = m_default_collisionFlags; |
102 | 101 | ||
103 | public bool m_taintremove = false; | 102 | public bool m_taintremove; |
104 | public bool m_taintdisable = false; | 103 | public bool m_taintdisable; |
105 | public bool m_disabled = false; | 104 | public bool m_disabled; |
106 | public bool m_taintadd = false; | 105 | public bool m_taintadd; |
107 | public bool m_taintselected = false; | 106 | public bool m_taintselected; |
108 | public bool m_taintCollidesWater = false; | 107 | public bool m_taintCollidesWater; |
109 | 108 | ||
110 | public uint m_localID = 0; | 109 | public uint m_localID; |
111 | 110 | ||
112 | //public GCHandle gc; | 111 | //public GCHandle gc; |
113 | // private CollisionLocker ode; | 112 | // private CollisionLocker ode; |
114 | 113 | ||
115 | private bool m_taintforce = false; | 114 | private bool m_taintforce; |
116 | private bool m_taintaddangularforce = false; | 115 | private bool m_taintaddangularforce; |
117 | private PhysicsVector m_force = new PhysicsVector(0.0f, 0.0f, 0.0f); | 116 | private Vector3 m_force; |
118 | private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); | 117 | private List<Vector3> m_forcelist = new List<Vector3>(); |
119 | private List<PhysicsVector> m_angularforcelist = new List<PhysicsVector>(); | 118 | private List<Vector3> m_angularforcelist = new List<Vector3>(); |
120 | 119 | ||
121 | private IMesh _mesh; | 120 | private IMesh _mesh; |
122 | private PrimitiveBaseShape _pbs; | 121 | private PrimitiveBaseShape _pbs; |
@@ -124,40 +123,40 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
124 | public btCollisionShape prim_geom; | 123 | public btCollisionShape prim_geom; |
125 | public IntPtr _triMeshData; | 124 | public IntPtr _triMeshData; |
126 | 125 | ||
127 | private PhysicsActor _parent = null; | 126 | private PhysicsActor _parent; |
128 | private PhysicsActor m_taintparent = null; | 127 | private PhysicsActor m_taintparent; |
129 | 128 | ||
130 | private List<BulletDotNETPrim> childrenPrim = new List<BulletDotNETPrim>(); | 129 | private List<BulletDotNETPrim> childrenPrim = new List<BulletDotNETPrim>(); |
131 | 130 | ||
132 | private bool iscolliding = false; | 131 | private bool iscolliding; |
133 | private bool m_isphysical = false; | 132 | private bool m_isphysical; |
134 | private bool m_isSelected = false; | 133 | private bool m_isSelected; |
135 | 134 | ||
136 | internal bool m_isVolumeDetect = false; // If true, this prim only detects collisions but doesn't collide actively | 135 | internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively |
137 | 136 | ||
138 | private bool m_throttleUpdates = false; | 137 | private bool m_throttleUpdates; |
139 | // private int throttleCounter = 0; | 138 | // private int throttleCounter; |
140 | public int m_interpenetrationcount = 0; | 139 | public int m_interpenetrationcount; |
141 | public float m_collisionscore = 0; | 140 | public float m_collisionscore; |
142 | public int m_roundsUnderMotionThreshold = 0; | 141 | public int m_roundsUnderMotionThreshold; |
143 | private int m_crossingfailures = 0; | 142 | private int m_crossingfailures; |
144 | 143 | ||
145 | public float m_buoyancy = 0f; | 144 | public float m_buoyancy; |
146 | 145 | ||
147 | public bool outofBounds = false; | 146 | public bool outofBounds; |
148 | private float m_density = 10.000006836f; // Aluminum g/cm3; | 147 | private float m_density = 10.000006836f; // Aluminum g/cm3; |
149 | 148 | ||
150 | public bool _zeroFlag = false; | 149 | public bool _zeroFlag; |
151 | private bool m_lastUpdateSent = false; | 150 | private bool m_lastUpdateSent; |
152 | 151 | ||
153 | 152 | ||
154 | private String m_primName; | 153 | private String m_primName; |
155 | private PhysicsVector _target_velocity; | 154 | private Vector3 _target_velocity; |
156 | 155 | ||
157 | public int m_eventsubscription = 0; | 156 | public int m_eventsubscription; |
158 | // private CollisionEventUpdate CollisionEventsThisFrame = null; | 157 | // private CollisionEventUpdate CollisionEventsThisFrame = null; |
159 | 158 | ||
160 | public volatile bool childPrim = false; | 159 | public volatile bool childPrim; |
161 | 160 | ||
162 | private btVector3 tempPosition1; | 161 | private btVector3 tempPosition1; |
163 | private btVector3 tempPosition2; | 162 | private btVector3 tempPosition2; |
@@ -190,7 +189,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
190 | 189 | ||
191 | public btRigidBody Body; | 190 | public btRigidBody Body; |
192 | 191 | ||
193 | public BulletDotNETPrim(String primName, BulletDotNETScene parent_scene, PhysicsVector pos, PhysicsVector size, | 192 | public BulletDotNETPrim(String primName, BulletDotNETScene parent_scene, Vector3 pos, Vector3 size, |
194 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) | 193 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical) |
195 | { | 194 | { |
196 | tempPosition1 = new btVector3(0, 0, 0); | 195 | tempPosition1 = new btVector3(0, 0, 0); |
@@ -225,8 +224,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
225 | 224 | ||
226 | AxisLockLinearHigh = new btVector3((int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionSize); | 225 | AxisLockLinearHigh = new btVector3((int)Constants.RegionSize, (int)Constants.RegionSize, (int)Constants.RegionSize); |
227 | 226 | ||
228 | _target_velocity = new PhysicsVector(0, 0, 0); | 227 | _target_velocity = Vector3.Zero; |
229 | _velocity = new PhysicsVector(); | 228 | _velocity = Vector3.Zero; |
230 | _position = pos; | 229 | _position = pos; |
231 | m_taintposition = pos; | 230 | m_taintposition = pos; |
232 | PID_D = parent_scene.bodyPIDD; | 231 | PID_D = parent_scene.bodyPIDD; |
@@ -244,8 +243,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
244 | 243 | ||
245 | _size = size; | 244 | _size = size; |
246 | m_taintsize = _size; | 245 | m_taintsize = _size; |
247 | _acceleration = new PhysicsVector(); | 246 | _acceleration = Vector3.Zero; |
248 | m_rotationalVelocity = PhysicsVector.Zero; | 247 | m_rotationalVelocity = Vector3.Zero; |
249 | _orientation = rotation; | 248 | _orientation = rotation; |
250 | m_taintrot = _orientation; | 249 | m_taintrot = _orientation; |
251 | _mesh = mesh; | 250 | _mesh = mesh; |
@@ -274,7 +273,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
274 | get { return _zeroFlag; } | 273 | get { return _zeroFlag; } |
275 | } | 274 | } |
276 | 275 | ||
277 | public override PhysicsVector Size | 276 | public override Vector3 Size |
278 | { | 277 | { |
279 | get { return _size; } | 278 | get { return _size; } |
280 | set { _size = value; } | 279 | set { _size = value; } |
@@ -348,13 +347,13 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
348 | m_taintparent = null; | 347 | m_taintparent = null; |
349 | } | 348 | } |
350 | 349 | ||
351 | public override void LockAngularMotion(PhysicsVector axis) | 350 | public override void LockAngularMotion(Vector3 axis) |
352 | { | 351 | { |
353 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); | 352 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); |
354 | m_taintAngularLock = new PhysicsVector(axis.X, axis.Y, axis.Z); | 353 | m_taintAngularLock = axis; |
355 | } | 354 | } |
356 | 355 | ||
357 | public override PhysicsVector Position | 356 | public override Vector3 Position |
358 | { | 357 | { |
359 | get { return _position; } | 358 | get { return _position; } |
360 | 359 | ||
@@ -370,9 +369,9 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
370 | get { return CalculateMass(); } | 369 | get { return CalculateMass(); } |
371 | } | 370 | } |
372 | 371 | ||
373 | public override PhysicsVector Force | 372 | public override Vector3 Force |
374 | { | 373 | { |
375 | //get { return PhysicsVector.Zero; } | 374 | //get { return Vector3.Zero; } |
376 | get { return m_force; } | 375 | get { return m_force; } |
377 | set { m_force = value; } | 376 | set { m_force = value; } |
378 | } | 377 | } |
@@ -388,7 +387,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
388 | //TODO: | 387 | //TODO: |
389 | } | 388 | } |
390 | 389 | ||
391 | public override void VehicleVectorParam(int param, PhysicsVector value) | 390 | public override void VehicleVectorParam(int param, Vector3 value) |
392 | { | 391 | { |
393 | //TODO: | 392 | //TODO: |
394 | } | 393 | } |
@@ -405,23 +404,23 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
405 | 404 | ||
406 | } | 405 | } |
407 | 406 | ||
408 | public override PhysicsVector GeometricCenter | 407 | public override Vector3 GeometricCenter |
409 | { | 408 | { |
410 | get { return PhysicsVector.Zero; } | 409 | get { return Vector3.Zero; } |
411 | } | 410 | } |
412 | 411 | ||
413 | public override PhysicsVector CenterOfMass | 412 | public override Vector3 CenterOfMass |
414 | { | 413 | { |
415 | get { return PhysicsVector.Zero; } | 414 | get { return Vector3.Zero; } |
416 | } | 415 | } |
417 | 416 | ||
418 | public override PhysicsVector Velocity | 417 | public override Vector3 Velocity |
419 | { | 418 | { |
420 | get | 419 | get |
421 | { | 420 | { |
422 | // Averate previous velocity with the new one so | 421 | // Averate previous velocity with the new one so |
423 | // client object interpolation works a 'little' better | 422 | // client object interpolation works a 'little' better |
424 | PhysicsVector returnVelocity = new PhysicsVector(); | 423 | Vector3 returnVelocity; |
425 | returnVelocity.X = (m_lastVelocity.X + _velocity.X) / 2; | 424 | returnVelocity.X = (m_lastVelocity.X + _velocity.X) / 2; |
426 | returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y) / 2; | 425 | returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y) / 2; |
427 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z) / 2; | 426 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z) / 2; |
@@ -436,12 +435,12 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
436 | } | 435 | } |
437 | } | 436 | } |
438 | 437 | ||
439 | public override PhysicsVector Torque | 438 | public override Vector3 Torque |
440 | { | 439 | { |
441 | get | 440 | get |
442 | { | 441 | { |
443 | if (!m_isphysical || Body.Handle == IntPtr.Zero) | 442 | if (!m_isphysical || Body.Handle == IntPtr.Zero) |
444 | return new PhysicsVector(0, 0, 0); | 443 | return Vector3.Zero; |
445 | 444 | ||
446 | return _torque; | 445 | return _torque; |
447 | } | 446 | } |
@@ -459,7 +458,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
459 | set { m_collisionscore = value; } | 458 | set { m_collisionscore = value; } |
460 | } | 459 | } |
461 | 460 | ||
462 | public override PhysicsVector Acceleration | 461 | public override Vector3 Acceleration |
463 | { | 462 | { |
464 | get { return _acceleration; } | 463 | get { return _acceleration; } |
465 | } | 464 | } |
@@ -528,16 +527,16 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
528 | } | 527 | } |
529 | } | 528 | } |
530 | 529 | ||
531 | public override PhysicsVector RotationalVelocity | 530 | public override Vector3 RotationalVelocity |
532 | { | 531 | { |
533 | get | 532 | get |
534 | { | 533 | { |
535 | PhysicsVector pv = new PhysicsVector(0, 0, 0); | 534 | Vector3 pv = Vector3.Zero; |
536 | if (_zeroFlag) | 535 | if (_zeroFlag) |
537 | return pv; | 536 | return pv; |
538 | m_lastUpdateSent = false; | 537 | m_lastUpdateSent = false; |
539 | 538 | ||
540 | if (m_rotationalVelocity.IsIdentical(pv, 0.2f)) | 539 | if (m_rotationalVelocity.ApproxEquals(pv, 0.2f)) |
541 | return pv; | 540 | return pv; |
542 | 541 | ||
543 | return m_rotationalVelocity; | 542 | return m_rotationalVelocity; |
@@ -557,7 +556,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
557 | set { m_buoyancy = value; } | 556 | set { m_buoyancy = value; } |
558 | } | 557 | } |
559 | 558 | ||
560 | public override PhysicsVector PIDTarget { set { m_PIDTarget = value; ; } } | 559 | public override Vector3 PIDTarget { set { m_PIDTarget = value; ; } } |
561 | public override bool PIDActive { set { m_usePID = value; } } | 560 | public override bool PIDActive { set { m_usePID = value; } } |
562 | public override float PIDTau { set { m_PIDTau = value; } } | 561 | public override float PIDTau { set { m_PIDTau = value; } } |
563 | 562 | ||
@@ -572,20 +571,20 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
572 | public override float APIDDamping { set { return; } } | 571 | public override float APIDDamping { set { return; } } |
573 | 572 | ||
574 | 573 | ||
575 | public override void AddForce(PhysicsVector force, bool pushforce) | 574 | public override void AddForce(Vector3 force, bool pushforce) |
576 | { | 575 | { |
577 | m_forcelist.Add(force); | 576 | m_forcelist.Add(force); |
578 | m_taintforce = true; | 577 | m_taintforce = true; |
579 | //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); | 578 | //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); |
580 | } | 579 | } |
581 | 580 | ||
582 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 581 | public override void AddAngularForce(Vector3 force, bool pushforce) |
583 | { | 582 | { |
584 | m_angularforcelist.Add(force); | 583 | m_angularforcelist.Add(force); |
585 | m_taintaddangularforce = true; | 584 | m_taintaddangularforce = true; |
586 | } | 585 | } |
587 | 586 | ||
588 | public override void SetMomentum(PhysicsVector momentum) | 587 | public override void SetMomentum(Vector3 momentum) |
589 | { | 588 | { |
590 | } | 589 | } |
591 | 590 | ||
@@ -783,7 +782,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
783 | 782 | ||
784 | } | 783 | } |
785 | 784 | ||
786 | if (!_position.IsIdentical(m_taintposition, 0f)) | 785 | if (!_position.ApproxEquals(m_taintposition, 0f)) |
787 | { | 786 | { |
788 | m_log.Debug("[PHYSICS]: TaintMove"); | 787 | m_log.Debug("[PHYSICS]: TaintMove"); |
789 | changemove(timestep); | 788 | changemove(timestep); |
@@ -801,7 +800,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
801 | } | 800 | } |
802 | // | 801 | // |
803 | 802 | ||
804 | if (!_size.IsIdentical(m_taintsize, 0)) | 803 | if (!_size.ApproxEquals(m_taintsize, 0f)) |
805 | { | 804 | { |
806 | m_log.Debug("[PHYSICS]: TaintSize"); | 805 | m_log.Debug("[PHYSICS]: TaintSize"); |
807 | changesize(timestep); | 806 | changesize(timestep); |
@@ -825,7 +824,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
825 | m_log.Debug("[PHYSICS]: TaintAngularForce"); | 824 | m_log.Debug("[PHYSICS]: TaintAngularForce"); |
826 | changeAddAngularForce(timestep); | 825 | changeAddAngularForce(timestep); |
827 | } | 826 | } |
828 | if (!m_taintTorque.IsIdentical(PhysicsVector.Zero, 0.001f)) | 827 | if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) |
829 | { | 828 | { |
830 | m_log.Debug("[PHYSICS]: TaintTorque"); | 829 | m_log.Debug("[PHYSICS]: TaintTorque"); |
831 | changeSetTorque(timestep); | 830 | changeSetTorque(timestep); |
@@ -840,7 +839,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
840 | m_log.Debug("[PHYSICS]: TaintSelected"); | 839 | m_log.Debug("[PHYSICS]: TaintSelected"); |
841 | changeSelectedStatus(timestep); | 840 | changeSelectedStatus(timestep); |
842 | } | 841 | } |
843 | if (!m_taintVelocity.IsIdentical(PhysicsVector.Zero, 0.001f)) | 842 | if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) |
844 | { | 843 | { |
845 | m_log.Debug("[PHYSICS]: TaintVelocity"); | 844 | m_log.Debug("[PHYSICS]: TaintVelocity"); |
846 | changevelocity(timestep); | 845 | changevelocity(timestep); |
@@ -854,7 +853,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
854 | { | 853 | { |
855 | changefloatonwater(timestep); | 854 | changefloatonwater(timestep); |
856 | } | 855 | } |
857 | if (!m_angularlock.IsIdentical(m_taintAngularLock, 0)) | 856 | if (!m_angularlock.ApproxEquals(m_taintAngularLock, 0)) |
858 | { | 857 | { |
859 | m_log.Debug("[PHYSICS]: TaintAngularLock"); | 858 | m_log.Debug("[PHYSICS]: TaintAngularLock"); |
860 | changeAngularLock(timestep); | 859 | changeAngularLock(timestep); |
@@ -1017,7 +1016,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1017 | { | 1016 | { |
1018 | if (_parent_scene.needsMeshing(_pbs)) | 1017 | if (_parent_scene.needsMeshing(_pbs)) |
1019 | { | 1018 | { |
1020 | ProcessGeomCreationAsTriMesh(PhysicsVector.Zero, Quaternion.Identity); | 1019 | ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); |
1021 | // createmesh returns null when it doesn't mesh. | 1020 | // createmesh returns null when it doesn't mesh. |
1022 | CreateGeom(IntPtr.Zero, _mesh); | 1021 | CreateGeom(IntPtr.Zero, _mesh); |
1023 | } | 1022 | } |
@@ -1034,7 +1033,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1034 | return _parent_scene.needsMeshing(_pbs); | 1033 | return _parent_scene.needsMeshing(_pbs); |
1035 | } | 1034 | } |
1036 | 1035 | ||
1037 | internal void ProcessGeomCreationAsTriMesh(PhysicsVector positionOffset, Quaternion orientation) | 1036 | internal void ProcessGeomCreationAsTriMesh(Vector3 positionOffset, Quaternion orientation) |
1038 | { | 1037 | { |
1039 | // Don't need to re-enable body.. it's done in SetMesh | 1038 | // Don't need to re-enable body.. it's done in SetMesh |
1040 | float meshlod = _parent_scene.meshSculptLOD; | 1039 | float meshlod = _parent_scene.meshSculptLOD; |
@@ -1043,7 +1042,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1043 | meshlod = _parent_scene.MeshSculptphysicalLOD; | 1042 | meshlod = _parent_scene.MeshSculptphysicalLOD; |
1044 | 1043 | ||
1045 | IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); | 1044 | IMesh mesh = _parent_scene.mesher.CreateMesh(SOPName, _pbs, _size, meshlod, IsPhysical); |
1046 | if (!positionOffset.IsIdentical(PhysicsVector.Zero, 0.001f) || orientation != Quaternion.Identity) | 1045 | if (!positionOffset.ApproxEquals(Vector3.Zero, 0.001f) || orientation != Quaternion.Identity) |
1047 | { | 1046 | { |
1048 | 1047 | ||
1049 | float[] xyz = new float[3]; | 1048 | float[] xyz = new float[3]; |
@@ -1207,7 +1206,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1207 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | 1206 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
1208 | if (IsPhysical) | 1207 | if (IsPhysical) |
1209 | { | 1208 | { |
1210 | PhysicsVector iforce = new PhysicsVector(); | 1209 | Vector3 iforce = Vector3.Zero; |
1211 | for (int i = 0; i < m_forcelist.Count; i++) | 1210 | for (int i = 0; i < m_forcelist.Count; i++) |
1212 | { | 1211 | { |
1213 | iforce = iforce + m_forcelist[i]; | 1212 | iforce = iforce + m_forcelist[i]; |
@@ -1242,7 +1241,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1242 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | 1241 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
1243 | if (IsPhysical) | 1242 | if (IsPhysical) |
1244 | { | 1243 | { |
1245 | PhysicsVector iforce = new PhysicsVector(); | 1244 | Vector3 iforce = Vector3.Zero; |
1246 | for (int i = 0; i < m_angularforcelist.Count; i++) | 1245 | for (int i = 0; i < m_angularforcelist.Count; i++) |
1247 | { | 1246 | { |
1248 | iforce = iforce + m_angularforcelist[i]; | 1247 | iforce = iforce + m_angularforcelist[i]; |
@@ -1281,7 +1280,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1281 | } | 1280 | } |
1282 | } | 1281 | } |
1283 | } | 1282 | } |
1284 | m_taintTorque = new PhysicsVector(0, 0, 0); | 1283 | m_taintTorque = Vector3.Zero; |
1285 | } | 1284 | } |
1286 | 1285 | ||
1287 | private void changedisable(float timestep) | 1286 | private void changedisable(float timestep) |
@@ -1322,7 +1321,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1322 | 1321 | ||
1323 | //resetCollisionAccounting(); | 1322 | //resetCollisionAccounting(); |
1324 | } | 1323 | } |
1325 | m_taintVelocity = PhysicsVector.Zero; | 1324 | m_taintVelocity = Vector3.Zero; |
1326 | } | 1325 | } |
1327 | 1326 | ||
1328 | private void changelink(float timestep) | 1327 | private void changelink(float timestep) |
@@ -1366,7 +1365,9 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1366 | 1365 | ||
1367 | if (m_taintparent != null) | 1366 | if (m_taintparent != null) |
1368 | { | 1367 | { |
1369 | m_taintparent.Position.Z = m_taintparent.Position.Z + 0.02f; | 1368 | Vector3 taintparentPosition = m_taintparent.Position; |
1369 | taintparentPosition.Z = m_taintparent.Position.Z + 0.02f; | ||
1370 | m_taintparent.Position = taintparentPosition; | ||
1370 | _parent_scene.AddPhysicsActorTaint(m_taintparent); | 1371 | _parent_scene.AddPhysicsActorTaint(m_taintparent); |
1371 | } | 1372 | } |
1372 | } | 1373 | } |
@@ -1387,7 +1388,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1387 | { | 1388 | { |
1388 | if (_parent == null) | 1389 | if (_parent == null) |
1389 | { | 1390 | { |
1390 | if (!m_taintAngularLock.IsIdentical(new PhysicsVector(1f, 1f, 1f), 0)) | 1391 | if (!m_taintAngularLock.ApproxEquals(Vector3.One, 0f)) |
1391 | { | 1392 | { |
1392 | //d.BodySetFiniteRotationMode(Body, 0); | 1393 | //d.BodySetFiniteRotationMode(Body, 0); |
1393 | //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); | 1394 | //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); |
@@ -1400,7 +1401,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1400 | } | 1401 | } |
1401 | 1402 | ||
1402 | } | 1403 | } |
1403 | m_angularlock = new PhysicsVector(m_taintAngularLock.X, m_taintAngularLock.Y, m_taintAngularLock.Z); | 1404 | m_angularlock = m_taintAngularLock; |
1404 | 1405 | ||
1405 | } | 1406 | } |
1406 | #endregion | 1407 | #endregion |
@@ -1465,17 +1466,17 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1465 | // TODO: NEED btVector3 for Linear Velocity | 1466 | // TODO: NEED btVector3 for Linear Velocity |
1466 | // NEED btVector3 for Position | 1467 | // NEED btVector3 for Position |
1467 | 1468 | ||
1468 | PhysicsVector pos = new PhysicsVector(_position.X, _position.Y, _position.Z); //TODO: Insert values gotten from bullet | 1469 | Vector3 pos = _position; //TODO: Insert values gotten from bullet |
1469 | PhysicsVector vel = new PhysicsVector(_velocity.X, _velocity.Y, _velocity.Z); | 1470 | Vector3 vel = _velocity; |
1470 | 1471 | ||
1471 | _target_velocity = | 1472 | _target_velocity = |
1472 | new PhysicsVector( | 1473 | new Vector3( |
1473 | (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), | 1474 | (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), |
1474 | (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), | 1475 | (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), |
1475 | (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) | 1476 | (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) |
1476 | ); | 1477 | ); |
1477 | 1478 | ||
1478 | if (_target_velocity.IsIdentical(PhysicsVector.Zero, 0.1f)) | 1479 | if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) |
1479 | { | 1480 | { |
1480 | 1481 | ||
1481 | /* TODO: Do Bullet equiv | 1482 | /* TODO: Do Bullet equiv |
@@ -1517,8 +1518,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1517 | { | 1518 | { |
1518 | PID_G = m_PIDTau + 1; | 1519 | PID_G = m_PIDTau + 1; |
1519 | } | 1520 | } |
1520 | PhysicsVector pos = new PhysicsVector(0, 0, 0); //TODO: Insert values gotten from bullet | 1521 | Vector3 pos = Vector3.Zero; //TODO: Insert values gotten from bullet |
1521 | PhysicsVector vel = new PhysicsVector(0, 0, 0); | 1522 | Vector3 vel = Vector3.Zero; |
1522 | 1523 | ||
1523 | // determine what our target height really is based on HoverType | 1524 | // determine what our target height really is based on HoverType |
1524 | switch (m_PIDHoverType) | 1525 | switch (m_PIDHoverType) |
@@ -1550,13 +1551,13 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1550 | 1551 | ||
1551 | 1552 | ||
1552 | _target_velocity = | 1553 | _target_velocity = |
1553 | new PhysicsVector(0.0f, 0.0f, | 1554 | new Vector3(0.0f, 0.0f, |
1554 | (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) | 1555 | (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) |
1555 | ); | 1556 | ); |
1556 | 1557 | ||
1557 | // if velocity is zero, use position control; otherwise, velocity control | 1558 | // if velocity is zero, use position control; otherwise, velocity control |
1558 | 1559 | ||
1559 | if (_target_velocity.IsIdentical(PhysicsVector.Zero, 0.1f)) | 1560 | if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) |
1560 | { | 1561 | { |
1561 | 1562 | ||
1562 | /* TODO: Do Bullet Equiv | 1563 | /* TODO: Do Bullet Equiv |
@@ -1631,8 +1632,8 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
1631 | else | 1632 | else |
1632 | { | 1633 | { |
1633 | if (m_zeroPosition == null) | 1634 | if (m_zeroPosition == null) |
1634 | m_zeroPosition = new PhysicsVector(0, 0, 0); | 1635 | m_zeroPosition = Vector3.Zero; |
1635 | m_zeroPosition.setValues(_position.X, _position.Y, _position.Z); | 1636 | m_zeroPosition = _position; |
1636 | return; | 1637 | return; |
1637 | } | 1638 | } |
1638 | } | 1639 | } |
@@ -2182,7 +2183,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2182 | 2183 | ||
2183 | //if (hasTrimesh) | 2184 | //if (hasTrimesh) |
2184 | //{ | 2185 | //{ |
2185 | ProcessGeomCreationAsTriMesh(PhysicsVector.Zero, Quaternion.Identity); | 2186 | ProcessGeomCreationAsTriMesh(Vector3.Zero, Quaternion.Identity); |
2186 | // createmesh returns null when it doesn't mesh. | 2187 | // createmesh returns null when it doesn't mesh. |
2187 | 2188 | ||
2188 | /* | 2189 | /* |
@@ -2202,11 +2203,11 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2202 | { | 2203 | { |
2203 | if (chld == null) | 2204 | if (chld == null) |
2204 | continue; | 2205 | continue; |
2205 | PhysicsVector offset = chld.Position - Position; | 2206 | Vector3 offset = chld.Position - Position; |
2206 | Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z); | 2207 | Vector3 pos = new Vector3(offset.X, offset.Y, offset.Z); |
2207 | pos *= Quaternion.Inverse(Orientation); | 2208 | pos *= Quaternion.Inverse(Orientation); |
2208 | //pos *= Orientation; | 2209 | //pos *= Orientation; |
2209 | offset.setValues(pos.X, pos.Y, pos.Z); | 2210 | offset = pos; |
2210 | chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation); | 2211 | chld.ProcessGeomCreationAsTriMesh(offset, chld.Orientation); |
2211 | 2212 | ||
2212 | _mesh.Append(chld._mesh); | 2213 | _mesh.Append(chld._mesh); |
@@ -2438,7 +2439,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2438 | m_collisionscore = 0; | 2439 | m_collisionscore = 0; |
2439 | m_disabled = false; | 2440 | m_disabled = false; |
2440 | // The body doesn't already have a finite rotation mode set here | 2441 | // The body doesn't already have a finite rotation mode set here |
2441 | if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null) | 2442 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) |
2442 | { | 2443 | { |
2443 | // TODO: Create Angular Motor on Axis Lock! | 2444 | // TODO: Create Angular Motor on Axis Lock! |
2444 | } | 2445 | } |
@@ -2452,7 +2453,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2452 | { | 2453 | { |
2453 | if (_parent == null) | 2454 | if (_parent == null) |
2454 | { | 2455 | { |
2455 | PhysicsVector pv = new PhysicsVector(0, 0, 0); | 2456 | Vector3 pv = Vector3.Zero; |
2456 | bool lastZeroFlag = _zeroFlag; | 2457 | bool lastZeroFlag = _zeroFlag; |
2457 | if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) | 2458 | if (tempPosition3 != null && tempPosition3.Handle != IntPtr.Zero) |
2458 | tempPosition3.Dispose(); | 2459 | tempPosition3.Dispose(); |
@@ -2476,10 +2477,10 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2476 | tempAngularVelocity1 = Body.getInterpolationAngularVelocity(); //rotvel | 2477 | tempAngularVelocity1 = Body.getInterpolationAngularVelocity(); //rotvel |
2477 | tempLinearVelocity1 = Body.getInterpolationLinearVelocity(); // vel | 2478 | tempLinearVelocity1 = Body.getInterpolationLinearVelocity(); // vel |
2478 | 2479 | ||
2479 | _torque.setValues(tempAngularVelocity1.getX(), tempAngularVelocity1.getX(), | 2480 | _torque = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getX(), |
2480 | tempAngularVelocity1.getZ()); | 2481 | tempAngularVelocity1.getZ()); |
2481 | PhysicsVector l_position = new PhysicsVector(); | 2482 | Vector3 l_position = Vector3.Zero; |
2482 | Quaternion l_orientation = new Quaternion(); | 2483 | Quaternion l_orientation = Quaternion.Identity; |
2483 | m_lastposition = _position; | 2484 | m_lastposition = _position; |
2484 | m_lastorientation = _orientation; | 2485 | m_lastorientation = _orientation; |
2485 | 2486 | ||
@@ -2603,20 +2604,18 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2603 | _velocity.Z = tempLinearVelocity1.getZ(); | 2604 | _velocity.Z = tempLinearVelocity1.getZ(); |
2604 | 2605 | ||
2605 | _acceleration = ((_velocity - m_lastVelocity) / 0.1f); | 2606 | _acceleration = ((_velocity - m_lastVelocity) / 0.1f); |
2606 | _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X / 0.1f, | 2607 | _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, |
2607 | _velocity.Y - m_lastVelocity.Y / 0.1f, | 2608 | _velocity.Y - m_lastVelocity.Y / 0.1f, |
2608 | _velocity.Z - m_lastVelocity.Z / 0.1f); | 2609 | _velocity.Z - m_lastVelocity.Z / 0.1f); |
2609 | //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); | 2610 | //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); |
2610 | 2611 | ||
2611 | if (_velocity.IsIdentical(pv, 0.5f)) | 2612 | if (_velocity.ApproxEquals(pv, 0.5f)) |
2612 | { | 2613 | { |
2613 | m_rotationalVelocity = pv; | 2614 | m_rotationalVelocity = pv; |
2614 | } | 2615 | } |
2615 | else | 2616 | else |
2616 | { | 2617 | { |
2617 | 2618 | m_rotationalVelocity = new Vector3(tempAngularVelocity1.getX(), tempAngularVelocity1.getY(), tempAngularVelocity1.getZ()); | |
2618 | m_rotationalVelocity.setValues(tempAngularVelocity1.getX(), tempAngularVelocity1.getY(), | ||
2619 | tempAngularVelocity1.getZ()); | ||
2620 | } | 2619 | } |
2621 | 2620 | ||
2622 | //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); | 2621 | //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); |
@@ -2670,7 +2669,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
2670 | m_taintremove = true; | 2669 | m_taintremove = true; |
2671 | } | 2670 | } |
2672 | 2671 | ||
2673 | internal void EnableAxisMotor(PhysicsVector axislock) | 2672 | internal void EnableAxisMotor(Vector3 axislock) |
2674 | { | 2673 | { |
2675 | if (m_aMotor != null) | 2674 | if (m_aMotor != null) |
2676 | DisableAxisMotor(); | 2675 | DisableAxisMotor(); |
diff --git a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs index 18d4bab..9e048ab 100644 --- a/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs +++ b/OpenSim/Region/Physics/BulletDotNETPlugin/BulletDotNETScene.cs | |||
@@ -139,7 +139,7 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
139 | 139 | ||
140 | } | 140 | } |
141 | 141 | ||
142 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 142 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
143 | { | 143 | { |
144 | BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP, | 144 | BulletDotNETCharacter chr = new BulletDotNETCharacter(avName, this, position, size, avPIDD, avPIDP, |
145 | avCapRadius, avStandupTensor, avDensity, | 145 | avCapRadius, avStandupTensor, avDensity, |
@@ -177,14 +177,14 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
177 | } | 177 | } |
178 | } | 178 | } |
179 | 179 | ||
180 | private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, | 180 | private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation, |
181 | IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) | 181 | IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) |
182 | { | 182 | { |
183 | PhysicsVector pos = new PhysicsVector(position.X, position.Y, position.Z); | 183 | Vector3 pos = position; |
184 | //pos.X = position.X; | 184 | //pos.X = position.X; |
185 | //pos.Y = position.Y; | 185 | //pos.Y = position.Y; |
186 | //pos.Z = position.Z; | 186 | //pos.Z = position.Z; |
187 | PhysicsVector siz = new PhysicsVector(); | 187 | Vector3 siz = Vector3.Zero; |
188 | siz.X = size.X; | 188 | siz.X = size.X; |
189 | siz.Y = size.Y; | 189 | siz.Y = size.Y; |
190 | siz.Z = size.Z; | 190 | siz.Z = size.Z; |
@@ -201,12 +201,12 @@ namespace OpenSim.Region.Physics.BulletDotNETPlugin | |||
201 | return newPrim; | 201 | return newPrim; |
202 | } | 202 | } |
203 | 203 | ||
204 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation) | 204 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, Vector3 size, Quaternion rotation) |
205 | { | 205 | { |
206 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 206 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
207 | } | 207 | } |
208 | 208 | ||
209 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, PhysicsVector size, Quaternion rotation, bool isPhysical) | 209 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, Vector3 size, Quaternion rotation, bool isPhysical) |
210 | { | 210 | { |
211 | PhysicsActor result; | 211 | PhysicsActor result; |
212 | IMesh mesh = null; | 212 | IMesh mesh = null; |
diff --git a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs index 14b8f39..0b3cee7 100644 --- a/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs +++ b/OpenSim/Region/Physics/BulletXPlugin/BulletXPlugin.cs | |||
@@ -52,14 +52,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
52 | //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | 52 | //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); |
53 | 53 | ||
54 | //Vector3 | 54 | //Vector3 |
55 | public static Vector3 PhysicsVectorToXnaVector3(PhysicsVector physicsVector) | 55 | public static Vector3 PhysicsVectorToXnaVector3(OpenMetaverse.Vector3 physicsVector) |
56 | { | 56 | { |
57 | return new Vector3(physicsVector.X, physicsVector.Y, physicsVector.Z); | 57 | return new Vector3(physicsVector.X, physicsVector.Y, physicsVector.Z); |
58 | } | 58 | } |
59 | 59 | ||
60 | public static PhysicsVector XnaVector3ToPhysicsVector(Vector3 xnaVector3) | 60 | public static OpenMetaverse.Vector3 XnaVector3ToPhysicsVector(Vector3 xnaVector3) |
61 | { | 61 | { |
62 | return new PhysicsVector(xnaVector3.X, xnaVector3.Y, xnaVector3.Z); | 62 | return new OpenMetaverse.Vector3(xnaVector3.X, xnaVector3.Y, xnaVector3.Z); |
63 | } | 63 | } |
64 | 64 | ||
65 | //Quaternion | 65 | //Quaternion |
@@ -349,7 +349,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
349 | vertexBase = new Vector3[iVertexCount]; | 349 | vertexBase = new Vector3[iVertexCount]; |
350 | for (int i = 0; i < iVertexCount; i++) | 350 | for (int i = 0; i < iVertexCount; i++) |
351 | { | 351 | { |
352 | PhysicsVector v = mesh.getVertexList()[i]; | 352 | OpenMetaverse.Vector3 v = mesh.getVertexList()[i]; |
353 | if (v != null) // Note, null has special meaning. See meshing code for details | 353 | if (v != null) // Note, null has special meaning. See meshing code for details |
354 | vertexBase[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); | 354 | vertexBase[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); |
355 | else | 355 | else |
@@ -392,7 +392,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
392 | private int preCheckCollision(BulletXActor actA, Vector3 vNormal, float fDist) | 392 | private int preCheckCollision(BulletXActor actA, Vector3 vNormal, float fDist) |
393 | { | 393 | { |
394 | float fstartSide; | 394 | float fstartSide; |
395 | PhysicsVector v = actA.Position; | 395 | OpenMetaverse.Vector3 v = actA.Position; |
396 | Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); | 396 | Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); |
397 | 397 | ||
398 | fstartSide = Vector3.Dot(vNormal, v3) - fDist; | 398 | fstartSide = Vector3.Dot(vNormal, v3) - fDist; |
@@ -404,7 +404,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
404 | { | 404 | { |
405 | Vector3 perPlaneNormal; | 405 | Vector3 perPlaneNormal; |
406 | float fPerPlaneDist; | 406 | float fPerPlaneDist; |
407 | PhysicsVector v = actA.Position; | 407 | OpenMetaverse.Vector3 v = actA.Position; |
408 | Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); | 408 | Vector3 v3 = BulletXMaths.PhysicsVectorToXnaVector3(v); |
409 | //check AB | 409 | //check AB |
410 | Vector3 v1; | 410 | Vector3 v1; |
@@ -573,9 +573,9 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
573 | 573 | ||
574 | } | 574 | } |
575 | 575 | ||
576 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 576 | public override PhysicsActor AddAvatar(string avName, OpenMetaverse.Vector3 position, OpenMetaverse.Vector3 size, bool isFlying) |
577 | { | 577 | { |
578 | PhysicsVector pos = new PhysicsVector(); | 578 | OpenMetaverse.Vector3 pos = OpenMetaverse.Vector3.Zero; |
579 | pos.X = position.X; | 579 | pos.X = position.X; |
580 | pos.Y = position.Y; | 580 | pos.Y = position.Y; |
581 | pos.Z = position.Z + 20; | 581 | pos.Z = position.Z + 20; |
@@ -611,14 +611,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
611 | } | 611 | } |
612 | } | 612 | } |
613 | 613 | ||
614 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 614 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, OpenMetaverse.Vector3 position, |
615 | PhysicsVector size, OpenMetaverse.Quaternion rotation) | 615 | OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation) |
616 | { | 616 | { |
617 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 617 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
618 | } | 618 | } |
619 | 619 | ||
620 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 620 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, OpenMetaverse.Vector3 position, |
621 | PhysicsVector size, OpenMetaverse.Quaternion rotation, bool isPhysical) | 621 | OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation, bool isPhysical) |
622 | { | 622 | { |
623 | PhysicsActor result; | 623 | PhysicsActor result; |
624 | 624 | ||
@@ -645,7 +645,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
645 | return result; | 645 | return result; |
646 | } | 646 | } |
647 | 647 | ||
648 | public PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, OpenMetaverse.Quaternion rotation, | 648 | public PhysicsActor AddPrim(String name, OpenMetaverse.Vector3 position, OpenMetaverse.Vector3 size, OpenMetaverse.Quaternion rotation, |
649 | IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) | 649 | IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) |
650 | { | 650 | { |
651 | BulletXPrim newPrim = null; | 651 | BulletXPrim newPrim = null; |
@@ -879,12 +879,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
879 | { | 879 | { |
880 | protected bool flying = false; | 880 | protected bool flying = false; |
881 | protected bool _physical = false; | 881 | protected bool _physical = false; |
882 | protected PhysicsVector _position; | 882 | protected OpenMetaverse.Vector3 _position; |
883 | protected PhysicsVector _velocity; | 883 | protected OpenMetaverse.Vector3 _velocity; |
884 | protected PhysicsVector _size; | 884 | protected OpenMetaverse.Vector3 _size; |
885 | protected PhysicsVector _acceleration; | 885 | protected OpenMetaverse.Vector3 _acceleration; |
886 | protected OpenMetaverse.Quaternion _orientation; | 886 | protected OpenMetaverse.Quaternion _orientation; |
887 | protected PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; | 887 | protected OpenMetaverse.Vector3 m_rotationalVelocity; |
888 | protected RigidBody rigidBody; | 888 | protected RigidBody rigidBody; |
889 | protected int m_PhysicsActorType; | 889 | protected int m_PhysicsActorType; |
890 | private Boolean iscolliding = false; | 890 | private Boolean iscolliding = false; |
@@ -900,7 +900,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
900 | get { return false; } | 900 | get { return false; } |
901 | } | 901 | } |
902 | 902 | ||
903 | public override PhysicsVector Position | 903 | public override OpenMetaverse.Vector3 Position |
904 | { | 904 | { |
905 | get { return _position; } | 905 | get { return _position; } |
906 | set | 906 | set |
@@ -913,13 +913,13 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
913 | } | 913 | } |
914 | } | 914 | } |
915 | 915 | ||
916 | public override PhysicsVector RotationalVelocity | 916 | public override OpenMetaverse.Vector3 RotationalVelocity |
917 | { | 917 | { |
918 | get { return m_rotationalVelocity; } | 918 | get { return m_rotationalVelocity; } |
919 | set { m_rotationalVelocity = value; } | 919 | set { m_rotationalVelocity = value; } |
920 | } | 920 | } |
921 | 921 | ||
922 | public override PhysicsVector Velocity | 922 | public override OpenMetaverse.Vector3 Velocity |
923 | { | 923 | { |
924 | get { return _velocity; } | 924 | get { return _velocity; } |
925 | set | 925 | set |
@@ -934,7 +934,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
934 | } | 934 | } |
935 | else | 935 | else |
936 | { | 936 | { |
937 | _velocity = new PhysicsVector(); | 937 | _velocity = OpenMetaverse.Vector3.Zero; |
938 | } | 938 | } |
939 | } | 939 | } |
940 | } | 940 | } |
@@ -944,7 +944,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
944 | get { return 0f; } | 944 | get { return 0f; } |
945 | set { } | 945 | set { } |
946 | } | 946 | } |
947 | public override PhysicsVector Size | 947 | public override OpenMetaverse.Vector3 Size |
948 | { | 948 | { |
949 | get { return _size; } | 949 | get { return _size; } |
950 | set | 950 | set |
@@ -956,9 +956,9 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
956 | } | 956 | } |
957 | } | 957 | } |
958 | 958 | ||
959 | public override PhysicsVector Force | 959 | public override OpenMetaverse.Vector3 Force |
960 | { | 960 | { |
961 | get { return PhysicsVector.Zero; } | 961 | get { return OpenMetaverse.Vector3.Zero; } |
962 | set { return; } | 962 | set { return; } |
963 | } | 963 | } |
964 | 964 | ||
@@ -973,7 +973,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
973 | 973 | ||
974 | } | 974 | } |
975 | 975 | ||
976 | public override void VehicleVectorParam(int param, PhysicsVector value) | 976 | public override void VehicleVectorParam(int param, OpenMetaverse.Vector3 value) |
977 | { | 977 | { |
978 | 978 | ||
979 | } | 979 | } |
@@ -988,14 +988,14 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
988 | 988 | ||
989 | } | 989 | } |
990 | 990 | ||
991 | public override PhysicsVector CenterOfMass | 991 | public override OpenMetaverse.Vector3 CenterOfMass |
992 | { | 992 | { |
993 | get { return PhysicsVector.Zero; } | 993 | get { return OpenMetaverse.Vector3.Zero; } |
994 | } | 994 | } |
995 | 995 | ||
996 | public override PhysicsVector GeometricCenter | 996 | public override OpenMetaverse.Vector3 GeometricCenter |
997 | { | 997 | { |
998 | get { return PhysicsVector.Zero; } | 998 | get { return OpenMetaverse.Vector3.Zero; } |
999 | } | 999 | } |
1000 | 1000 | ||
1001 | public override PrimitiveBaseShape Shape | 1001 | public override PrimitiveBaseShape Shape |
@@ -1009,7 +1009,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1009 | set { return; } | 1009 | set { return; } |
1010 | } | 1010 | } |
1011 | 1011 | ||
1012 | public override PhysicsVector Acceleration | 1012 | public override OpenMetaverse.Vector3 Acceleration |
1013 | { | 1013 | { |
1014 | get { return _acceleration; } | 1014 | get { return _acceleration; } |
1015 | } | 1015 | } |
@@ -1036,7 +1036,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1036 | 1036 | ||
1037 | } | 1037 | } |
1038 | 1038 | ||
1039 | public override void LockAngularMotion(PhysicsVector axis) | 1039 | public override void LockAngularMotion(OpenMetaverse.Vector3 axis) |
1040 | { | 1040 | { |
1041 | 1041 | ||
1042 | } | 1042 | } |
@@ -1129,7 +1129,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1129 | set { return; } | 1129 | set { return; } |
1130 | } | 1130 | } |
1131 | 1131 | ||
1132 | public virtual void SetAcceleration(PhysicsVector accel) | 1132 | public virtual void SetAcceleration(OpenMetaverse.Vector3 accel) |
1133 | { | 1133 | { |
1134 | lock (BulletXScene.BulletXLock) | 1134 | lock (BulletXScene.BulletXLock) |
1135 | { | 1135 | { |
@@ -1143,19 +1143,19 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1143 | set { } | 1143 | set { } |
1144 | } | 1144 | } |
1145 | 1145 | ||
1146 | public override void AddForce(PhysicsVector force, bool pushforce) | 1146 | public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) |
1147 | { | 1147 | { |
1148 | } | 1148 | } |
1149 | public override PhysicsVector Torque | 1149 | public override OpenMetaverse.Vector3 Torque |
1150 | { | 1150 | { |
1151 | get { return PhysicsVector.Zero; } | 1151 | get { return OpenMetaverse.Vector3.Zero; } |
1152 | set { return; } | 1152 | set { return; } |
1153 | } | 1153 | } |
1154 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 1154 | public override void AddAngularForce(OpenMetaverse.Vector3 force, bool pushforce) |
1155 | { | 1155 | { |
1156 | } | 1156 | } |
1157 | 1157 | ||
1158 | public override void SetMomentum(PhysicsVector momentum) | 1158 | public override void SetMomentum(OpenMetaverse.Vector3 momentum) |
1159 | { | 1159 | { |
1160 | } | 1160 | } |
1161 | 1161 | ||
@@ -1174,7 +1174,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1174 | Translate(_position); | 1174 | Translate(_position); |
1175 | } | 1175 | } |
1176 | 1176 | ||
1177 | protected internal void Translate(PhysicsVector _newPos) | 1177 | protected internal void Translate(OpenMetaverse.Vector3 _newPos) |
1178 | { | 1178 | { |
1179 | Vector3 _translation; | 1179 | Vector3 _translation; |
1180 | _translation = BulletXMaths.PhysicsVectorToXnaVector3(_newPos) - rigidBody.CenterOfMassPosition; | 1180 | _translation = BulletXMaths.PhysicsVectorToXnaVector3(_newPos) - rigidBody.CenterOfMassPosition; |
@@ -1186,7 +1186,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1186 | Speed(_velocity); | 1186 | Speed(_velocity); |
1187 | } | 1187 | } |
1188 | 1188 | ||
1189 | protected internal void Speed(PhysicsVector _newSpeed) | 1189 | protected internal void Speed(OpenMetaverse.Vector3 _newSpeed) |
1190 | { | 1190 | { |
1191 | Vector3 _speed; | 1191 | Vector3 _speed; |
1192 | _speed = BulletXMaths.PhysicsVectorToXnaVector3(_newSpeed); | 1192 | _speed = BulletXMaths.PhysicsVectorToXnaVector3(_newSpeed); |
@@ -1212,7 +1212,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1212 | ReSize(_size); | 1212 | ReSize(_size); |
1213 | } | 1213 | } |
1214 | 1214 | ||
1215 | protected internal virtual void ReSize(PhysicsVector _newSize) | 1215 | protected internal virtual void ReSize(OpenMetaverse.Vector3 _newSize) |
1216 | { | 1216 | { |
1217 | } | 1217 | } |
1218 | 1218 | ||
@@ -1227,7 +1227,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1227 | { | 1227 | { |
1228 | 1228 | ||
1229 | } | 1229 | } |
1230 | public override PhysicsVector PIDTarget { set { return; } } | 1230 | public override OpenMetaverse.Vector3 PIDTarget { set { return; } } |
1231 | public override bool PIDActive { set { return; } } | 1231 | public override bool PIDActive { set { return; } } |
1232 | public override float PIDTau { set { return; } } | 1232 | public override float PIDTau { set { return; } } |
1233 | 1233 | ||
@@ -1276,19 +1276,19 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1276 | /// </summary> | 1276 | /// </summary> |
1277 | public class BulletXCharacter : BulletXActor | 1277 | public class BulletXCharacter : BulletXActor |
1278 | { | 1278 | { |
1279 | public BulletXCharacter(BulletXScene parent_scene, PhysicsVector pos) | 1279 | public BulletXCharacter(BulletXScene parent_scene, OpenMetaverse.Vector3 pos) |
1280 | : this(String.Empty, parent_scene, pos) | 1280 | : this(String.Empty, parent_scene, pos) |
1281 | { | 1281 | { |
1282 | } | 1282 | } |
1283 | 1283 | ||
1284 | public BulletXCharacter(String avName, BulletXScene parent_scene, PhysicsVector pos) | 1284 | public BulletXCharacter(String avName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos) |
1285 | : this(avName, parent_scene, pos, new PhysicsVector(), new PhysicsVector(), new PhysicsVector(), | 1285 | : this(avName, parent_scene, pos, OpenMetaverse.Vector3.Zero, OpenMetaverse.Vector3.Zero, OpenMetaverse.Vector3.Zero, |
1286 | OpenMetaverse.Quaternion.Identity) | 1286 | OpenMetaverse.Quaternion.Identity) |
1287 | { | 1287 | { |
1288 | } | 1288 | } |
1289 | 1289 | ||
1290 | public BulletXCharacter(String avName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, | 1290 | public BulletXCharacter(String avName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 velocity, |
1291 | PhysicsVector size, PhysicsVector acceleration, OpenMetaverse.Quaternion orientation) | 1291 | OpenMetaverse.Vector3 size, OpenMetaverse.Vector3 acceleration, OpenMetaverse.Quaternion orientation) |
1292 | : base(avName) | 1292 | : base(avName) |
1293 | { | 1293 | { |
1294 | //This fields will be removed. They're temporal | 1294 | //This fields will be removed. They're temporal |
@@ -1343,25 +1343,25 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1343 | set { return; } | 1343 | set { return; } |
1344 | } | 1344 | } |
1345 | 1345 | ||
1346 | public override PhysicsVector Position | 1346 | public override OpenMetaverse.Vector3 Position |
1347 | { | 1347 | { |
1348 | get { return base.Position; } | 1348 | get { return base.Position; } |
1349 | set { base.Position = value; } | 1349 | set { base.Position = value; } |
1350 | } | 1350 | } |
1351 | 1351 | ||
1352 | public override PhysicsVector Velocity | 1352 | public override OpenMetaverse.Vector3 Velocity |
1353 | { | 1353 | { |
1354 | get { return base.Velocity; } | 1354 | get { return base.Velocity; } |
1355 | set { base.Velocity = value; } | 1355 | set { base.Velocity = value; } |
1356 | } | 1356 | } |
1357 | 1357 | ||
1358 | public override PhysicsVector Size | 1358 | public override OpenMetaverse.Vector3 Size |
1359 | { | 1359 | { |
1360 | get { return base.Size; } | 1360 | get { return base.Size; } |
1361 | set { base.Size = value; } | 1361 | set { base.Size = value; } |
1362 | } | 1362 | } |
1363 | 1363 | ||
1364 | public override PhysicsVector Acceleration | 1364 | public override OpenMetaverse.Vector3 Acceleration |
1365 | { | 1365 | { |
1366 | get { return base.Acceleration; } | 1366 | get { return base.Acceleration; } |
1367 | } | 1367 | } |
@@ -1390,17 +1390,17 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1390 | set { base.Kinematic = value; } | 1390 | set { base.Kinematic = value; } |
1391 | } | 1391 | } |
1392 | 1392 | ||
1393 | public override void SetAcceleration(PhysicsVector accel) | 1393 | public override void SetAcceleration(OpenMetaverse.Vector3 accel) |
1394 | { | 1394 | { |
1395 | base.SetAcceleration(accel); | 1395 | base.SetAcceleration(accel); |
1396 | } | 1396 | } |
1397 | 1397 | ||
1398 | public override void AddForce(PhysicsVector force, bool pushforce) | 1398 | public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) |
1399 | { | 1399 | { |
1400 | base.AddForce(force, pushforce); | 1400 | base.AddForce(force, pushforce); |
1401 | } | 1401 | } |
1402 | 1402 | ||
1403 | public override void SetMomentum(PhysicsVector momentum) | 1403 | public override void SetMomentum(OpenMetaverse.Vector3 momentum) |
1404 | { | 1404 | { |
1405 | base.SetMomentum(momentum); | 1405 | base.SetMomentum(momentum); |
1406 | } | 1406 | } |
@@ -1450,7 +1450,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1450 | m.Translation = v3; | 1450 | m.Translation = v3; |
1451 | rigidBody.WorldTransform = m; | 1451 | rigidBody.WorldTransform = m; |
1452 | //When an Avie touch the ground it's vertical velocity it's reduced to ZERO | 1452 | //When an Avie touch the ground it's vertical velocity it's reduced to ZERO |
1453 | Speed(new PhysicsVector(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); | 1453 | Speed(new OpenMetaverse.Vector3(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); |
1454 | } | 1454 | } |
1455 | } | 1455 | } |
1456 | 1456 | ||
@@ -1472,7 +1472,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1472 | //For now all prims have the same density, all prims are made of water. Be water my friend! :D | 1472 | //For now all prims have the same density, all prims are made of water. Be water my friend! :D |
1473 | private const float _density = 1000.0f; | 1473 | private const float _density = 1000.0f; |
1474 | private BulletXScene _parent_scene; | 1474 | private BulletXScene _parent_scene; |
1475 | private PhysicsVector m_prev_position = new PhysicsVector(0, 0, 0); | 1475 | private OpenMetaverse.Vector3 m_prev_position; |
1476 | private bool m_lastUpdateSent = false; | 1476 | private bool m_lastUpdateSent = false; |
1477 | //added by jed zhu | 1477 | //added by jed zhu |
1478 | private IMesh _mesh; | 1478 | private IMesh _mesh; |
@@ -1480,17 +1480,17 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1480 | 1480 | ||
1481 | 1481 | ||
1482 | 1482 | ||
1483 | public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector size, | 1483 | public BulletXPrim(String primName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 size, |
1484 | OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) | 1484 | OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool isPhysical) |
1485 | : this( | 1485 | : this( |
1486 | primName, parent_scene, pos, new PhysicsVector(), size, new PhysicsVector(), rotation, mesh, pbs, | 1486 | primName, parent_scene, pos, OpenMetaverse.Vector3.Zero, size, OpenMetaverse.Vector3.Zero, rotation, mesh, pbs, |
1487 | isPhysical) | 1487 | isPhysical) |
1488 | { | 1488 | { |
1489 | } | 1489 | } |
1490 | 1490 | ||
1491 | public BulletXPrim(String primName, BulletXScene parent_scene, PhysicsVector pos, PhysicsVector velocity, | 1491 | public BulletXPrim(String primName, BulletXScene parent_scene, OpenMetaverse.Vector3 pos, OpenMetaverse.Vector3 velocity, |
1492 | PhysicsVector size, | 1492 | OpenMetaverse.Vector3 size, |
1493 | PhysicsVector acceleration, OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, | 1493 | OpenMetaverse.Vector3 acceleration, OpenMetaverse.Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, |
1494 | bool isPhysical) | 1494 | bool isPhysical) |
1495 | : base(primName) | 1495 | : base(primName) |
1496 | { | 1496 | { |
@@ -1501,7 +1501,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1501 | 1501 | ||
1502 | _position = pos; | 1502 | _position = pos; |
1503 | _physical = isPhysical; | 1503 | _physical = isPhysical; |
1504 | _velocity = _physical ? velocity : new PhysicsVector(); | 1504 | _velocity = _physical ? velocity : OpenMetaverse.Vector3.Zero; |
1505 | _size = size; | 1505 | _size = size; |
1506 | _acceleration = acceleration; | 1506 | _acceleration = acceleration; |
1507 | _orientation = rotation; | 1507 | _orientation = rotation; |
@@ -1517,19 +1517,19 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1517 | set { return; } | 1517 | set { return; } |
1518 | } | 1518 | } |
1519 | 1519 | ||
1520 | public override PhysicsVector Position | 1520 | public override OpenMetaverse.Vector3 Position |
1521 | { | 1521 | { |
1522 | get { return base.Position; } | 1522 | get { return base.Position; } |
1523 | set { base.Position = value; } | 1523 | set { base.Position = value; } |
1524 | } | 1524 | } |
1525 | 1525 | ||
1526 | public override PhysicsVector Velocity | 1526 | public override OpenMetaverse.Vector3 Velocity |
1527 | { | 1527 | { |
1528 | get { return base.Velocity; } | 1528 | get { return base.Velocity; } |
1529 | set { base.Velocity = value; } | 1529 | set { base.Velocity = value; } |
1530 | } | 1530 | } |
1531 | 1531 | ||
1532 | public override PhysicsVector Size | 1532 | public override OpenMetaverse.Vector3 Size |
1533 | { | 1533 | { |
1534 | get { return _size; } | 1534 | get { return _size; } |
1535 | set | 1535 | set |
@@ -1542,7 +1542,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1542 | } | 1542 | } |
1543 | } | 1543 | } |
1544 | 1544 | ||
1545 | public override PhysicsVector Acceleration | 1545 | public override OpenMetaverse.Vector3 Acceleration |
1546 | { | 1546 | { |
1547 | get { return base.Acceleration; } | 1547 | get { return base.Acceleration; } |
1548 | } | 1548 | } |
@@ -1603,7 +1603,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1603 | set { base.Kinematic = value; } | 1603 | set { base.Kinematic = value; } |
1604 | } | 1604 | } |
1605 | 1605 | ||
1606 | public override void SetAcceleration(PhysicsVector accel) | 1606 | public override void SetAcceleration(OpenMetaverse.Vector3 accel) |
1607 | { | 1607 | { |
1608 | lock (BulletXScene.BulletXLock) | 1608 | lock (BulletXScene.BulletXLock) |
1609 | { | 1609 | { |
@@ -1611,12 +1611,12 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1611 | } | 1611 | } |
1612 | } | 1612 | } |
1613 | 1613 | ||
1614 | public override void AddForce(PhysicsVector force, bool pushforce) | 1614 | public override void AddForce(OpenMetaverse.Vector3 force, bool pushforce) |
1615 | { | 1615 | { |
1616 | base.AddForce(force,pushforce); | 1616 | base.AddForce(force,pushforce); |
1617 | } | 1617 | } |
1618 | 1618 | ||
1619 | public override void SetMomentum(PhysicsVector momentum) | 1619 | public override void SetMomentum(OpenMetaverse.Vector3 momentum) |
1620 | { | 1620 | { |
1621 | base.SetMomentum(momentum); | 1621 | base.SetMomentum(momentum); |
1622 | } | 1622 | } |
@@ -1633,7 +1633,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1633 | //When a Prim touch the ground it's vertical velocity it's reduced to ZERO | 1633 | //When a Prim touch the ground it's vertical velocity it's reduced to ZERO |
1634 | //Static objects don't have linear velocity | 1634 | //Static objects don't have linear velocity |
1635 | if (_physical) | 1635 | if (_physical) |
1636 | Speed(new PhysicsVector(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); | 1636 | Speed(new OpenMetaverse.Vector3(rigidBody.LinearVelocity.X, rigidBody.LinearVelocity.Y, 0.0f)); |
1637 | } | 1637 | } |
1638 | } | 1638 | } |
1639 | 1639 | ||
@@ -1652,7 +1652,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1652 | { | 1652 | { |
1653 | if (!m_lastUpdateSent) | 1653 | if (!m_lastUpdateSent) |
1654 | { | 1654 | { |
1655 | _velocity = new PhysicsVector(0, 0, 0); | 1655 | _velocity = OpenMetaverse.Vector3.Zero; |
1656 | base.ScheduleTerseUpdate(); | 1656 | base.ScheduleTerseUpdate(); |
1657 | m_lastUpdateSent = true; | 1657 | m_lastUpdateSent = true; |
1658 | } | 1658 | } |
@@ -1674,8 +1674,8 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1674 | 1674 | ||
1675 | #region Methods for updating values of RigidBody | 1675 | #region Methods for updating values of RigidBody |
1676 | 1676 | ||
1677 | protected internal void CreateRigidBody(BulletXScene parent_scene, IMesh mesh, PhysicsVector pos, | 1677 | protected internal void CreateRigidBody(BulletXScene parent_scene, IMesh mesh, OpenMetaverse.Vector3 pos, |
1678 | PhysicsVector size) | 1678 | OpenMetaverse.Vector3 size) |
1679 | { | 1679 | { |
1680 | //For RigidBody Constructor. The next values might change | 1680 | //For RigidBody Constructor. The next values might change |
1681 | float _linearDamping = 0.0f; | 1681 | float _linearDamping = 0.0f; |
@@ -1703,7 +1703,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1703 | Vector3[] v3Vertices = new Vector3[iVertexCount]; | 1703 | Vector3[] v3Vertices = new Vector3[iVertexCount]; |
1704 | for (int i = 0; i < iVertexCount; i++) | 1704 | for (int i = 0; i < iVertexCount; i++) |
1705 | { | 1705 | { |
1706 | PhysicsVector v = mesh.getVertexList()[i]; | 1706 | OpenMetaverse.Vector3 v = mesh.getVertexList()[i]; |
1707 | if (v != null) // Note, null has special meaning. See meshing code for details | 1707 | if (v != null) // Note, null has special meaning. See meshing code for details |
1708 | v3Vertices[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); | 1708 | v3Vertices[i] = BulletXMaths.PhysicsVectorToXnaVector3(v); |
1709 | else | 1709 | else |
@@ -1729,7 +1729,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1729 | } | 1729 | } |
1730 | } | 1730 | } |
1731 | 1731 | ||
1732 | protected internal void ReCreateRigidBody(PhysicsVector size) | 1732 | protected internal void ReCreateRigidBody(OpenMetaverse.Vector3 size) |
1733 | { | 1733 | { |
1734 | //There is a bug when trying to remove a rigidBody that is colliding with something.. | 1734 | //There is a bug when trying to remove a rigidBody that is colliding with something.. |
1735 | try | 1735 | try |
@@ -1749,7 +1749,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1749 | GC.Collect(); | 1749 | GC.Collect(); |
1750 | } | 1750 | } |
1751 | 1751 | ||
1752 | protected internal override void ReSize(PhysicsVector _newSize) | 1752 | protected internal override void ReSize(OpenMetaverse.Vector3 _newSize) |
1753 | { | 1753 | { |
1754 | //I wonder to know how to resize with a simple instruction in BulletX. It seems that for now there isn't | 1754 | //I wonder to know how to resize with a simple instruction in BulletX. It seems that for now there isn't |
1755 | //so i have to do it manually. That's recreating rigidbody | 1755 | //so i have to do it manually. That's recreating rigidbody |
@@ -1764,8 +1764,8 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1764 | /// </summary> | 1764 | /// </summary> |
1765 | internal class BulletXPlanet | 1765 | internal class BulletXPlanet |
1766 | { | 1766 | { |
1767 | private PhysicsVector _staticPosition; | 1767 | private OpenMetaverse.Vector3 _staticPosition; |
1768 | // private PhysicsVector _staticVelocity; | 1768 | // private Vector3 _staticVelocity; |
1769 | // private OpenMetaverse.Quaternion _staticOrientation; | 1769 | // private OpenMetaverse.Quaternion _staticOrientation; |
1770 | private float _mass; | 1770 | private float _mass; |
1771 | // private BulletXScene _parentscene; | 1771 | // private BulletXScene _parentscene; |
@@ -1779,7 +1779,7 @@ namespace OpenSim.Region.Physics.BulletXPlugin | |||
1779 | 1779 | ||
1780 | internal BulletXPlanet(BulletXScene parent_scene, float[] heightField) | 1780 | internal BulletXPlanet(BulletXScene parent_scene, float[] heightField) |
1781 | { | 1781 | { |
1782 | _staticPosition = new PhysicsVector(BulletXScene.MaxXY/2, BulletXScene.MaxXY/2, 0); | 1782 | _staticPosition = new OpenMetaverse.Vector3(BulletXScene.MaxXY / 2, BulletXScene.MaxXY / 2, 0); |
1783 | // _staticVelocity = new PhysicsVector(); | 1783 | // _staticVelocity = new PhysicsVector(); |
1784 | // _staticOrientation = OpenMetaverse.Quaternion.Identity; | 1784 | // _staticOrientation = OpenMetaverse.Quaternion.Identity; |
1785 | _mass = 0; //No active | 1785 | _mass = 0; //No active |
diff --git a/OpenSim/Region/Physics/Manager/IMesher.cs b/OpenSim/Region/Physics/Manager/IMesher.cs index 1a8c948..1181b8d 100644 --- a/OpenSim/Region/Physics/Manager/IMesher.cs +++ b/OpenSim/Region/Physics/Manager/IMesher.cs | |||
@@ -28,13 +28,14 @@ | |||
28 | using System; | 28 | using System; |
29 | using System.Collections.Generic; | 29 | using System.Collections.Generic; |
30 | using OpenSim.Framework; | 30 | using OpenSim.Framework; |
31 | using OpenMetaverse; | ||
31 | 32 | ||
32 | namespace OpenSim.Region.Physics.Manager | 33 | namespace OpenSim.Region.Physics.Manager |
33 | { | 34 | { |
34 | public interface IMesher | 35 | public interface IMesher |
35 | { | 36 | { |
36 | IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod); | 37 | IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod); |
37 | IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical); | 38 | IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical); |
38 | } | 39 | } |
39 | 40 | ||
40 | public interface IVertex | 41 | public interface IVertex |
@@ -43,7 +44,7 @@ namespace OpenSim.Region.Physics.Manager | |||
43 | 44 | ||
44 | public interface IMesh | 45 | public interface IMesh |
45 | { | 46 | { |
46 | List<PhysicsVector> getVertexList(); | 47 | List<Vector3> getVertexList(); |
47 | int[] getIndexListAsInt(); | 48 | int[] getIndexListAsInt(); |
48 | int[] getIndexListAsIntLocked(); | 49 | int[] getIndexListAsIntLocked(); |
49 | float[] getVertexListAsFloatLocked(); | 50 | float[] getVertexListAsFloatLocked(); |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsActor.cs b/OpenSim/Region/Physics/Manager/PhysicsActor.cs index 566746a..ea4db70 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsActor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsActor.cs | |||
@@ -32,8 +32,8 @@ using OpenMetaverse; | |||
32 | 32 | ||
33 | namespace OpenSim.Region.Physics.Manager | 33 | namespace OpenSim.Region.Physics.Manager |
34 | { | 34 | { |
35 | public delegate void PositionUpdate(PhysicsVector position); | 35 | public delegate void PositionUpdate(Vector3 position); |
36 | public delegate void VelocityUpdate(PhysicsVector velocity); | 36 | public delegate void VelocityUpdate(Vector3 velocity); |
37 | public delegate void OrientationUpdate(Quaternion orientation); | 37 | public delegate void OrientationUpdate(Quaternion orientation); |
38 | 38 | ||
39 | public enum ActorTypes : int | 39 | public enum ActorTypes : int |
@@ -106,7 +106,7 @@ namespace OpenSim.Region.Physics.Manager | |||
106 | { | 106 | { |
107 | public delegate void RequestTerseUpdate(); | 107 | public delegate void RequestTerseUpdate(); |
108 | public delegate void CollisionUpdate(EventArgs e); | 108 | public delegate void CollisionUpdate(EventArgs e); |
109 | public delegate void OutOfBounds(PhysicsVector pos); | 109 | public delegate void OutOfBounds(Vector3 pos); |
110 | 110 | ||
111 | // disable warning: public events | 111 | // disable warning: public events |
112 | #pragma warning disable 67 | 112 | #pragma warning disable 67 |
@@ -125,7 +125,7 @@ namespace OpenSim.Region.Physics.Manager | |||
125 | 125 | ||
126 | public abstract bool Stopped { get; } | 126 | public abstract bool Stopped { get; } |
127 | 127 | ||
128 | public abstract PhysicsVector Size { get; set; } | 128 | public abstract Vector3 Size { get; set; } |
129 | 129 | ||
130 | public abstract PrimitiveBaseShape Shape { set; } | 130 | public abstract PrimitiveBaseShape Shape { set; } |
131 | 131 | ||
@@ -144,7 +144,7 @@ namespace OpenSim.Region.Physics.Manager | |||
144 | 144 | ||
145 | public abstract void delink(); | 145 | public abstract void delink(); |
146 | 146 | ||
147 | public abstract void LockAngularMotion(PhysicsVector axis); | 147 | public abstract void LockAngularMotion(Vector3 axis); |
148 | 148 | ||
149 | public virtual void RequestPhysicsterseUpdate() | 149 | public virtual void RequestPhysicsterseUpdate() |
150 | { | 150 | { |
@@ -159,7 +159,7 @@ namespace OpenSim.Region.Physics.Manager | |||
159 | } | 159 | } |
160 | } | 160 | } |
161 | 161 | ||
162 | public virtual void RaiseOutOfBounds(PhysicsVector pos) | 162 | public virtual void RaiseOutOfBounds(Vector3 pos) |
163 | { | 163 | { |
164 | // Make a temporary copy of the event to avoid possibility of | 164 | // Make a temporary copy of the event to avoid possibility of |
165 | // a race condition if the last subscriber unsubscribes | 165 | // a race condition if the last subscriber unsubscribes |
@@ -187,23 +187,23 @@ namespace OpenSim.Region.Physics.Manager | |||
187 | 187 | ||
188 | } | 188 | } |
189 | 189 | ||
190 | public abstract PhysicsVector Position { get; set; } | 190 | public abstract Vector3 Position { get; set; } |
191 | public abstract float Mass { get; } | 191 | public abstract float Mass { get; } |
192 | public abstract PhysicsVector Force { get; set; } | 192 | public abstract Vector3 Force { get; set; } |
193 | 193 | ||
194 | public abstract int VehicleType { get; set; } | 194 | public abstract int VehicleType { get; set; } |
195 | public abstract void VehicleFloatParam(int param, float value); | 195 | public abstract void VehicleFloatParam(int param, float value); |
196 | public abstract void VehicleVectorParam(int param, PhysicsVector value); | 196 | public abstract void VehicleVectorParam(int param, Vector3 value); |
197 | public abstract void VehicleRotationParam(int param, Quaternion rotation); | 197 | public abstract void VehicleRotationParam(int param, Quaternion rotation); |
198 | 198 | ||
199 | public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more | 199 | public abstract void SetVolumeDetect(int param); // Allows the detection of collisions with inherently non-physical prims. see llVolumeDetect for more |
200 | 200 | ||
201 | public abstract PhysicsVector GeometricCenter { get; } | 201 | public abstract Vector3 GeometricCenter { get; } |
202 | public abstract PhysicsVector CenterOfMass { get; } | 202 | public abstract Vector3 CenterOfMass { get; } |
203 | public abstract PhysicsVector Velocity { get; set; } | 203 | public abstract Vector3 Velocity { get; set; } |
204 | public abstract PhysicsVector Torque { get; set; } | 204 | public abstract Vector3 Torque { get; set; } |
205 | public abstract float CollisionScore { get; set;} | 205 | public abstract float CollisionScore { get; set;} |
206 | public abstract PhysicsVector Acceleration { get; } | 206 | public abstract Vector3 Acceleration { get; } |
207 | public abstract Quaternion Orientation { get; set; } | 207 | public abstract Quaternion Orientation { get; set; } |
208 | public abstract int PhysicsActorType { get; set; } | 208 | public abstract int PhysicsActorType { get; set; } |
209 | public abstract bool IsPhysical { get; set; } | 209 | public abstract bool IsPhysical { get; set; } |
@@ -214,12 +214,12 @@ namespace OpenSim.Region.Physics.Manager | |||
214 | public abstract bool CollidingGround { get; set; } | 214 | public abstract bool CollidingGround { get; set; } |
215 | public abstract bool CollidingObj { get; set; } | 215 | public abstract bool CollidingObj { get; set; } |
216 | public abstract bool FloatOnWater { set; } | 216 | public abstract bool FloatOnWater { set; } |
217 | public abstract PhysicsVector RotationalVelocity { get; set; } | 217 | public abstract Vector3 RotationalVelocity { get; set; } |
218 | public abstract bool Kinematic { get; set; } | 218 | public abstract bool Kinematic { get; set; } |
219 | public abstract float Buoyancy { get; set; } | 219 | public abstract float Buoyancy { get; set; } |
220 | 220 | ||
221 | // Used for MoveTo | 221 | // Used for MoveTo |
222 | public abstract PhysicsVector PIDTarget { set;} | 222 | public abstract Vector3 PIDTarget { set; } |
223 | public abstract bool PIDActive { set;} | 223 | public abstract bool PIDActive { set;} |
224 | public abstract float PIDTau { set; } | 224 | public abstract float PIDTau { set; } |
225 | 225 | ||
@@ -251,9 +251,9 @@ namespace OpenSim.Region.Physics.Manager | |||
251 | get{ return false; } | 251 | get{ return false; } |
252 | } | 252 | } |
253 | 253 | ||
254 | public override PhysicsVector Position | 254 | public override Vector3 Position |
255 | { | 255 | { |
256 | get { return PhysicsVector.Zero; } | 256 | get { return Vector3.Zero; } |
257 | set { return; } | 257 | set { return; } |
258 | } | 258 | } |
259 | 259 | ||
@@ -301,9 +301,9 @@ namespace OpenSim.Region.Physics.Manager | |||
301 | set { return; } | 301 | set { return; } |
302 | } | 302 | } |
303 | 303 | ||
304 | public override PhysicsVector Size | 304 | public override Vector3 Size |
305 | { | 305 | { |
306 | get { return PhysicsVector.Zero; } | 306 | get { return Vector3.Zero; } |
307 | set { return; } | 307 | set { return; } |
308 | } | 308 | } |
309 | 309 | ||
@@ -312,9 +312,9 @@ namespace OpenSim.Region.Physics.Manager | |||
312 | get { return 0f; } | 312 | get { return 0f; } |
313 | } | 313 | } |
314 | 314 | ||
315 | public override PhysicsVector Force | 315 | public override Vector3 Force |
316 | { | 316 | { |
317 | get { return PhysicsVector.Zero; } | 317 | get { return Vector3.Zero; } |
318 | set { return; } | 318 | set { return; } |
319 | } | 319 | } |
320 | 320 | ||
@@ -329,7 +329,7 @@ namespace OpenSim.Region.Physics.Manager | |||
329 | 329 | ||
330 | } | 330 | } |
331 | 331 | ||
332 | public override void VehicleVectorParam(int param, PhysicsVector value) | 332 | public override void VehicleVectorParam(int param, Vector3 value) |
333 | { | 333 | { |
334 | 334 | ||
335 | } | 335 | } |
@@ -349,14 +349,14 @@ namespace OpenSim.Region.Physics.Manager | |||
349 | 349 | ||
350 | } | 350 | } |
351 | 351 | ||
352 | public override PhysicsVector CenterOfMass | 352 | public override Vector3 CenterOfMass |
353 | { | 353 | { |
354 | get { return PhysicsVector.Zero; } | 354 | get { return Vector3.Zero; } |
355 | } | 355 | } |
356 | 356 | ||
357 | public override PhysicsVector GeometricCenter | 357 | public override Vector3 GeometricCenter |
358 | { | 358 | { |
359 | get { return PhysicsVector.Zero; } | 359 | get { return Vector3.Zero; } |
360 | } | 360 | } |
361 | 361 | ||
362 | public override PrimitiveBaseShape Shape | 362 | public override PrimitiveBaseShape Shape |
@@ -364,15 +364,15 @@ namespace OpenSim.Region.Physics.Manager | |||
364 | set { return; } | 364 | set { return; } |
365 | } | 365 | } |
366 | 366 | ||
367 | public override PhysicsVector Velocity | 367 | public override Vector3 Velocity |
368 | { | 368 | { |
369 | get { return PhysicsVector.Zero; } | 369 | get { return Vector3.Zero; } |
370 | set { return; } | 370 | set { return; } |
371 | } | 371 | } |
372 | 372 | ||
373 | public override PhysicsVector Torque | 373 | public override Vector3 Torque |
374 | { | 374 | { |
375 | get { return PhysicsVector.Zero; } | 375 | get { return Vector3.Zero; } |
376 | set { return; } | 376 | set { return; } |
377 | } | 377 | } |
378 | 378 | ||
@@ -392,9 +392,9 @@ namespace OpenSim.Region.Physics.Manager | |||
392 | set { } | 392 | set { } |
393 | } | 393 | } |
394 | 394 | ||
395 | public override PhysicsVector Acceleration | 395 | public override Vector3 Acceleration |
396 | { | 396 | { |
397 | get { return PhysicsVector.Zero; } | 397 | get { return Vector3.Zero; } |
398 | } | 398 | } |
399 | 399 | ||
400 | public override bool IsPhysical | 400 | public override bool IsPhysical |
@@ -441,26 +441,26 @@ namespace OpenSim.Region.Physics.Manager | |||
441 | { | 441 | { |
442 | } | 442 | } |
443 | 443 | ||
444 | public override void LockAngularMotion(PhysicsVector axis) | 444 | public override void LockAngularMotion(Vector3 axis) |
445 | { | 445 | { |
446 | } | 446 | } |
447 | 447 | ||
448 | public override void AddForce(PhysicsVector force, bool pushforce) | 448 | public override void AddForce(Vector3 force, bool pushforce) |
449 | { | 449 | { |
450 | } | 450 | } |
451 | 451 | ||
452 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 452 | public override void AddAngularForce(Vector3 force, bool pushforce) |
453 | { | 453 | { |
454 | 454 | ||
455 | } | 455 | } |
456 | 456 | ||
457 | public override PhysicsVector RotationalVelocity | 457 | public override Vector3 RotationalVelocity |
458 | { | 458 | { |
459 | get { return PhysicsVector.Zero; } | 459 | get { return Vector3.Zero; } |
460 | set { return; } | 460 | set { return; } |
461 | } | 461 | } |
462 | 462 | ||
463 | public override PhysicsVector PIDTarget { set { return; } } | 463 | public override Vector3 PIDTarget { set { return; } } |
464 | public override bool PIDActive { set { return; } } | 464 | public override bool PIDActive { set { return; } } |
465 | public override float PIDTau { set { return; } } | 465 | public override float PIDTau { set { return; } } |
466 | 466 | ||
@@ -475,7 +475,7 @@ namespace OpenSim.Region.Physics.Manager | |||
475 | public override float APIDDamping { set { return; } } | 475 | public override float APIDDamping { set { return; } } |
476 | 476 | ||
477 | 477 | ||
478 | public override void SetMomentum(PhysicsVector momentum) | 478 | public override void SetMomentum(Vector3 momentum) |
479 | { | 479 | { |
480 | } | 480 | } |
481 | 481 | ||
diff --git a/OpenSim/Region/Physics/Manager/PhysicsJoint.cs b/OpenSim/Region/Physics/Manager/PhysicsJoint.cs index f463597..b685d04 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsJoint.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsJoint.cs | |||
@@ -44,7 +44,7 @@ namespace OpenSim.Region.Physics.Manager | |||
44 | public PhysicsJointType Type; | 44 | public PhysicsJointType Type; |
45 | public string RawParams; | 45 | public string RawParams; |
46 | public List<string> BodyNames = new List<string>(); | 46 | public List<string> BodyNames = new List<string>(); |
47 | public PhysicsVector Position; // global coords | 47 | public Vector3 Position; // global coords |
48 | public Quaternion Rotation; // global coords | 48 | public Quaternion Rotation; // global coords |
49 | public string ObjectNameInScene; // proxy object in scene that represents the joint position/orientation | 49 | public string ObjectNameInScene; // proxy object in scene that represents the joint position/orientation |
50 | public string TrackedBodyName; // body name that this joint is attached to (ObjectNameInScene will follow TrackedBodyName) | 50 | public string TrackedBodyName; // body name that this joint is attached to (ObjectNameInScene will follow TrackedBodyName) |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsScene.cs b/OpenSim/Region/Physics/Manager/PhysicsScene.cs index 6dd26bb..bb0d18e 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsScene.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsScene.cs | |||
@@ -64,23 +64,23 @@ namespace OpenSim.Region.Physics.Manager | |||
64 | 64 | ||
65 | public abstract void Initialise(IMesher meshmerizer, IConfigSource config); | 65 | public abstract void Initialise(IMesher meshmerizer, IConfigSource config); |
66 | 66 | ||
67 | public abstract PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying); | 67 | public abstract PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying); |
68 | 68 | ||
69 | public abstract void RemoveAvatar(PhysicsActor actor); | 69 | public abstract void RemoveAvatar(PhysicsActor actor); |
70 | 70 | ||
71 | public abstract void RemovePrim(PhysicsActor prim); | 71 | public abstract void RemovePrim(PhysicsActor prim); |
72 | 72 | ||
73 | public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 73 | public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
74 | PhysicsVector size, Quaternion rotation); //To be removed | 74 | Vector3 size, Quaternion rotation); //To be removed |
75 | public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 75 | public abstract PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
76 | PhysicsVector size, Quaternion rotation, bool isPhysical); | 76 | Vector3 size, Quaternion rotation, bool isPhysical); |
77 | 77 | ||
78 | public virtual bool SupportsNINJAJoints | 78 | public virtual bool SupportsNINJAJoints |
79 | { | 79 | { |
80 | get { return false; } | 80 | get { return false; } |
81 | } | 81 | } |
82 | 82 | ||
83 | public virtual PhysicsJoint RequestJointCreation(string objectNameInScene, PhysicsJointType jointType, PhysicsVector position, | 83 | public virtual PhysicsJoint RequestJointCreation(string objectNameInScene, PhysicsJointType jointType, Vector3 position, |
84 | Quaternion rotation, string parms, List<string> bodyNames, string trackedBodyName, Quaternion localRotation) | 84 | Quaternion rotation, string parms, List<string> bodyNames, string trackedBodyName, Quaternion localRotation) |
85 | { return null; } | 85 | { return null; } |
86 | 86 | ||
@@ -129,11 +129,11 @@ namespace OpenSim.Region.Physics.Manager | |||
129 | } | 129 | } |
130 | } | 130 | } |
131 | 131 | ||
132 | public virtual PhysicsVector GetJointAnchor(PhysicsJoint joint) | 132 | public virtual Vector3 GetJointAnchor(PhysicsJoint joint) |
133 | { return null; } | 133 | { return Vector3.Zero; } |
134 | 134 | ||
135 | public virtual PhysicsVector GetJointAxis(PhysicsJoint joint) | 135 | public virtual Vector3 GetJointAxis(PhysicsJoint joint) |
136 | { return null; } | 136 | { return Vector3.Zero; } |
137 | 137 | ||
138 | 138 | ||
139 | public abstract void AddPhysicsActorTaint(PhysicsActor prim); | 139 | public abstract void AddPhysicsActorTaint(PhysicsActor prim); |
@@ -212,7 +212,7 @@ namespace OpenSim.Region.Physics.Manager | |||
212 | // Does nothing right now | 212 | // Does nothing right now |
213 | } | 213 | } |
214 | 214 | ||
215 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 215 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
216 | { | 216 | { |
217 | m_log.InfoFormat("[PHYSICS]: NullPhysicsScene : AddAvatar({0})", position); | 217 | m_log.InfoFormat("[PHYSICS]: NullPhysicsScene : AddAvatar({0})", position); |
218 | return PhysicsActor.Null; | 218 | return PhysicsActor.Null; |
@@ -231,21 +231,21 @@ namespace OpenSim.Region.Physics.Manager | |||
231 | } | 231 | } |
232 | 232 | ||
233 | /* | 233 | /* |
234 | public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) | 234 | public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation) |
235 | { | 235 | { |
236 | m_log.InfoFormat("NullPhysicsScene : AddPrim({0},{1})", position, size); | 236 | m_log.InfoFormat("NullPhysicsScene : AddPrim({0},{1})", position, size); |
237 | return PhysicsActor.Null; | 237 | return PhysicsActor.Null; |
238 | } | 238 | } |
239 | */ | 239 | */ |
240 | 240 | ||
241 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 241 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
242 | PhysicsVector size, Quaternion rotation) //To be removed | 242 | Vector3 size, Quaternion rotation) //To be removed |
243 | { | 243 | { |
244 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 244 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
245 | } | 245 | } |
246 | 246 | ||
247 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 247 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
248 | PhysicsVector size, Quaternion rotation, bool isPhysical) | 248 | Vector3 size, Quaternion rotation, bool isPhysical) |
249 | { | 249 | { |
250 | m_log.InfoFormat("[PHYSICS]: NullPhysicsScene : AddPrim({0},{1})", position, size); | 250 | m_log.InfoFormat("[PHYSICS]: NullPhysicsScene : AddPrim({0},{1})", position, size); |
251 | return PhysicsActor.Null; | 251 | return PhysicsActor.Null; |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsSensor.cs b/OpenSim/Region/Physics/Manager/PhysicsSensor.cs index 090ad52..f480d71 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsSensor.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsSensor.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Timers; | 29 | using System.Timers; |
30 | using OpenMetaverse; | ||
30 | 31 | ||
31 | namespace OpenSim.Region.Physics.Manager | 32 | namespace OpenSim.Region.Physics.Manager |
32 | { | 33 | { |
@@ -46,7 +47,7 @@ namespace OpenSim.Region.Physics.Manager | |||
46 | { | 47 | { |
47 | get { return new NullPhysicsSensor(); } | 48 | get { return new NullPhysicsSensor(); } |
48 | } | 49 | } |
49 | public abstract PhysicsVector Position {get; set;} | 50 | public abstract Vector3 Position { get; set; } |
50 | public abstract void TimerCallback (object obj, ElapsedEventArgs eea); | 51 | public abstract void TimerCallback (object obj, ElapsedEventArgs eea); |
51 | public abstract float radianarc {get; set;} | 52 | public abstract float radianarc {get; set;} |
52 | public abstract string targetname {get; set;} | 53 | public abstract string targetname {get; set;} |
@@ -58,9 +59,9 @@ namespace OpenSim.Region.Physics.Manager | |||
58 | 59 | ||
59 | public class NullPhysicsSensor : PhysicsSensor | 60 | public class NullPhysicsSensor : PhysicsSensor |
60 | { | 61 | { |
61 | public override PhysicsVector Position | 62 | public override Vector3 Position |
62 | { | 63 | { |
63 | get { return PhysicsVector.Zero; } | 64 | get { return Vector3.Zero; } |
64 | set { return; } | 65 | set { return; } |
65 | } | 66 | } |
66 | public override void TimerCallback(object obj, ElapsedEventArgs eea) | 67 | public override void TimerCallback(object obj, ElapsedEventArgs eea) |
diff --git a/OpenSim/Region/Physics/Manager/PhysicsVector.cs b/OpenSim/Region/Physics/Manager/PhysicsVector.cs index d6f4d0d..f60a636 100644 --- a/OpenSim/Region/Physics/Manager/PhysicsVector.cs +++ b/OpenSim/Region/Physics/Manager/PhysicsVector.cs | |||
@@ -29,24 +29,24 @@ using System; | |||
29 | 29 | ||
30 | namespace OpenSim.Region.Physics.Manager | 30 | namespace OpenSim.Region.Physics.Manager |
31 | { | 31 | { |
32 | public class PhysicsVector | 32 | /*public class PhysicsVector |
33 | { | 33 | { |
34 | public float X; | 34 | public float X; |
35 | public float Y; | 35 | public float Y; |
36 | public float Z; | 36 | public float Z; |
37 | 37 | ||
38 | public PhysicsVector() | 38 | public Vector3() |
39 | { | 39 | { |
40 | } | 40 | } |
41 | 41 | ||
42 | public PhysicsVector(float x, float y, float z) | 42 | public Vector3(float x, float y, float z) |
43 | { | 43 | { |
44 | X = x; | 44 | X = x; |
45 | Y = y; | 45 | Y = y; |
46 | Z = z; | 46 | Z = z; |
47 | } | 47 | } |
48 | 48 | ||
49 | public PhysicsVector(PhysicsVector pv) : this(pv.X, pv.Y, pv.Z) | 49 | public Vector3(Vector3 pv) : this(pv.X, pv.Y, pv.Z) |
50 | { | 50 | { |
51 | } | 51 | } |
52 | 52 | ||
@@ -115,17 +115,17 @@ namespace OpenSim.Region.Physics.Manager | |||
115 | } | 115 | } |
116 | 116 | ||
117 | // Operations | 117 | // Operations |
118 | public static PhysicsVector operator +(PhysicsVector a, PhysicsVector b) | 118 | public static PhysicsVector operator +(Vector3 a, Vector3 b) |
119 | { | 119 | { |
120 | return new PhysicsVector(a.X + b.X, a.Y + b.Y, a.Z + b.Z); | 120 | return new PhysicsVector(a.X + b.X, a.Y + b.Y, a.Z + b.Z); |
121 | } | 121 | } |
122 | 122 | ||
123 | public static PhysicsVector operator -(PhysicsVector a, PhysicsVector b) | 123 | public static PhysicsVector operator -(Vector3 a, Vector3 b) |
124 | { | 124 | { |
125 | return new PhysicsVector(a.X - b.X, a.Y - b.Y, a.Z - b.Z); | 125 | return new PhysicsVector(a.X - b.X, a.Y - b.Y, a.Z - b.Z); |
126 | } | 126 | } |
127 | 127 | ||
128 | public static PhysicsVector cross(PhysicsVector a, PhysicsVector b) | 128 | public static PhysicsVector cross(Vector3 a, Vector3 b) |
129 | { | 129 | { |
130 | return new PhysicsVector(a.Y*b.Z - a.Z*b.Y, a.Z*b.X - a.X*b.Z, a.X*b.Y - a.Y*b.X); | 130 | return new PhysicsVector(a.Y*b.Z - a.Z*b.Y, a.Z*b.X - a.X*b.Z, a.X*b.Y - a.Y*b.X); |
131 | } | 131 | } |
@@ -135,7 +135,7 @@ namespace OpenSim.Region.Physics.Manager | |||
135 | return (float) Math.Sqrt(X*X + Y*Y + Z*Z); | 135 | return (float) Math.Sqrt(X*X + Y*Y + Z*Z); |
136 | } | 136 | } |
137 | 137 | ||
138 | public static float GetDistanceTo(PhysicsVector a, PhysicsVector b) | 138 | public static float GetDistanceTo(Vector3 a, Vector3 b) |
139 | { | 139 | { |
140 | float dx = a.X - b.X; | 140 | float dx = a.X - b.X; |
141 | float dy = a.Y - b.Y; | 141 | float dy = a.Y - b.Y; |
@@ -143,22 +143,22 @@ namespace OpenSim.Region.Physics.Manager | |||
143 | return (float) Math.Sqrt(dx * dx + dy * dy + dz * dz); | 143 | return (float) Math.Sqrt(dx * dx + dy * dy + dz * dz); |
144 | } | 144 | } |
145 | 145 | ||
146 | public static PhysicsVector operator /(PhysicsVector v, float f) | 146 | public static PhysicsVector operator /(Vector3 v, float f) |
147 | { | 147 | { |
148 | return new PhysicsVector(v.X/f, v.Y/f, v.Z/f); | 148 | return new PhysicsVector(v.X/f, v.Y/f, v.Z/f); |
149 | } | 149 | } |
150 | 150 | ||
151 | public static PhysicsVector operator *(PhysicsVector v, float f) | 151 | public static PhysicsVector operator *(Vector3 v, float f) |
152 | { | 152 | { |
153 | return new PhysicsVector(v.X*f, v.Y*f, v.Z*f); | 153 | return new PhysicsVector(v.X*f, v.Y*f, v.Z*f); |
154 | } | 154 | } |
155 | 155 | ||
156 | public static PhysicsVector operator *(float f, PhysicsVector v) | 156 | public static PhysicsVector operator *(float f, Vector3 v) |
157 | { | 157 | { |
158 | return v*f; | 158 | return v*f; |
159 | } | 159 | } |
160 | 160 | ||
161 | public static bool isFinite(PhysicsVector v) | 161 | public static bool isFinite(Vector3 v) |
162 | { | 162 | { |
163 | if (v == null) | 163 | if (v == null) |
164 | return false; | 164 | return false; |
@@ -172,7 +172,7 @@ namespace OpenSim.Region.Physics.Manager | |||
172 | return true; | 172 | return true; |
173 | } | 173 | } |
174 | 174 | ||
175 | public virtual bool IsIdentical(PhysicsVector v, float tolerance) | 175 | public virtual bool IsIdentical(Vector3 v, float tolerance) |
176 | { | 176 | { |
177 | PhysicsVector diff = this - v; | 177 | PhysicsVector diff = this - v; |
178 | float d = diff.length(); | 178 | float d = diff.length(); |
@@ -182,5 +182,5 @@ namespace OpenSim.Region.Physics.Manager | |||
182 | return false; | 182 | return false; |
183 | } | 183 | } |
184 | 184 | ||
185 | } | 185 | }*/ |
186 | } | 186 | } |
diff --git a/OpenSim/Region/Physics/Manager/ZeroMesher.cs b/OpenSim/Region/Physics/Manager/ZeroMesher.cs index f9d0f2a..e6e75f9 100644 --- a/OpenSim/Region/Physics/Manager/ZeroMesher.cs +++ b/OpenSim/Region/Physics/Manager/ZeroMesher.cs | |||
@@ -27,6 +27,7 @@ | |||
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using OpenSim.Framework; | 29 | using OpenSim.Framework; |
30 | using OpenMetaverse; | ||
30 | 31 | ||
31 | /* | 32 | /* |
32 | * This is the zero mesher. | 33 | * This is the zero mesher. |
@@ -60,13 +61,16 @@ namespace OpenSim.Region.Physics.Manager | |||
60 | 61 | ||
61 | public class ZeroMesher : IMesher | 62 | public class ZeroMesher : IMesher |
62 | { | 63 | { |
63 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod) | 64 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod) |
64 | { | 65 | { |
65 | return CreateMesh(primName, primShape, size, lod, false); | 66 | return CreateMesh(primName, primShape, size, lod, false); |
66 | } | 67 | } |
67 | 68 | ||
68 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical) | 69 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical) |
69 | { | 70 | { |
71 | // Remove the reference to the encoded JPEG2000 data so it can be GCed | ||
72 | primShape.SculptData = OpenMetaverse.Utils.EmptyBytes; | ||
73 | |||
70 | return null; | 74 | return null; |
71 | } | 75 | } |
72 | } | 76 | } |
diff --git a/OpenSim/Region/Physics/Meshing/HelperTypes.cs b/OpenSim/Region/Physics/Meshing/HelperTypes.cs index 232245f..8cd8dcf 100644 --- a/OpenSim/Region/Physics/Meshing/HelperTypes.cs +++ b/OpenSim/Region/Physics/Meshing/HelperTypes.cs | |||
@@ -33,30 +33,52 @@ using OpenMetaverse; | |||
33 | using OpenSim.Region.Physics.Manager; | 33 | using OpenSim.Region.Physics.Manager; |
34 | using OpenSim.Region.Physics.Meshing; | 34 | using OpenSim.Region.Physics.Meshing; |
35 | 35 | ||
36 | public class Vertex : PhysicsVector, IComparable<Vertex> | 36 | public class Vertex : IComparable<Vertex> |
37 | { | 37 | { |
38 | Vector3 vector; | ||
39 | |||
40 | public float X | ||
41 | { | ||
42 | get { return vector.X; } | ||
43 | set { vector.X = value; } | ||
44 | } | ||
45 | |||
46 | public float Y | ||
47 | { | ||
48 | get { return vector.Y; } | ||
49 | set { vector.Y = value; } | ||
50 | } | ||
51 | |||
52 | public float Z | ||
53 | { | ||
54 | get { return vector.Z; } | ||
55 | set { vector.Z = value; } | ||
56 | } | ||
57 | |||
38 | public Vertex(float x, float y, float z) | 58 | public Vertex(float x, float y, float z) |
39 | : base(x, y, z) | ||
40 | { | 59 | { |
60 | vector.X = x; | ||
61 | vector.Y = y; | ||
62 | vector.Z = z; | ||
41 | } | 63 | } |
42 | 64 | ||
43 | public Vertex normalize() | 65 | public Vertex normalize() |
44 | { | 66 | { |
45 | float tlength = length(); | 67 | float tlength = vector.Length(); |
46 | if (tlength != 0) | 68 | if (tlength != 0f) |
47 | { | 69 | { |
48 | float mul = 1.0f / tlength; | 70 | float mul = 1.0f / tlength; |
49 | return new Vertex(X * mul, Y * mul, Z * mul); | 71 | return new Vertex(vector.X * mul, vector.Y * mul, vector.Z * mul); |
50 | } | 72 | } |
51 | else | 73 | else |
52 | { | 74 | { |
53 | return new Vertex(0, 0, 0); | 75 | return new Vertex(0f, 0f, 0f); |
54 | } | 76 | } |
55 | } | 77 | } |
56 | 78 | ||
57 | public Vertex cross(Vertex v) | 79 | public Vertex cross(Vertex v) |
58 | { | 80 | { |
59 | return new Vertex(Y * v.Z - Z * v.Y, Z * v.X - X * v.Z, X * v.Y - Y * v.X); | 81 | return new Vertex(vector.Y * v.Z - vector.Z * v.Y, vector.Z * v.X - vector.X * v.Z, vector.X * v.Y - vector.Y * v.X); |
60 | } | 82 | } |
61 | 83 | ||
62 | // disable warning: mono compiler moans about overloading | 84 | // disable warning: mono compiler moans about overloading |
@@ -160,9 +182,9 @@ public class Vertex : PhysicsVector, IComparable<Vertex> | |||
160 | return X * v.X + Y * v.Y + Z * v.Z; | 182 | return X * v.X + Y * v.Y + Z * v.Z; |
161 | } | 183 | } |
162 | 184 | ||
163 | public Vertex(PhysicsVector v) | 185 | public Vertex(Vector3 v) |
164 | : base(v.X, v.Y, v.Z) | ||
165 | { | 186 | { |
187 | vector = v; | ||
166 | } | 188 | } |
167 | 189 | ||
168 | public Vertex Clone() | 190 | public Vertex Clone() |
@@ -175,11 +197,15 @@ public class Vertex : PhysicsVector, IComparable<Vertex> | |||
175 | return new Vertex((float) Math.Cos(angle), (float) Math.Sin(angle), 0.0f); | 197 | return new Vertex((float) Math.Cos(angle), (float) Math.Sin(angle), 0.0f); |
176 | } | 198 | } |
177 | 199 | ||
200 | public float Length() | ||
201 | { | ||
202 | return vector.Length(); | ||
203 | } | ||
178 | 204 | ||
179 | public virtual bool Equals(Vertex v, float tolerance) | 205 | public virtual bool Equals(Vertex v, float tolerance) |
180 | { | 206 | { |
181 | PhysicsVector diff = this - v; | 207 | Vertex diff = this - v; |
182 | float d = diff.length(); | 208 | float d = diff.Length(); |
183 | if (d < tolerance) | 209 | if (d < tolerance) |
184 | return true; | 210 | return true; |
185 | 211 | ||
@@ -369,22 +395,22 @@ public class Triangle | |||
369 | return s1 + ";" + s2 + ";" + s3; | 395 | return s1 + ";" + s2 + ";" + s3; |
370 | } | 396 | } |
371 | 397 | ||
372 | public PhysicsVector getNormal() | 398 | public Vector3 getNormal() |
373 | { | 399 | { |
374 | // Vertices | 400 | // Vertices |
375 | 401 | ||
376 | // Vectors for edges | 402 | // Vectors for edges |
377 | PhysicsVector e1; | 403 | Vector3 e1; |
378 | PhysicsVector e2; | 404 | Vector3 e2; |
379 | 405 | ||
380 | e1 = new PhysicsVector(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z); | 406 | e1 = new Vector3(v1.X - v2.X, v1.Y - v2.Y, v1.Z - v2.Z); |
381 | e2 = new PhysicsVector(v1.X - v3.X, v1.Y - v3.Y, v1.Z - v3.Z); | 407 | e2 = new Vector3(v1.X - v3.X, v1.Y - v3.Y, v1.Z - v3.Z); |
382 | 408 | ||
383 | // Cross product for normal | 409 | // Cross product for normal |
384 | PhysicsVector n = PhysicsVector.cross(e1, e2); | 410 | Vector3 n = Vector3.Cross(e1, e2); |
385 | 411 | ||
386 | // Length | 412 | // Length |
387 | float l = n.length(); | 413 | float l = n.Length(); |
388 | 414 | ||
389 | // Normalized "normal" | 415 | // Normalized "normal" |
390 | n = n/l; | 416 | n = n/l; |
diff --git a/OpenSim/Region/Physics/Meshing/Mesh.cs b/OpenSim/Region/Physics/Meshing/Mesh.cs index 4c3cf33..f781ff9 100644 --- a/OpenSim/Region/Physics/Meshing/Mesh.cs +++ b/OpenSim/Region/Physics/Meshing/Mesh.cs | |||
@@ -31,6 +31,7 @@ using System.IO; | |||
31 | using System.Runtime.InteropServices; | 31 | using System.Runtime.InteropServices; |
32 | using OpenSim.Region.Physics.Manager; | 32 | using OpenSim.Region.Physics.Manager; |
33 | using PrimMesher; | 33 | using PrimMesher; |
34 | using OpenMetaverse; | ||
34 | 35 | ||
35 | namespace OpenSim.Region.Physics.Meshing | 36 | namespace OpenSim.Region.Physics.Meshing |
36 | { | 37 | { |
@@ -141,12 +142,12 @@ namespace OpenSim.Region.Physics.Meshing | |||
141 | } | 142 | } |
142 | } | 143 | } |
143 | 144 | ||
144 | public List<PhysicsVector> getVertexList() | 145 | public List<Vector3> getVertexList() |
145 | { | 146 | { |
146 | List<PhysicsVector> result = new List<PhysicsVector>(); | 147 | List<Vector3> result = new List<Vector3>(); |
147 | foreach (Vertex v in m_vertices.Keys) | 148 | foreach (Vertex v in m_vertices.Keys) |
148 | { | 149 | { |
149 | result.Add(v); | 150 | result.Add(new Vector3(v.X, v.Y, v.Z)); |
150 | } | 151 | } |
151 | return result; | 152 | return result; |
152 | } | 153 | } |
@@ -174,6 +175,9 @@ namespace OpenSim.Region.Physics.Meshing | |||
174 | 175 | ||
175 | float[] result = getVertexListAsFloat(); | 176 | float[] result = getVertexListAsFloat(); |
176 | m_pinnedVertexes = GCHandle.Alloc(result, GCHandleType.Pinned); | 177 | m_pinnedVertexes = GCHandle.Alloc(result, GCHandleType.Pinned); |
178 | // Inform the garbage collector of this unmanaged allocation so it can schedule | ||
179 | // the next GC round more intelligently | ||
180 | GC.AddMemoryPressure(Buffer.ByteLength(result)); | ||
177 | 181 | ||
178 | return result; | 182 | return result; |
179 | } | 183 | } |
@@ -223,6 +227,9 @@ namespace OpenSim.Region.Physics.Meshing | |||
223 | 227 | ||
224 | int[] result = getIndexListAsInt(); | 228 | int[] result = getIndexListAsInt(); |
225 | m_pinnedIndex = GCHandle.Alloc(result, GCHandleType.Pinned); | 229 | m_pinnedIndex = GCHandle.Alloc(result, GCHandleType.Pinned); |
230 | // Inform the garbage collector of this unmanaged allocation so it can schedule | ||
231 | // the next GC round more intelligently | ||
232 | GC.AddMemoryPressure(Buffer.ByteLength(result)); | ||
226 | 233 | ||
227 | return result; | 234 | return result; |
228 | } | 235 | } |
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs index f609e73..fbe1949 100644 --- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs +++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs | |||
@@ -31,7 +31,6 @@ using System.Collections.Generic; | |||
31 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
32 | using OpenSim.Region.Physics.Manager; | 32 | using OpenSim.Region.Physics.Manager; |
33 | using OpenMetaverse; | 33 | using OpenMetaverse; |
34 | using OpenMetaverse.Imaging; | ||
35 | using System.Drawing; | 34 | using System.Drawing; |
36 | using System.Drawing.Imaging; | 35 | using System.Drawing.Imaging; |
37 | using PrimMesher; | 36 | using PrimMesher; |
@@ -61,7 +60,6 @@ namespace OpenSim.Region.Physics.Meshing | |||
61 | public class Meshmerizer : IMesher | 60 | public class Meshmerizer : IMesher |
62 | { | 61 | { |
63 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 62 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
64 | //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
65 | 63 | ||
66 | // Setting baseDir to a path will enable the dumping of raw files | 64 | // Setting baseDir to a path will enable the dumping of raw files |
67 | // raw files can be imported by blender so a visual inspection of the results can be done | 65 | // raw files can be imported by blender so a visual inspection of the results can be done |
@@ -160,7 +158,7 @@ namespace OpenSim.Region.Physics.Meshing | |||
160 | float minZ = float.MaxValue; | 158 | float minZ = float.MaxValue; |
161 | float maxZ = float.MinValue; | 159 | float maxZ = float.MinValue; |
162 | 160 | ||
163 | foreach (Vertex v in meshIn.getVertexList()) | 161 | foreach (Vector3 v in meshIn.getVertexList()) |
164 | { | 162 | { |
165 | if (v != null) | 163 | if (v != null) |
166 | { | 164 | { |
@@ -185,7 +183,7 @@ namespace OpenSim.Region.Physics.Meshing | |||
185 | 183 | ||
186 | } | 184 | } |
187 | 185 | ||
188 | private ulong GetMeshKey(PrimitiveBaseShape pbs, PhysicsVector size, float lod) | 186 | private ulong GetMeshKey(PrimitiveBaseShape pbs, Vector3 size, float lod) |
189 | { | 187 | { |
190 | ulong hash = 5381; | 188 | ulong hash = 5381; |
191 | 189 | ||
@@ -245,9 +243,9 @@ namespace OpenSim.Region.Physics.Meshing | |||
245 | hash = ((hash << 5) + hash) + (ulong)((byte)c); | 243 | hash = ((hash << 5) + hash) + (ulong)((byte)c); |
246 | return ((hash << 5) + hash) + (ulong)(c >> 8); | 244 | return ((hash << 5) + hash) + (ulong)(c >> 8); |
247 | } | 245 | } |
248 | |||
249 | 246 | ||
250 | private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod) | 247 | |
248 | private Mesh CreateMeshFromPrimMesher(string primName, PrimitiveBaseShape primShape, Vector3 size, float lod) | ||
251 | { | 249 | { |
252 | PrimMesh primMesh; | 250 | PrimMesh primMesh; |
253 | PrimMesher.SculptMesh sculptMesh; | 251 | PrimMesher.SculptMesh sculptMesh; |
@@ -281,16 +279,12 @@ namespace OpenSim.Region.Physics.Meshing | |||
281 | 279 | ||
282 | if (idata == null) | 280 | if (idata == null) |
283 | { | 281 | { |
284 | if (primShape.SculptData.Length == 0) | 282 | if (primShape.SculptData == null || primShape.SculptData.Length == 0) |
285 | return null; | 283 | return null; |
286 | 284 | ||
287 | try | 285 | try |
288 | { | 286 | { |
289 | ManagedImage managedImage; // we never use this | 287 | idata = CSJ2K.J2kImage.FromBytes(primShape.SculptData); |
290 | OpenJPEG.DecodeToImage(primShape.SculptData, out managedImage, out idata); | ||
291 | |||
292 | // Remove the reference to the encoded JPEG2000 data so it can be GCed | ||
293 | primShape.SculptData = Utils.EmptyBytes; | ||
294 | 288 | ||
295 | if (cacheSculptMaps) | 289 | if (cacheSculptMaps) |
296 | { | 290 | { |
@@ -315,8 +309,6 @@ namespace OpenSim.Region.Physics.Meshing | |||
315 | } | 309 | } |
316 | } | 310 | } |
317 | 311 | ||
318 | |||
319 | |||
320 | PrimMesher.SculptMesh.SculptType sculptType; | 312 | PrimMesher.SculptMesh.SculptType sculptType; |
321 | switch ((OpenMetaverse.SculptType)primShape.SculptType) | 313 | switch ((OpenMetaverse.SculptType)primShape.SculptType) |
322 | { | 314 | { |
@@ -351,7 +343,6 @@ namespace OpenSim.Region.Physics.Meshing | |||
351 | coords = sculptMesh.coords; | 343 | coords = sculptMesh.coords; |
352 | faces = sculptMesh.faces; | 344 | faces = sculptMesh.faces; |
353 | } | 345 | } |
354 | |||
355 | else | 346 | else |
356 | { | 347 | { |
357 | float pathShearX = primShape.PathShearX < 128 ? (float)primShape.PathShearX * 0.01f : (float)(primShape.PathShearX - 256) * 0.01f; | 348 | float pathShearX = primShape.PathShearX < 128 ? (float)primShape.PathShearX * 0.01f : (float)(primShape.PathShearX - 256) * 0.01f; |
@@ -466,6 +457,8 @@ namespace OpenSim.Region.Physics.Meshing | |||
466 | faces = primMesh.faces; | 457 | faces = primMesh.faces; |
467 | } | 458 | } |
468 | 459 | ||
460 | // Remove the reference to any JPEG2000 sculpt data so it can be GCed | ||
461 | primShape.SculptData = Utils.EmptyBytes; | ||
469 | 462 | ||
470 | int numCoords = coords.Count; | 463 | int numCoords = coords.Count; |
471 | int numFaces = faces.Count; | 464 | int numFaces = faces.Count; |
@@ -488,12 +481,12 @@ namespace OpenSim.Region.Physics.Meshing | |||
488 | return mesh; | 481 | return mesh; |
489 | } | 482 | } |
490 | 483 | ||
491 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod) | 484 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod) |
492 | { | 485 | { |
493 | return CreateMesh(primName, primShape, size, lod, false); | 486 | return CreateMesh(primName, primShape, size, lod, false); |
494 | } | 487 | } |
495 | 488 | ||
496 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, PhysicsVector size, float lod, bool isPhysical) | 489 | public IMesh CreateMesh(String primName, PrimitiveBaseShape primShape, Vector3 size, float lod, bool isPhysical) |
497 | { | 490 | { |
498 | Mesh mesh = null; | 491 | Mesh mesh = null; |
499 | ulong key = 0; | 492 | ulong key = 0; |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs index 8272083..e344f97 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODECharacter.cs | |||
@@ -68,15 +68,15 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
68 | { | 68 | { |
69 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 69 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
70 | 70 | ||
71 | private PhysicsVector _position; | 71 | private Vector3 _position; |
72 | private d.Vector3 _zeroPosition; | 72 | private d.Vector3 _zeroPosition; |
73 | // private d.Matrix3 m_StandUpRotation; | 73 | // private d.Matrix3 m_StandUpRotation; |
74 | private bool _zeroFlag = false; | 74 | private bool _zeroFlag = false; |
75 | private bool m_lastUpdateSent = false; | 75 | private bool m_lastUpdateSent = false; |
76 | private PhysicsVector _velocity; | 76 | private Vector3 _velocity; |
77 | private PhysicsVector _target_velocity; | 77 | private Vector3 _target_velocity; |
78 | private PhysicsVector _acceleration; | 78 | private Vector3 _acceleration; |
79 | private PhysicsVector m_rotationalVelocity; | 79 | private Vector3 m_rotationalVelocity; |
80 | private float m_mass = 80f; | 80 | private float m_mass = 80f; |
81 | public float m_density = 60f; | 81 | public float m_density = 60f; |
82 | private bool m_pidControllerActive = true; | 82 | private bool m_pidControllerActive = true; |
@@ -99,7 +99,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
99 | private bool m_hackSentFall = false; | 99 | private bool m_hackSentFall = false; |
100 | private bool m_hackSentFly = false; | 100 | private bool m_hackSentFly = false; |
101 | private int m_requestedUpdateFrequency = 0; | 101 | private int m_requestedUpdateFrequency = 0; |
102 | private PhysicsVector m_taintPosition = new PhysicsVector(0, 0, 0); | 102 | private Vector3 m_taintPosition = Vector3.Zero; |
103 | public uint m_localID = 0; | 103 | public uint m_localID = 0; |
104 | public bool m_returnCollisions = false; | 104 | public bool m_returnCollisions = false; |
105 | // taints and their non-tainted counterparts | 105 | // taints and their non-tainted counterparts |
@@ -143,22 +143,17 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
143 | public UUID m_uuid; | 143 | public UUID m_uuid; |
144 | public bool bad = false; | 144 | public bool bad = false; |
145 | 145 | ||
146 | public OdeCharacter(String avName, OdeScene parent_scene, PhysicsVector pos, CollisionLocker dode, PhysicsVector size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) | 146 | public OdeCharacter(String avName, OdeScene parent_scene, Vector3 pos, CollisionLocker dode, Vector3 size, float pid_d, float pid_p, float capsule_radius, float tensor, float density, float height_fudge_factor, float walk_divisor, float rundivisor) |
147 | { | 147 | { |
148 | m_uuid = UUID.Random(); | 148 | m_uuid = UUID.Random(); |
149 | 149 | ||
150 | // ode = dode; | 150 | if (pos.IsFinite()) |
151 | _velocity = new PhysicsVector(); | ||
152 | _target_velocity = new PhysicsVector(); | ||
153 | |||
154 | |||
155 | if (PhysicsVector.isFinite(pos)) | ||
156 | { | 151 | { |
157 | if (pos.Z > 9999999) | 152 | if (pos.Z > 9999999f) |
158 | { | 153 | { |
159 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | 154 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; |
160 | } | 155 | } |
161 | if (pos.Z < -90000) | 156 | if (pos.Z < -90000f) |
162 | { | 157 | { |
163 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | 158 | pos.Z = parent_scene.GetTerrainHeightAtXY(127, 127) + 5; |
164 | } | 159 | } |
@@ -169,15 +164,13 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
169 | } | 164 | } |
170 | else | 165 | else |
171 | { | 166 | { |
172 | _position = new PhysicsVector(((int)_parent_scene.WorldExtents.X * 0.5f), ((int)_parent_scene.WorldExtents.Y * 0.5f), parent_scene.GetTerrainHeightAtXY(128, 128) + 10); | 167 | _position = new Vector3(((float)_parent_scene.WorldExtents.X * 0.5f), ((float)_parent_scene.WorldExtents.Y * 0.5f), parent_scene.GetTerrainHeightAtXY(128f, 128f) + 10f); |
173 | m_taintPosition.X = _position.X; | 168 | m_taintPosition.X = _position.X; |
174 | m_taintPosition.Y = _position.Y; | 169 | m_taintPosition.Y = _position.Y; |
175 | m_taintPosition.Z = _position.Z; | 170 | m_taintPosition.Z = _position.Z; |
176 | m_log.Warn("[PHYSICS]: Got NaN Position on Character Create"); | 171 | m_log.Warn("[PHYSICS]: Got NaN Position on Character Create"); |
177 | } | 172 | } |
178 | 173 | ||
179 | |||
180 | _acceleration = new PhysicsVector(); | ||
181 | _parent_scene = parent_scene; | 174 | _parent_scene = parent_scene; |
182 | 175 | ||
183 | PID_D = pid_d; | 176 | PID_D = pid_d; |
@@ -189,7 +182,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
189 | walkDivisor = walk_divisor; | 182 | walkDivisor = walk_divisor; |
190 | runDivisor = rundivisor; | 183 | runDivisor = rundivisor; |
191 | 184 | ||
192 | |||
193 | // m_StandUpRotation = | 185 | // m_StandUpRotation = |
194 | // new d.Matrix3(0.5f, 0.7071068f, 0.5f, -0.7071068f, 0f, 0.7071068f, 0.5f, -0.7071068f, | 186 | // new d.Matrix3(0.5f, 0.7071068f, 0.5f, -0.7071068f, 0f, 0.7071068f, 0.5f, -0.7071068f, |
195 | // 0.5f); | 187 | // 0.5f); |
@@ -205,7 +197,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
205 | m_isPhysical = false; // current status: no ODE information exists | 197 | m_isPhysical = false; // current status: no ODE information exists |
206 | m_tainted_isPhysical = true; // new tainted status: need to create ODE information | 198 | m_tainted_isPhysical = true; // new tainted status: need to create ODE information |
207 | 199 | ||
208 | |||
209 | _parent_scene.AddPhysicsActorTaint(this); | 200 | _parent_scene.AddPhysicsActorTaint(this); |
210 | 201 | ||
211 | m_name = avName; | 202 | m_name = avName; |
@@ -412,20 +403,20 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
412 | /// Not really a good choice unless you 'know' it's a good | 403 | /// Not really a good choice unless you 'know' it's a good |
413 | /// spot otherwise you're likely to orbit the avatar. | 404 | /// spot otherwise you're likely to orbit the avatar. |
414 | /// </summary> | 405 | /// </summary> |
415 | public override PhysicsVector Position | 406 | public override Vector3 Position |
416 | { | 407 | { |
417 | get { return _position; } | 408 | get { return _position; } |
418 | set | 409 | set |
419 | { | 410 | { |
420 | if (Body == IntPtr.Zero || Shell == IntPtr.Zero) | 411 | if (Body == IntPtr.Zero || Shell == IntPtr.Zero) |
421 | { | 412 | { |
422 | if (PhysicsVector.isFinite(value)) | 413 | if (value.IsFinite()) |
423 | { | 414 | { |
424 | if (value.Z > 9999999) | 415 | if (value.Z > 9999999f) |
425 | { | 416 | { |
426 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | 417 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; |
427 | } | 418 | } |
428 | if (value.Z < -90000) | 419 | if (value.Z < -90000f) |
429 | { | 420 | { |
430 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; | 421 | value.Z = _parent_scene.GetTerrainHeightAtXY(127, 127) + 5; |
431 | } | 422 | } |
@@ -447,7 +438,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
447 | } | 438 | } |
448 | } | 439 | } |
449 | 440 | ||
450 | public override PhysicsVector RotationalVelocity | 441 | public override Vector3 RotationalVelocity |
451 | { | 442 | { |
452 | get { return m_rotationalVelocity; } | 443 | get { return m_rotationalVelocity; } |
453 | set { m_rotationalVelocity = value; } | 444 | set { m_rotationalVelocity = value; } |
@@ -457,20 +448,20 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
457 | /// This property sets the height of the avatar only. We use the height to make sure the avatar stands up straight | 448 | /// This property sets the height of the avatar only. We use the height to make sure the avatar stands up straight |
458 | /// and use it to offset landings properly | 449 | /// and use it to offset landings properly |
459 | /// </summary> | 450 | /// </summary> |
460 | public override PhysicsVector Size | 451 | public override Vector3 Size |
461 | { | 452 | { |
462 | get { return new PhysicsVector(CAPSULE_RADIUS*2, CAPSULE_RADIUS*2, CAPSULE_LENGTH); } | 453 | get { return new Vector3(CAPSULE_RADIUS * 2, CAPSULE_RADIUS * 2, CAPSULE_LENGTH); } |
463 | set | 454 | set |
464 | { | 455 | { |
465 | if (PhysicsVector.isFinite(value)) | 456 | if (value.IsFinite()) |
466 | { | 457 | { |
467 | m_pidControllerActive = true; | 458 | m_pidControllerActive = true; |
468 | 459 | ||
469 | PhysicsVector SetSize = value; | 460 | Vector3 SetSize = value; |
470 | m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f; | 461 | m_tainted_CAPSULE_LENGTH = (SetSize.Z*1.15f) - CAPSULE_RADIUS*2.0f; |
471 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); | 462 | //m_log.Info("[SIZE]: " + CAPSULE_LENGTH.ToString()); |
472 | 463 | ||
473 | Velocity = new PhysicsVector(0f, 0f, 0f); | 464 | Velocity = Vector3.Zero; |
474 | 465 | ||
475 | _parent_scene.AddPhysicsActorTaint(this); | 466 | _parent_scene.AddPhysicsActorTaint(this); |
476 | } | 467 | } |
@@ -481,7 +472,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
481 | } | 472 | } |
482 | } | 473 | } |
483 | 474 | ||
484 | private void AlignAvatarTiltWithCurrentDirectionOfMovement(PhysicsVector movementVector) | 475 | private void AlignAvatarTiltWithCurrentDirectionOfMovement(Vector3 movementVector) |
485 | { | 476 | { |
486 | movementVector.Z = 0f; | 477 | movementVector.Z = 0f; |
487 | float magnitude = (float)Math.Sqrt((double)(movementVector.X * movementVector.X + movementVector.Y * movementVector.Y)); | 478 | float magnitude = (float)Math.Sqrt((double)(movementVector.X * movementVector.X + movementVector.Y * movementVector.Y)); |
@@ -643,7 +634,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
643 | // (with -0..0 motor stops) falls into the terrain for reasons yet | 634 | // (with -0..0 motor stops) falls into the terrain for reasons yet |
644 | // to be comprehended in their entirety. | 635 | // to be comprehended in their entirety. |
645 | #endregion | 636 | #endregion |
646 | AlignAvatarTiltWithCurrentDirectionOfMovement(new PhysicsVector(0,0,0)); | 637 | AlignAvatarTiltWithCurrentDirectionOfMovement(Vector3.Zero); |
647 | d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f); | 638 | d.JointSetAMotorParam(Amotor, (int)dParam.LowStop, 0.08f); |
648 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f); | 639 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop3, -0f); |
649 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f); | 640 | d.JointSetAMotorParam(Amotor, (int)dParam.LoStop2, 0.08f); |
@@ -688,7 +679,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
688 | 679 | ||
689 | } | 680 | } |
690 | 681 | ||
691 | public override void LockAngularMotion(PhysicsVector axis) | 682 | public override void LockAngularMotion(Vector3 axis) |
692 | { | 683 | { |
693 | 684 | ||
694 | } | 685 | } |
@@ -716,9 +707,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
716 | // //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22); | 707 | // //m_log.Info("[PHYSICSAV]: Rotation: " + bodyrotation.M00 + " : " + bodyrotation.M01 + " : " + bodyrotation.M02 + " : " + bodyrotation.M10 + " : " + bodyrotation.M11 + " : " + bodyrotation.M12 + " : " + bodyrotation.M20 + " : " + bodyrotation.M21 + " : " + bodyrotation.M22); |
717 | // } | 708 | // } |
718 | 709 | ||
719 | public override PhysicsVector Force | 710 | public override Vector3 Force |
720 | { | 711 | { |
721 | get { return new PhysicsVector(_target_velocity.X, _target_velocity.Y, _target_velocity.Z); } | 712 | get { return _target_velocity; } |
722 | set { return; } | 713 | set { return; } |
723 | } | 714 | } |
724 | 715 | ||
@@ -733,7 +724,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
733 | 724 | ||
734 | } | 725 | } |
735 | 726 | ||
736 | public override void VehicleVectorParam(int param, PhysicsVector value) | 727 | public override void VehicleVectorParam(int param, Vector3 value) |
737 | { | 728 | { |
738 | 729 | ||
739 | } | 730 | } |
@@ -748,14 +739,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
748 | 739 | ||
749 | } | 740 | } |
750 | 741 | ||
751 | public override PhysicsVector CenterOfMass | 742 | public override Vector3 CenterOfMass |
752 | { | 743 | { |
753 | get { return PhysicsVector.Zero; } | 744 | get { return Vector3.Zero; } |
754 | } | 745 | } |
755 | 746 | ||
756 | public override PhysicsVector GeometricCenter | 747 | public override Vector3 GeometricCenter |
757 | { | 748 | { |
758 | get { return PhysicsVector.Zero; } | 749 | get { return Vector3.Zero; } |
759 | } | 750 | } |
760 | 751 | ||
761 | public override PrimitiveBaseShape Shape | 752 | public override PrimitiveBaseShape Shape |
@@ -763,18 +754,18 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
763 | set { return; } | 754 | set { return; } |
764 | } | 755 | } |
765 | 756 | ||
766 | public override PhysicsVector Velocity | 757 | public override Vector3 Velocity |
767 | { | 758 | { |
768 | get { | 759 | get { |
769 | // There's a problem with PhysicsVector.Zero! Don't Use it Here! | 760 | // There's a problem with Vector3.Zero! Don't Use it Here! |
770 | if (_zeroFlag) | 761 | if (_zeroFlag) |
771 | return new PhysicsVector(0f, 0f, 0f); | 762 | return Vector3.Zero; |
772 | m_lastUpdateSent = false; | 763 | m_lastUpdateSent = false; |
773 | return _velocity; | 764 | return _velocity; |
774 | } | 765 | } |
775 | set | 766 | set |
776 | { | 767 | { |
777 | if (PhysicsVector.isFinite(value)) | 768 | if (value.IsFinite()) |
778 | { | 769 | { |
779 | m_pidControllerActive = true; | 770 | m_pidControllerActive = true; |
780 | _target_velocity = value; | 771 | _target_velocity = value; |
@@ -786,9 +777,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
786 | } | 777 | } |
787 | } | 778 | } |
788 | 779 | ||
789 | public override PhysicsVector Torque | 780 | public override Vector3 Torque |
790 | { | 781 | { |
791 | get { return PhysicsVector.Zero; } | 782 | get { return Vector3.Zero; } |
792 | set { return; } | 783 | set { return; } |
793 | } | 784 | } |
794 | 785 | ||
@@ -814,12 +805,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
814 | } | 805 | } |
815 | } | 806 | } |
816 | 807 | ||
817 | public override PhysicsVector Acceleration | 808 | public override Vector3 Acceleration |
818 | { | 809 | { |
819 | get { return _acceleration; } | 810 | get { return _acceleration; } |
820 | } | 811 | } |
821 | 812 | ||
822 | public void SetAcceleration(PhysicsVector accel) | 813 | public void SetAcceleration(Vector3 accel) |
823 | { | 814 | { |
824 | m_pidControllerActive = true; | 815 | m_pidControllerActive = true; |
825 | _acceleration = accel; | 816 | _acceleration = accel; |
@@ -830,9 +821,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
830 | /// The PID controller takes this target velocity and tries to make it a reality | 821 | /// The PID controller takes this target velocity and tries to make it a reality |
831 | /// </summary> | 822 | /// </summary> |
832 | /// <param name="force"></param> | 823 | /// <param name="force"></param> |
833 | public override void AddForce(PhysicsVector force, bool pushforce) | 824 | public override void AddForce(Vector3 force, bool pushforce) |
834 | { | 825 | { |
835 | if (PhysicsVector.isFinite(force)) | 826 | if (force.IsFinite()) |
836 | { | 827 | { |
837 | if (pushforce) | 828 | if (pushforce) |
838 | { | 829 | { |
@@ -861,7 +852,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
861 | //m_lastUpdateSent = false; | 852 | //m_lastUpdateSent = false; |
862 | } | 853 | } |
863 | 854 | ||
864 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 855 | public override void AddAngularForce(Vector3 force, bool pushforce) |
865 | { | 856 | { |
866 | 857 | ||
867 | } | 858 | } |
@@ -870,7 +861,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
870 | /// After all of the forces add up with 'add force' we apply them with doForce | 861 | /// After all of the forces add up with 'add force' we apply them with doForce |
871 | /// </summary> | 862 | /// </summary> |
872 | /// <param name="force"></param> | 863 | /// <param name="force"></param> |
873 | public void doForce(PhysicsVector force) | 864 | public void doForce(Vector3 force) |
874 | { | 865 | { |
875 | if (!collidelock) | 866 | if (!collidelock) |
876 | { | 867 | { |
@@ -881,7 +872,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
881 | } | 872 | } |
882 | } | 873 | } |
883 | 874 | ||
884 | public override void SetMomentum(PhysicsVector momentum) | 875 | public override void SetMomentum(Vector3 momentum) |
885 | { | 876 | { |
886 | } | 877 | } |
887 | 878 | ||
@@ -908,9 +899,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
908 | //PidStatus = true; | 899 | //PidStatus = true; |
909 | 900 | ||
910 | d.Vector3 localpos = d.BodyGetPosition(Body); | 901 | d.Vector3 localpos = d.BodyGetPosition(Body); |
911 | PhysicsVector localPos = new PhysicsVector(localpos.X, localpos.Y, localpos.Z); | 902 | Vector3 localPos = new Vector3(localpos.X, localpos.Y, localpos.Z); |
912 | 903 | ||
913 | if (!PhysicsVector.isFinite(localPos)) | 904 | if (!localPos.IsFinite()) |
914 | { | 905 | { |
915 | 906 | ||
916 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); | 907 | m_log.Warn("[PHYSICS]: Avatar Position is non-finite!"); |
@@ -946,7 +937,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
946 | return; | 937 | return; |
947 | } | 938 | } |
948 | 939 | ||
949 | PhysicsVector vec = new PhysicsVector(); | 940 | Vector3 vec = Vector3.Zero; |
950 | d.Vector3 vel = d.BodyGetLinearVel(Body); | 941 | d.Vector3 vel = d.BodyGetLinearVel(Body); |
951 | 942 | ||
952 | float movementdivisor = 1f; | 943 | float movementdivisor = 1f; |
@@ -1059,12 +1050,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1059 | } | 1050 | } |
1060 | // end add Kitto Flora | 1051 | // end add Kitto Flora |
1061 | } | 1052 | } |
1062 | if (PhysicsVector.isFinite(vec)) | 1053 | if (vec.IsFinite()) |
1063 | { | 1054 | { |
1064 | doForce(vec); | 1055 | doForce(vec); |
1065 | if (!_zeroFlag) | 1056 | if (!_zeroFlag) |
1066 | { | 1057 | { |
1067 | AlignAvatarTiltWithCurrentDirectionOfMovement(new PhysicsVector(vec.X, vec.Y, vec.Z)); | 1058 | AlignAvatarTiltWithCurrentDirectionOfMovement(vec); |
1068 | } | 1059 | } |
1069 | } | 1060 | } |
1070 | else | 1061 | else |
@@ -1197,7 +1188,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1197 | { | 1188 | { |
1198 | } | 1189 | } |
1199 | 1190 | ||
1200 | public override PhysicsVector PIDTarget { set { return; } } | 1191 | public override Vector3 PIDTarget { set { return; } } |
1201 | public override bool PIDActive { set { return; } } | 1192 | public override bool PIDActive { set { return; } } |
1202 | public override float PIDTau { set { return; } } | 1193 | public override float PIDTau { set { return; } } |
1203 | 1194 | ||
@@ -1333,7 +1324,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1333 | d.GeomDestroy(Shell); | 1324 | d.GeomDestroy(Shell); |
1334 | AvatarGeomAndBodyCreation(_position.X, _position.Y, | 1325 | AvatarGeomAndBodyCreation(_position.X, _position.Y, |
1335 | _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); | 1326 | _position.Z + (Math.Abs(CAPSULE_LENGTH - prevCapsule) * 2), m_tensor); |
1336 | Velocity = new PhysicsVector(0f, 0f, 0f); | 1327 | Velocity = Vector3.Zero; |
1337 | 1328 | ||
1338 | _parent_scene.geom_name_map[Shell] = m_name; | 1329 | _parent_scene.geom_name_map[Shell] = m_name; |
1339 | _parent_scene.actor_name_map[Shell] = (PhysicsActor)this; | 1330 | _parent_scene.actor_name_map[Shell] = (PhysicsActor)this; |
@@ -1347,7 +1338,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1347 | } | 1338 | } |
1348 | } | 1339 | } |
1349 | 1340 | ||
1350 | if (!m_taintPosition.IsIdentical(_position, 0.05f)) | 1341 | if (!m_taintPosition.ApproxEquals(_position, 0.05f)) |
1351 | { | 1342 | { |
1352 | if (Body != IntPtr.Zero) | 1343 | if (Body != IntPtr.Zero) |
1353 | { | 1344 | { |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs index 0c168c6..345112d 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEDynamics.cs | |||
@@ -38,6 +38,19 @@ | |||
38 | * | 38 | * |
39 | */ | 39 | */ |
40 | 40 | ||
41 | /* Revised Aug, Sept 2009 by Kitto Flora. ODEDynamics.cs replaces | ||
42 | * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised: | ||
43 | * ODEPrim.cs contains methods dealing with Prim editing, Prim | ||
44 | * characteristics and Kinetic motion. | ||
45 | * ODEDynamics.cs contains methods dealing with Prim Physical motion | ||
46 | * (dynamics) and the associated settings. Old Linear and angular | ||
47 | * motors for dynamic motion have been replace with MoveLinear() | ||
48 | * and MoveAngular(); 'Physical' is used only to switch ODE dynamic | ||
49 | * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_<other> is to | ||
50 | * switch between 'VEHICLE' parameter use and general dynamics | ||
51 | * settings use. | ||
52 | */ | ||
53 | |||
41 | using System; | 54 | using System; |
42 | using System.Collections.Generic; | 55 | using System.Collections.Generic; |
43 | using System.Reflection; | 56 | using System.Reflection; |
@@ -232,7 +245,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
232 | 245 | ||
233 | }//end ProcessFloatVehicleParam | 246 | }//end ProcessFloatVehicleParam |
234 | 247 | ||
235 | internal void ProcessVectorVehicleParam(Vehicle pParam, PhysicsVector pValue) | 248 | internal void ProcessVectorVehicleParam(Vehicle pParam, Vector3 pValue) |
236 | { | 249 | { |
237 | switch (pParam) | 250 | switch (pParam) |
238 | { | 251 | { |
diff --git a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs index 93c9a44..62c5c81 100644 --- a/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs +++ b/OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | |||
@@ -1,7 +1,5 @@ | |||
1 | /* | 1 | /* Copyright (c) Contributors, http://opensimulator.org/ |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 2 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | 3 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 4 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 5 | * * Redistributions of source code must retain the above copyright |
@@ -36,6 +34,20 @@ | |||
36 | * switch between 'VEHICLE' parameter use and general dynamics | 34 | * switch between 'VEHICLE' parameter use and general dynamics |
37 | * settings use. | 35 | * settings use. |
38 | */ | 36 | */ |
37 | |||
38 | /* | ||
39 | * Revised August 26 2009 by Kitto Flora. ODEDynamics.cs replaces | ||
40 | * ODEVehicleSettings.cs. It and ODEPrim.cs are re-organised: | ||
41 | * ODEPrim.cs contains methods dealing with Prim editing, Prim | ||
42 | * characteristics and Kinetic motion. | ||
43 | * ODEDynamics.cs contains methods dealing with Prim Physical motion | ||
44 | * (dynamics) and the associated settings. Old Linear and angular | ||
45 | * motors for dynamic motion have been replace with MoveLinear() | ||
46 | * and MoveAngular(); 'Physical' is used only to switch ODE dynamic | ||
47 | * simualtion on/off; VEHICAL_TYPE_NONE/VEHICAL_TYPE_<other> is to | ||
48 | * switch between 'VEHICLE' parameter use and general dynamics | ||
49 | * settings use. | ||
50 | */ | ||
39 | using System; | 51 | using System; |
40 | using System.Collections.Generic; | 52 | using System.Collections.Generic; |
41 | using System.Reflection; | 53 | using System.Reflection; |
@@ -57,29 +69,28 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
57 | { | 69 | { |
58 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 70 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
59 | 71 | ||
60 | private PhysicsVector _position; | 72 | private Vector3 _position; |
61 | private PhysicsVector _velocity; | 73 | private Vector3 _velocity; |
62 | private PhysicsVector _torque = new PhysicsVector(0,0,0); | 74 | private Vector3 _torque; |
63 | private PhysicsVector m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f); | 75 | private Vector3 m_lastVelocity; |
64 | private PhysicsVector m_lastposition = new PhysicsVector(0.0f, 0.0f, 0.0f); | 76 | private Vector3 m_lastposition; |
65 | private Quaternion m_lastorientation = new Quaternion(); | 77 | private Quaternion m_lastorientation = new Quaternion(); |
66 | private PhysicsVector m_rotationalVelocity; | 78 | private Vector3 m_rotationalVelocity; |
67 | private PhysicsVector _size; | 79 | private Vector3 _size; |
68 | private PhysicsVector _acceleration; | 80 | private Vector3 _acceleration; |
69 | // private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f); | 81 | // private d.Vector3 _zeroPosition = new d.Vector3(0.0f, 0.0f, 0.0f); |
70 | private Quaternion _orientation; | 82 | private Quaternion _orientation; |
71 | private PhysicsVector m_taintposition; | 83 | private Vector3 m_taintposition; |
72 | private PhysicsVector m_taintsize; | 84 | private Vector3 m_taintsize; |
73 | private PhysicsVector m_taintVelocity = new PhysicsVector(0, 0, 0); | 85 | private Vector3 m_taintVelocity; |
74 | private PhysicsVector m_taintTorque = new PhysicsVector(0, 0, 0); | 86 | private Vector3 m_taintTorque; |
75 | private Quaternion m_taintrot; | 87 | private Quaternion m_taintrot; |
76 | private PhysicsVector m_angularlock = new PhysicsVector(1f, 1f, 1f); | 88 | private Vector3 m_angularlock = Vector3.One; |
77 | private PhysicsVector m_taintAngularLock = new PhysicsVector(1f, 1f, 1f); | 89 | private Vector3 m_taintAngularLock = Vector3.One; |
78 | private IntPtr Amotor = IntPtr.Zero; | 90 | private IntPtr Amotor = IntPtr.Zero; |
79 | 91 | ||
80 | private PhysicsVector m_PIDTarget = new PhysicsVector(0, 0, 0); | 92 | private Vector3 m_PIDTarget; |
81 | // private PhysicsVector m_taintPIDTarget = new PhysicsVector(0, 0, 0); | 93 | private float m_PIDTau; |
82 | private float m_PIDTau = 0f; | ||
83 | private float PID_D = 35f; | 94 | private float PID_D = 35f; |
84 | private float PID_G = 25f; | 95 | private float PID_G = 25f; |
85 | private bool m_usePID = false; | 96 | private bool m_usePID = false; |
@@ -91,15 +102,22 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
91 | 102 | ||
92 | // KF: These next 7 params apply to llSetHoverHeight(float height, integer water, float tau), | 103 | // KF: These next 7 params apply to llSetHoverHeight(float height, integer water, float tau), |
93 | // and are for non-VEHICLES only. | 104 | // and are for non-VEHICLES only. |
94 | 105 | ||
95 | private float m_PIDHoverHeight = 0f; | 106 | private float m_PIDHoverHeight; |
96 | private float m_PIDHoverTau = 0f; | 107 | private float m_PIDHoverTau; |
97 | private bool m_useHoverPID = false; | 108 | private bool m_useHoverPID; |
98 | private PIDHoverType m_PIDHoverType = PIDHoverType.Ground; | 109 | private PIDHoverType m_PIDHoverType = PIDHoverType.Ground; |
110 | <<<<<<< HEAD:OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | ||
99 | private float m_targetHoverHeight = 0f; | 111 | private float m_targetHoverHeight = 0f; |
100 | private float m_groundHeight = 0f; | 112 | private float m_groundHeight = 0f; |
101 | private float m_waterHeight = 0f; | 113 | private float m_waterHeight = 0f; |
102 | private float m_buoyancy = 0f; //Set by llSetBuoyancy(), for non-vehicles. | 114 | private float m_buoyancy = 0f; //Set by llSetBuoyancy(), for non-vehicles. |
115 | ======= | ||
116 | private float m_targetHoverHeight; | ||
117 | private float m_groundHeight; | ||
118 | private float m_waterHeight; | ||
119 | private float m_buoyancy; //KF: m_buoyancy should be set by llSetBuoyancy() for non-vehicle. | ||
120 | >>>>>>> vehicles:OpenSim/Region/Physics/OdePlugin/ODEPrim.cs | ||
103 | 121 | ||
104 | // private float m_tensor = 5f; | 122 | // private float m_tensor = 5f; |
105 | private int body_autodisable_frames = 20; | 123 | private int body_autodisable_frames = 20; |
@@ -110,11 +128,11 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
110 | | CollisionCategories.Body | 128 | | CollisionCategories.Body |
111 | | CollisionCategories.Character | 129 | | CollisionCategories.Character |
112 | ); | 130 | ); |
113 | private bool m_taintshape = false; | 131 | private bool m_taintshape; |
114 | private bool m_taintPhysics = false; | 132 | private bool m_taintPhysics; |
115 | private bool m_collidesLand = true; | 133 | private bool m_collidesLand = true; |
116 | private bool m_collidesWater = false; | 134 | private bool m_collidesWater; |
117 | public bool m_returnCollisions = false; | 135 | public bool m_returnCollisions; |
118 | 136 | ||
119 | // Default we're a Geometry | 137 | // Default we're a Geometry |
120 | private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); | 138 | private CollisionCategories m_collisionCategories = (CollisionCategories.Geom); |
@@ -122,69 +140,68 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
122 | // Default, Collide with Other Geometries, spaces and Bodies | 140 | // Default, Collide with Other Geometries, spaces and Bodies |
123 | private CollisionCategories m_collisionFlags = m_default_collisionFlags; | 141 | private CollisionCategories m_collisionFlags = m_default_collisionFlags; |
124 | 142 | ||
125 | public bool m_taintremove = false; | 143 | public bool m_taintremove; |
126 | public bool m_taintdisable = false; | 144 | public bool m_taintdisable; |
127 | public bool m_disabled = false; | 145 | public bool m_disabled; |
128 | public bool m_taintadd = false; | 146 | public bool m_taintadd; |
129 | public bool m_taintselected = false; | 147 | public bool m_taintselected; |
130 | public bool m_taintCollidesWater = false; | 148 | public bool m_taintCollidesWater; |
131 | 149 | ||
132 | public uint m_localID = 0; | 150 | public uint m_localID; |
133 | 151 | ||
134 | //public GCHandle gc; | 152 | //public GCHandle gc; |
135 | private CollisionLocker ode; | 153 | private CollisionLocker ode; |
136 | 154 | ||
137 | private bool m_taintforce = false; | 155 | private bool m_taintforce = false; |
138 | private bool m_taintaddangularforce = false; | 156 | private bool m_taintaddangularforce = false; |
139 | private PhysicsVector m_force = new PhysicsVector(0.0f, 0.0f, 0.0f); | 157 | private Vector3 m_force; |
140 | private List<PhysicsVector> m_forcelist = new List<PhysicsVector>(); | 158 | private List<Vector3> m_forcelist = new List<Vector3>(); |
141 | private List<PhysicsVector> m_angularforcelist = new List<PhysicsVector>(); | 159 | private List<Vector3> m_angularforcelist = new List<Vector3>(); |
142 | 160 | ||
143 | private IMesh _mesh; | 161 | private IMesh _mesh; |
144 | private PrimitiveBaseShape _pbs; | 162 | private PrimitiveBaseShape _pbs; |
145 | private OdeScene _parent_scene; | 163 | private OdeScene _parent_scene; |
146 | public IntPtr m_targetSpace = (IntPtr) 0; | 164 | public IntPtr m_targetSpace = IntPtr.Zero; |
147 | public IntPtr prim_geom; | 165 | public IntPtr prim_geom; |
148 | public IntPtr prev_geom; | 166 | public IntPtr prev_geom; |
149 | public IntPtr _triMeshData; | 167 | public IntPtr _triMeshData; |
150 | 168 | ||
151 | private IntPtr _linkJointGroup = (IntPtr)0; | 169 | private IntPtr _linkJointGroup = IntPtr.Zero; |
152 | private PhysicsActor _parent = null; | 170 | private PhysicsActor _parent; |
153 | private PhysicsActor m_taintparent = null; | 171 | private PhysicsActor m_taintparent; |
154 | 172 | ||
155 | private List<OdePrim> childrenPrim = new List<OdePrim>(); | 173 | private List<OdePrim> childrenPrim = new List<OdePrim>(); |
156 | 174 | ||
157 | private bool iscolliding = false; | 175 | private bool iscolliding; |
158 | private bool m_isphysical = false; | 176 | private bool m_isphysical; |
159 | private bool m_isSelected = false; | 177 | private bool m_isSelected; |
160 | 178 | ||
161 | internal bool m_isVolumeDetect = false; // If true, this prim only detects collisions but doesn't collide actively | 179 | internal bool m_isVolumeDetect; // If true, this prim only detects collisions but doesn't collide actively |
162 | 180 | ||
163 | private bool m_throttleUpdates = false; | 181 | private bool m_throttleUpdates; |
164 | private int throttleCounter = 0; | 182 | private int throttleCounter; |
165 | public int m_interpenetrationcount = 0; | 183 | public int m_interpenetrationcount; |
166 | public float m_collisionscore = 0; | 184 | public float m_collisionscore; |
167 | public int m_roundsUnderMotionThreshold = 0; | 185 | public int m_roundsUnderMotionThreshold; |
168 | private int m_crossingfailures = 0; | 186 | private int m_crossingfailures; |
169 | 187 | ||
170 | public bool outofBounds = false; | 188 | public bool outofBounds; |
171 | private float m_density = 10.000006836f; // Aluminum g/cm3; | 189 | private float m_density = 10.000006836f; // Aluminum g/cm3; |
172 | 190 | ||
173 | public bool _zeroFlag = false; | 191 | public bool _zeroFlag; |
174 | private bool m_lastUpdateSent = false; | 192 | private bool m_lastUpdateSent; |
175 | 193 | ||
176 | public IntPtr Body = (IntPtr) 0; | 194 | public IntPtr Body = IntPtr.Zero; |
177 | public String m_primName; | 195 | public String m_primName; |
178 | // private String m_primName; | 196 | private Vector3 _target_velocity; |
179 | private PhysicsVector _target_velocity; | ||
180 | public d.Mass pMass; | 197 | public d.Mass pMass; |
181 | 198 | ||
182 | public int m_eventsubscription = 0; | 199 | public int m_eventsubscription; |
183 | private CollisionEventUpdate CollisionEventsThisFrame = null; | 200 | private CollisionEventUpdate CollisionEventsThisFrame; |
184 | 201 | ||
185 | private IntPtr m_linkJoint = (IntPtr)0; | 202 | private IntPtr m_linkJoint = IntPtr.Zero; |
186 | 203 | ||
187 | public volatile bool childPrim = false; | 204 | public volatile bool childPrim; |
188 | 205 | ||
189 | private ODEDynamics m_vehicle; | 206 | private ODEDynamics m_vehicle; |
190 | 207 | ||
@@ -193,17 +210,16 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
193 | private int frcount = 0; // Used to limit dynamics debug output to | 210 | private int frcount = 0; // Used to limit dynamics debug output to |
194 | 211 | ||
195 | 212 | ||
196 | public OdePrim(String primName, OdeScene parent_scene, PhysicsVector pos, PhysicsVector size, | 213 | public OdePrim(String primName, OdeScene parent_scene, Vector3 pos, Vector3 size, |
197 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) | 214 | Quaternion rotation, IMesh mesh, PrimitiveBaseShape pbs, bool pisPhysical, CollisionLocker dode) |
198 | { | 215 | { |
199 | _target_velocity = new PhysicsVector(0, 0, 0); | ||
200 | m_vehicle = new ODEDynamics(); | 216 | m_vehicle = new ODEDynamics(); |
201 | //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned); | 217 | //gc = GCHandle.Alloc(prim_geom, GCHandleType.Pinned); |
202 | ode = dode; | 218 | ode = dode; |
203 | _velocity = new PhysicsVector(); | 219 | if (!pos.IsFinite()) |
204 | if (!PhysicsVector.isFinite(pos)) | ||
205 | { | 220 | { |
206 | pos = new PhysicsVector(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), parent_scene.GetTerrainHeightAtXY(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f)) + 0.5f); | 221 | pos = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), |
222 | parent_scene.GetTerrainHeightAtXY(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f)) + 0.5f); | ||
207 | m_log.Warn("[PHYSICS]: Got nonFinite Object create Position"); | 223 | m_log.Warn("[PHYSICS]: Got nonFinite Object create Position"); |
208 | } | 224 | } |
209 | _position = pos; | 225 | _position = pos; |
@@ -218,9 +234,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
218 | prim_geom = IntPtr.Zero; | 234 | prim_geom = IntPtr.Zero; |
219 | prev_geom = IntPtr.Zero; | 235 | prev_geom = IntPtr.Zero; |
220 | 236 | ||
221 | if (!PhysicsVector.isFinite(pos)) | 237 | if (!pos.IsFinite()) |
222 | { | 238 | { |
223 | size = new PhysicsVector(0.5f, 0.5f, 0.5f); | 239 | size = new Vector3(0.5f, 0.5f, 0.5f); |
224 | m_log.Warn("[PHYSICS]: Got nonFinite Object create Size"); | 240 | m_log.Warn("[PHYSICS]: Got nonFinite Object create Size"); |
225 | } | 241 | } |
226 | 242 | ||
@@ -230,8 +246,6 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
230 | 246 | ||
231 | _size = size; | 247 | _size = size; |
232 | m_taintsize = _size; | 248 | m_taintsize = _size; |
233 | _acceleration = new PhysicsVector(); | ||
234 | m_rotationalVelocity = PhysicsVector.Zero; | ||
235 | 249 | ||
236 | if (!QuaternionIsFinite(rotation)) | 250 | if (!QuaternionIsFinite(rotation)) |
237 | { | 251 | { |
@@ -396,7 +410,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
396 | m_disabled = false; | 410 | m_disabled = false; |
397 | 411 | ||
398 | // The body doesn't already have a finite rotation mode set here | 412 | // The body doesn't already have a finite rotation mode set here |
399 | if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null) | 413 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0.0f)) && _parent == null) |
400 | { | 414 | { |
401 | createAMotor(m_angularlock); | 415 | createAMotor(m_angularlock); |
402 | } | 416 | } |
@@ -809,6 +823,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
809 | m_collisionscore = 0; | 823 | m_collisionscore = 0; |
810 | } | 824 | } |
811 | 825 | ||
826 | private static Dictionary<IMesh, IntPtr> m_MeshToTriMeshMap = new Dictionary<IMesh, IntPtr>(); | ||
827 | |||
812 | public void setMesh(OdeScene parent_scene, IMesh mesh) | 828 | public void setMesh(OdeScene parent_scene, IMesh mesh) |
813 | { | 829 | { |
814 | // This sleeper is there to moderate how long it takes between | 830 | // This sleeper is there to moderate how long it takes between |
@@ -840,19 +856,24 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
840 | mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); // Also fixed, needs release after usage | 856 | mesh.getIndexListAsPtrToIntArray(out indices, out triStride, out indexCount); // Also fixed, needs release after usage |
841 | 857 | ||
842 | mesh.releaseSourceMeshData(); // free up the original mesh data to save memory | 858 | mesh.releaseSourceMeshData(); // free up the original mesh data to save memory |
859 | if (m_MeshToTriMeshMap.ContainsKey(mesh)) | ||
860 | { | ||
861 | _triMeshData = m_MeshToTriMeshMap[mesh]; | ||
862 | } | ||
863 | else | ||
864 | { | ||
865 | _triMeshData = d.GeomTriMeshDataCreate(); | ||
843 | 866 | ||
844 | _triMeshData = d.GeomTriMeshDataCreate(); | 867 | d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride); |
845 | 868 | d.GeomTriMeshDataPreprocess(_triMeshData); | |
846 | d.GeomTriMeshDataBuildSimple(_triMeshData, vertices, vertexStride, vertexCount, indices, indexCount, triStride); | 869 | m_MeshToTriMeshMap[mesh] = _triMeshData; |
847 | d.GeomTriMeshDataPreprocess(_triMeshData); | 870 | } |
848 | 871 | ||
849 | _parent_scene.waitForSpaceUnlock(m_targetSpace); | 872 | _parent_scene.waitForSpaceUnlock(m_targetSpace); |
850 | |||
851 | try | 873 | try |
852 | { | 874 | { |
853 | if (prim_geom == IntPtr.Zero) | 875 | if (prim_geom == IntPtr.Zero) |
854 | { | 876 | { |
855 | //Console.WriteLine(" setMesh 1"); | ||
856 | SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); | 877 | SetGeom(d.CreateTriMesh(m_targetSpace, _triMeshData, parent_scene.triCallback, null, null)); |
857 | } | 878 | } |
858 | } | 879 | } |
@@ -862,6 +883,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
862 | return; | 883 | return; |
863 | } | 884 | } |
864 | 885 | ||
886 | |||
865 | // if (IsPhysical && Body == (IntPtr) 0) | 887 | // if (IsPhysical && Body == (IntPtr) 0) |
866 | // { | 888 | // { |
867 | // Recreate the body | 889 | // Recreate the body |
@@ -882,7 +904,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
882 | 904 | ||
883 | if (prim_geom != IntPtr.Zero) | 905 | if (prim_geom != IntPtr.Zero) |
884 | { | 906 | { |
885 | if (!_position.IsIdentical(m_taintposition,0f)) | 907 | if (!_position.ApproxEquals(m_taintposition, 0f)) |
886 | changemove(timestep); | 908 | changemove(timestep); |
887 | 909 | ||
888 | if (m_taintrot != _orientation) | 910 | if (m_taintrot != _orientation) |
@@ -907,7 +929,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
907 | changePhysicsStatus(timestep); | 929 | changePhysicsStatus(timestep); |
908 | // | 930 | // |
909 | 931 | ||
910 | if (!_size.IsIdentical(m_taintsize,0)) | 932 | if (!_size.ApproxEquals(m_taintsize,0f)) |
911 | changesize(timestep); | 933 | changesize(timestep); |
912 | // | 934 | // |
913 | 935 | ||
@@ -921,7 +943,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
921 | if (m_taintaddangularforce) | 943 | if (m_taintaddangularforce) |
922 | changeAddAngularForce(timestep); | 944 | changeAddAngularForce(timestep); |
923 | 945 | ||
924 | if (!m_taintTorque.IsIdentical(PhysicsVector.Zero, 0.001f)) | 946 | if (!m_taintTorque.ApproxEquals(Vector3.Zero, 0.001f)) |
925 | changeSetTorque(timestep); | 947 | changeSetTorque(timestep); |
926 | 948 | ||
927 | if (m_taintdisable) | 949 | if (m_taintdisable) |
@@ -930,7 +952,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
930 | if (m_taintselected != m_isSelected) | 952 | if (m_taintselected != m_isSelected) |
931 | changeSelectedStatus(timestep); | 953 | changeSelectedStatus(timestep); |
932 | 954 | ||
933 | if (!m_taintVelocity.IsIdentical(PhysicsVector.Zero, 0.001f)) | 955 | if (!m_taintVelocity.ApproxEquals(Vector3.Zero, 0.001f)) |
934 | changevelocity(timestep); | 956 | changevelocity(timestep); |
935 | 957 | ||
936 | if (m_taintparent != _parent) | 958 | if (m_taintparent != _parent) |
@@ -939,7 +961,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
939 | if (m_taintCollidesWater != m_collidesWater) | 961 | if (m_taintCollidesWater != m_collidesWater) |
940 | changefloatonwater(timestep); | 962 | changefloatonwater(timestep); |
941 | 963 | ||
942 | if (!m_angularlock.IsIdentical(m_taintAngularLock,0)) | 964 | if (!m_angularlock.ApproxEquals(m_taintAngularLock,0f)) |
943 | changeAngularLock(timestep); | 965 | changeAngularLock(timestep); |
944 | 966 | ||
945 | } | 967 | } |
@@ -959,7 +981,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
959 | //If we have a parent then we're not authorative here | 981 | //If we have a parent then we're not authorative here |
960 | if (_parent == null) | 982 | if (_parent == null) |
961 | { | 983 | { |
962 | if (!m_taintAngularLock.IsIdentical(new PhysicsVector(1f,1f,1f), 0)) | 984 | if (!m_taintAngularLock.ApproxEquals(Vector3.One, 0f)) |
963 | { | 985 | { |
964 | //d.BodySetFiniteRotationMode(Body, 0); | 986 | //d.BodySetFiniteRotationMode(Body, 0); |
965 | //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); | 987 | //d.BodySetFiniteRotationAxis(Body,m_taintAngularLock.X,m_taintAngularLock.Y,m_taintAngularLock.Z); |
@@ -976,7 +998,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
976 | } | 998 | } |
977 | } | 999 | } |
978 | // Store this for later in case we get turned into a separate body | 1000 | // Store this for later in case we get turned into a separate body |
979 | m_angularlock = new PhysicsVector(m_taintAngularLock.X, m_taintAngularLock.Y, m_taintAngularLock.Z); | 1001 | m_angularlock = m_taintAngularLock; |
980 | 1002 | ||
981 | } | 1003 | } |
982 | 1004 | ||
@@ -1120,7 +1142,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1120 | prm.m_disabled = false; | 1142 | prm.m_disabled = false; |
1121 | 1143 | ||
1122 | // The body doesn't already have a finite rotation mode set here | 1144 | // The body doesn't already have a finite rotation mode set here |
1123 | if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null) | 1145 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) |
1124 | { | 1146 | { |
1125 | prm.createAMotor(m_angularlock); | 1147 | prm.createAMotor(m_angularlock); |
1126 | } | 1148 | } |
@@ -1163,7 +1185,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1163 | m_disabled = false; | 1185 | m_disabled = false; |
1164 | 1186 | ||
1165 | // The body doesn't already have a finite rotation mode set here | 1187 | // The body doesn't already have a finite rotation mode set here |
1166 | if ((!m_angularlock.IsIdentical(PhysicsVector.Zero, 0)) && _parent == null) | 1188 | if ((!m_angularlock.ApproxEquals(Vector3.Zero, 0f)) && _parent == null) |
1167 | { | 1189 | { |
1168 | createAMotor(m_angularlock); | 1190 | createAMotor(m_angularlock); |
1169 | } | 1191 | } |
@@ -1347,7 +1369,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1347 | m_taintshape = false; | 1369 | m_taintshape = false; |
1348 | m_taintforce = false; | 1370 | m_taintforce = false; |
1349 | m_taintdisable = false; | 1371 | m_taintdisable = false; |
1350 | m_taintVelocity = PhysicsVector.Zero; | 1372 | m_taintVelocity = Vector3.Zero; |
1351 | } | 1373 | } |
1352 | 1374 | ||
1353 | public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh) | 1375 | public void CreateGeom(IntPtr m_targetSpace, IMesh _mesh) |
@@ -1580,7 +1602,7 @@ if(frcount == 0) Console.WriteLine("Move " + m_primName + " VTyp " + m_vehicle | |||
1580 | { | 1602 | { |
1581 | if(!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009 | 1603 | if(!d.BodyIsEnabled (Body)) d.BodyEnable (Body); // KF add 161009 |
1582 | // NON-'VEHICLES' are dealt with here | 1604 | // NON-'VEHICLES' are dealt with here |
1583 | if (d.BodyIsEnabled(Body) && !m_angularlock.IsIdentical(PhysicsVector.Zero, 0.003f)) | 1605 | if (d.BodyIsEnabled(Body) && !m_angularlock.ApproxEquals(Vector3.Zero, 0.003f)) |
1584 | { | 1606 | { |
1585 | d.Vector3 avel2 = d.BodyGetAngularVel(Body); | 1607 | d.Vector3 avel2 = d.BodyGetAngularVel(Body); |
1586 | if (m_angularlock.X == 1) | 1608 | if (m_angularlock.X == 1) |
@@ -1634,7 +1656,7 @@ if(frcount == 0) Console.WriteLine("Move " + m_primName + " VTyp " + m_vehicle | |||
1634 | 1656 | ||
1635 | d.Vector3 pos = d.BodyGetPosition(Body); | 1657 | d.Vector3 pos = d.BodyGetPosition(Body); |
1636 | _target_velocity = | 1658 | _target_velocity = |
1637 | new PhysicsVector( | 1659 | new Vector3( |
1638 | (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), | 1660 | (m_PIDTarget.X - pos.X) * ((PID_G - m_PIDTau) * timestep), |
1639 | (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), | 1661 | (m_PIDTarget.Y - pos.Y) * ((PID_G - m_PIDTau) * timestep), |
1640 | (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) | 1662 | (m_PIDTarget.Z - pos.Z) * ((PID_G - m_PIDTau) * timestep) |
@@ -1642,7 +1664,7 @@ if(frcount == 0) Console.WriteLine("Move " + m_primName + " VTyp " + m_vehicle | |||
1642 | 1664 | ||
1643 | // if velocity is zero, use position control; otherwise, velocity control | 1665 | // if velocity is zero, use position control; otherwise, velocity control |
1644 | 1666 | ||
1645 | if (_target_velocity.IsIdentical(PhysicsVector.Zero,0.1f)) | 1667 | if (_target_velocity.ApproxEquals(Vector3.Zero,0.1f)) |
1646 | { | 1668 | { |
1647 | // keep track of where we stopped. No more slippin' & slidin' | 1669 | // keep track of where we stopped. No more slippin' & slidin' |
1648 | 1670 | ||
@@ -1727,13 +1749,13 @@ if(frcount == 0) Console.WriteLine("Move " + m_primName + " VTyp " + m_vehicle | |||
1727 | 1749 | ||
1728 | 1750 | ||
1729 | _target_velocity = | 1751 | _target_velocity = |
1730 | new PhysicsVector(0.0f, 0.0f, | 1752 | new Vector3(0.0f, 0.0f, |
1731 | (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) | 1753 | (m_targetHoverHeight - pos.Z) * ((PID_G - m_PIDHoverTau) * timestep) |
1732 | ); | 1754 | ); |
1733 | 1755 | ||
1734 | // if velocity is zero, use position control; otherwise, velocity control | 1756 | // if velocity is zero, use position control; otherwise, velocity control |
1735 | 1757 | ||
1736 | if (_target_velocity.IsIdentical(PhysicsVector.Zero, 0.1f)) | 1758 | if (_target_velocity.ApproxEquals(Vector3.Zero, 0.1f)) |
1737 | { | 1759 | { |
1738 | // keep track of where we stopped. No more slippin' & slidin' | 1760 | // keep track of where we stopped. No more slippin' & slidin' |
1739 | 1761 | ||
@@ -1860,7 +1882,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
1860 | d.BodySetQuaternion(Body, ref myrot); | 1882 | d.BodySetQuaternion(Body, ref myrot); |
1861 | if (m_isphysical) | 1883 | if (m_isphysical) |
1862 | { | 1884 | { |
1863 | if (!m_angularlock.IsIdentical(new PhysicsVector(1, 1, 1), 0)) | 1885 | if (!m_angularlock.ApproxEquals(Vector3.One, 0f)) |
1864 | createAMotor(m_angularlock); | 1886 | createAMotor(m_angularlock); |
1865 | } | 1887 | } |
1866 | } | 1888 | } |
@@ -2169,7 +2191,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2169 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | 2191 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
2170 | if (IsPhysical) | 2192 | if (IsPhysical) |
2171 | { | 2193 | { |
2172 | PhysicsVector iforce = new PhysicsVector(); | 2194 | Vector3 iforce = Vector3.Zero; |
2173 | for (int i = 0; i < m_forcelist.Count; i++) | 2195 | for (int i = 0; i < m_forcelist.Count; i++) |
2174 | { | 2196 | { |
2175 | iforce = iforce + (m_forcelist[i] * 100); | 2197 | iforce = iforce + (m_forcelist[i] * 100); |
@@ -2199,8 +2221,8 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2199 | d.BodySetTorque(Body, m_taintTorque.X, m_taintTorque.Y, m_taintTorque.Z); | 2221 | d.BodySetTorque(Body, m_taintTorque.X, m_taintTorque.Y, m_taintTorque.Z); |
2200 | } | 2222 | } |
2201 | } | 2223 | } |
2202 | 2224 | ||
2203 | m_taintTorque = new PhysicsVector(0, 0, 0); | 2225 | m_taintTorque = Vector3.Zero; |
2204 | } | 2226 | } |
2205 | 2227 | ||
2206 | public void changeAddAngularForce(float timestamp) | 2228 | public void changeAddAngularForce(float timestamp) |
@@ -2212,7 +2234,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2212 | //m_log.Info("[PHYSICS]: dequeing forcelist"); | 2234 | //m_log.Info("[PHYSICS]: dequeing forcelist"); |
2213 | if (IsPhysical) | 2235 | if (IsPhysical) |
2214 | { | 2236 | { |
2215 | PhysicsVector iforce = new PhysicsVector(); | 2237 | Vector3 iforce = Vector3.Zero; |
2216 | for (int i = 0; i < m_angularforcelist.Count; i++) | 2238 | for (int i = 0; i < m_angularforcelist.Count; i++) |
2217 | { | 2239 | { |
2218 | iforce = iforce + (m_angularforcelist[i] * 100); | 2240 | iforce = iforce + (m_angularforcelist[i] * 100); |
@@ -2246,7 +2268,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2246 | 2268 | ||
2247 | //resetCollisionAccounting(); | 2269 | //resetCollisionAccounting(); |
2248 | } | 2270 | } |
2249 | m_taintVelocity = PhysicsVector.Zero; | 2271 | m_taintVelocity = Vector3.Zero; |
2250 | } | 2272 | } |
2251 | 2273 | ||
2252 | public override bool IsPhysical | 2274 | public override bool IsPhysical |
@@ -2255,7 +2277,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2255 | set { | 2277 | set { |
2256 | m_isphysical = value; | 2278 | m_isphysical = value; |
2257 | if (!m_isphysical) // Zero the remembered last velocity | 2279 | if (!m_isphysical) // Zero the remembered last velocity |
2258 | m_lastVelocity = new PhysicsVector(0.0f, 0.0f, 0.0f); | 2280 | m_lastVelocity = Vector3.Zero; |
2259 | } | 2281 | } |
2260 | } | 2282 | } |
2261 | 2283 | ||
@@ -2300,7 +2322,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2300 | get { return _zeroFlag; } | 2322 | get { return _zeroFlag; } |
2301 | } | 2323 | } |
2302 | 2324 | ||
2303 | public override PhysicsVector Position | 2325 | public override Vector3 Position |
2304 | { | 2326 | { |
2305 | get { return _position; } | 2327 | get { return _position; } |
2306 | 2328 | ||
@@ -2309,12 +2331,12 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2309 | } | 2331 | } |
2310 | } | 2332 | } |
2311 | 2333 | ||
2312 | public override PhysicsVector Size | 2334 | public override Vector3 Size |
2313 | { | 2335 | { |
2314 | get { return _size; } | 2336 | get { return _size; } |
2315 | set | 2337 | set |
2316 | { | 2338 | { |
2317 | if (PhysicsVector.isFinite(value)) | 2339 | if (value.IsFinite()) |
2318 | { | 2340 | { |
2319 | _size = value; | 2341 | _size = value; |
2320 | } | 2342 | } |
@@ -2330,13 +2352,13 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2330 | get { return CalculateMass(); } | 2352 | get { return CalculateMass(); } |
2331 | } | 2353 | } |
2332 | 2354 | ||
2333 | public override PhysicsVector Force | 2355 | public override Vector3 Force |
2334 | { | 2356 | { |
2335 | //get { return PhysicsVector.Zero; } | 2357 | //get { return Vector3.Zero; } |
2336 | get { return m_force; } | 2358 | get { return m_force; } |
2337 | set | 2359 | set |
2338 | { | 2360 | { |
2339 | if (PhysicsVector.isFinite(value)) | 2361 | if (value.IsFinite()) |
2340 | { | 2362 | { |
2341 | m_force = value; | 2363 | m_force = value; |
2342 | } | 2364 | } |
@@ -2358,7 +2380,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2358 | m_vehicle.ProcessFloatVehicleParam((Vehicle) param, value); | 2380 | m_vehicle.ProcessFloatVehicleParam((Vehicle) param, value); |
2359 | } | 2381 | } |
2360 | 2382 | ||
2361 | public override void VehicleVectorParam(int param, PhysicsVector value) | 2383 | public override void VehicleVectorParam(int param, Vector3 value) |
2362 | { | 2384 | { |
2363 | m_vehicle.ProcessVectorVehicleParam((Vehicle) param, value); | 2385 | m_vehicle.ProcessVectorVehicleParam((Vehicle) param, value); |
2364 | } | 2386 | } |
@@ -2376,14 +2398,14 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2376 | } | 2398 | } |
2377 | } | 2399 | } |
2378 | 2400 | ||
2379 | public override PhysicsVector CenterOfMass | 2401 | public override Vector3 CenterOfMass |
2380 | { | 2402 | { |
2381 | get { return PhysicsVector.Zero; } | 2403 | get { return Vector3.Zero; } |
2382 | } | 2404 | } |
2383 | 2405 | ||
2384 | public override PhysicsVector GeometricCenter | 2406 | public override Vector3 GeometricCenter |
2385 | { | 2407 | { |
2386 | get { return PhysicsVector.Zero; } | 2408 | get { return Vector3.Zero; } |
2387 | } | 2409 | } |
2388 | 2410 | ||
2389 | public override PrimitiveBaseShape Shape | 2411 | public override PrimitiveBaseShape Shape |
@@ -2395,13 +2417,13 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2395 | } | 2417 | } |
2396 | } | 2418 | } |
2397 | 2419 | ||
2398 | public override PhysicsVector Velocity | 2420 | public override Vector3 Velocity |
2399 | { | 2421 | { |
2400 | get | 2422 | get |
2401 | { | 2423 | { |
2402 | // Averate previous velocity with the new one so | 2424 | // Averate previous velocity with the new one so |
2403 | // client object interpolation works a 'little' better | 2425 | // client object interpolation works a 'little' better |
2404 | PhysicsVector returnVelocity = new PhysicsVector(); | 2426 | Vector3 returnVelocity = Vector3.Zero; |
2405 | returnVelocity.X = (m_lastVelocity.X + _velocity.X)/2; | 2427 | returnVelocity.X = (m_lastVelocity.X + _velocity.X)/2; |
2406 | returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y)/2; | 2428 | returnVelocity.Y = (m_lastVelocity.Y + _velocity.Y)/2; |
2407 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z)/2; | 2429 | returnVelocity.Z = (m_lastVelocity.Z + _velocity.Z)/2; |
@@ -2409,7 +2431,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2409 | } | 2431 | } |
2410 | set | 2432 | set |
2411 | { | 2433 | { |
2412 | if (PhysicsVector.isFinite(value)) | 2434 | if (value.IsFinite()) |
2413 | { | 2435 | { |
2414 | _velocity = value; | 2436 | _velocity = value; |
2415 | 2437 | ||
@@ -2424,19 +2446,19 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2424 | } | 2446 | } |
2425 | } | 2447 | } |
2426 | 2448 | ||
2427 | public override PhysicsVector Torque | 2449 | public override Vector3 Torque |
2428 | { | 2450 | { |
2429 | get | 2451 | get |
2430 | { | 2452 | { |
2431 | if (!m_isphysical || Body == IntPtr.Zero) | 2453 | if (!m_isphysical || Body == IntPtr.Zero) |
2432 | return new PhysicsVector(0,0,0); | 2454 | return Vector3.Zero; |
2433 | 2455 | ||
2434 | return _torque; | 2456 | return _torque; |
2435 | } | 2457 | } |
2436 | 2458 | ||
2437 | set | 2459 | set |
2438 | { | 2460 | { |
2439 | if (PhysicsVector.isFinite(value)) | 2461 | if (value.IsFinite()) |
2440 | { | 2462 | { |
2441 | m_taintTorque = value; | 2463 | m_taintTorque = value; |
2442 | _parent_scene.AddPhysicsActorTaint(this); | 2464 | _parent_scene.AddPhysicsActorTaint(this); |
@@ -2488,20 +2510,20 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2488 | return true; | 2510 | return true; |
2489 | } | 2511 | } |
2490 | 2512 | ||
2491 | public override PhysicsVector Acceleration | 2513 | public override Vector3 Acceleration |
2492 | { | 2514 | { |
2493 | get { return _acceleration; } | 2515 | get { return _acceleration; } |
2494 | } | 2516 | } |
2495 | 2517 | ||
2496 | 2518 | ||
2497 | public void SetAcceleration(PhysicsVector accel) | 2519 | public void SetAcceleration(Vector3 accel) |
2498 | { | 2520 | { |
2499 | _acceleration = accel; | 2521 | _acceleration = accel; |
2500 | } | 2522 | } |
2501 | 2523 | ||
2502 | public override void AddForce(PhysicsVector force, bool pushforce) | 2524 | public override void AddForce(Vector3 force, bool pushforce) |
2503 | { | 2525 | { |
2504 | if (PhysicsVector.isFinite(force)) | 2526 | if (force.IsFinite()) |
2505 | { | 2527 | { |
2506 | m_forcelist.Add(force); | 2528 | m_forcelist.Add(force); |
2507 | m_taintforce = true; | 2529 | m_taintforce = true; |
@@ -2513,9 +2535,9 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2513 | //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); | 2535 | //m_log.Info("[PHYSICS]: Added Force:" + force.ToString() + " to prim at " + Position.ToString()); |
2514 | } | 2536 | } |
2515 | 2537 | ||
2516 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 2538 | public override void AddAngularForce(Vector3 force, bool pushforce) |
2517 | { | 2539 | { |
2518 | if (PhysicsVector.isFinite(force)) | 2540 | if (force.IsFinite()) |
2519 | { | 2541 | { |
2520 | m_angularforcelist.Add(force); | 2542 | m_angularforcelist.Add(force); |
2521 | m_taintaddangularforce = true; | 2543 | m_taintaddangularforce = true; |
@@ -2526,23 +2548,23 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2526 | } | 2548 | } |
2527 | } | 2549 | } |
2528 | 2550 | ||
2529 | public override PhysicsVector RotationalVelocity | 2551 | public override Vector3 RotationalVelocity |
2530 | { | 2552 | { |
2531 | get | 2553 | get |
2532 | { | 2554 | { |
2533 | PhysicsVector pv = new PhysicsVector(0, 0, 0); | 2555 | Vector3 pv = Vector3.Zero; |
2534 | if (_zeroFlag) | 2556 | if (_zeroFlag) |
2535 | return pv; | 2557 | return pv; |
2536 | m_lastUpdateSent = false; | 2558 | m_lastUpdateSent = false; |
2537 | 2559 | ||
2538 | if (m_rotationalVelocity.IsIdentical(pv, 0.2f)) | 2560 | if (m_rotationalVelocity.ApproxEquals(pv, 0.2f)) |
2539 | return pv; | 2561 | return pv; |
2540 | 2562 | ||
2541 | return m_rotationalVelocity; | 2563 | return m_rotationalVelocity; |
2542 | } | 2564 | } |
2543 | set | 2565 | set |
2544 | { | 2566 | { |
2545 | if (PhysicsVector.isFinite(value)) | 2567 | if (value.IsFinite()) |
2546 | { | 2568 | { |
2547 | m_rotationalVelocity = value; | 2569 | m_rotationalVelocity = value; |
2548 | } | 2570 | } |
@@ -2583,16 +2605,16 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2583 | m_taintparent = null; | 2605 | m_taintparent = null; |
2584 | } | 2606 | } |
2585 | 2607 | ||
2586 | public override void LockAngularMotion(PhysicsVector axis) | 2608 | public override void LockAngularMotion(Vector3 axis) |
2587 | { | 2609 | { |
2588 | // reverse the zero/non zero values for ODE. | 2610 | // reverse the zero/non zero values for ODE. |
2589 | if (PhysicsVector.isFinite(axis)) | 2611 | if (axis.IsFinite()) |
2590 | { | 2612 | { |
2591 | axis.X = (axis.X > 0) ? 1f : 0f; | 2613 | axis.X = (axis.X > 0) ? 1f : 0f; |
2592 | axis.Y = (axis.Y > 0) ? 1f : 0f; | 2614 | axis.Y = (axis.Y > 0) ? 1f : 0f; |
2593 | axis.Z = (axis.Z > 0) ? 1f : 0f; | 2615 | axis.Z = (axis.Z > 0) ? 1f : 0f; |
2594 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); | 2616 | m_log.DebugFormat("[axislock]: <{0},{1},{2}>", axis.X, axis.Y, axis.Z); |
2595 | m_taintAngularLock = new PhysicsVector(axis.X, axis.Y, axis.Z); | 2617 | m_taintAngularLock = axis; |
2596 | } | 2618 | } |
2597 | else | 2619 | else |
2598 | { | 2620 | { |
@@ -2605,7 +2627,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2605 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! | 2627 | // no lock; called from Simulate() -- if you call this from elsewhere, gotta lock or do Monitor.Enter/Exit! |
2606 | if (_parent == null) | 2628 | if (_parent == null) |
2607 | { | 2629 | { |
2608 | PhysicsVector pv = new PhysicsVector(0, 0, 0); | 2630 | Vector3 pv = Vector3.Zero; |
2609 | bool lastZeroFlag = _zeroFlag; | 2631 | bool lastZeroFlag = _zeroFlag; |
2610 | if (Body != (IntPtr)0) // FIXME -> or if it is a joint | 2632 | if (Body != (IntPtr)0) // FIXME -> or if it is a joint |
2611 | { | 2633 | { |
@@ -2614,9 +2636,9 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2614 | d.Vector3 vel = d.BodyGetLinearVel(Body); | 2636 | d.Vector3 vel = d.BodyGetLinearVel(Body); |
2615 | d.Vector3 rotvel = d.BodyGetAngularVel(Body); | 2637 | d.Vector3 rotvel = d.BodyGetAngularVel(Body); |
2616 | d.Vector3 torque = d.BodyGetTorque(Body); | 2638 | d.Vector3 torque = d.BodyGetTorque(Body); |
2617 | _torque.setValues(torque.X, torque.Y, torque.Z); | 2639 | _torque = new Vector3(torque.X, torque.Y, torque.Z); |
2618 | PhysicsVector l_position = new PhysicsVector(); | 2640 | Vector3 l_position = Vector3.Zero; |
2619 | Quaternion l_orientation = new Quaternion(); | 2641 | Quaternion l_orientation = Quaternion.Identity; |
2620 | 2642 | ||
2621 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) | 2643 | // kluge to keep things in bounds. ODE lets dead avatars drift away (they should be removed!) |
2622 | //if (vec.X < 0.0f) { vec.X = 0.0f; if (Body != (IntPtr)0) d.BodySetAngularVel(Body, 0, 0, 0); } | 2644 | //if (vec.X < 0.0f) { vec.X = 0.0f; if (Body != (IntPtr)0) d.BodySetAngularVel(Body, 0, 0, 0); } |
@@ -2751,16 +2773,16 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2751 | _velocity.Z = vel.Z; | 2773 | _velocity.Z = vel.Z; |
2752 | 2774 | ||
2753 | _acceleration = ((_velocity - m_lastVelocity) / 0.1f); | 2775 | _acceleration = ((_velocity - m_lastVelocity) / 0.1f); |
2754 | _acceleration = new PhysicsVector(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f); | 2776 | _acceleration = new Vector3(_velocity.X - m_lastVelocity.X / 0.1f, _velocity.Y - m_lastVelocity.Y / 0.1f, _velocity.Z - m_lastVelocity.Z / 0.1f); |
2755 | //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); | 2777 | //m_log.Info("[PHYSICS]: V1: " + _velocity + " V2: " + m_lastVelocity + " Acceleration: " + _acceleration.ToString()); |
2756 | 2778 | ||
2757 | if (_velocity.IsIdentical(pv, 0.5f)) | 2779 | if (_velocity.ApproxEquals(pv, 0.5f)) |
2758 | { | 2780 | { |
2759 | m_rotationalVelocity = pv; | 2781 | m_rotationalVelocity = pv; |
2760 | } | 2782 | } |
2761 | else | 2783 | else |
2762 | { | 2784 | { |
2763 | m_rotationalVelocity.setValues(rotvel.X, rotvel.Y, rotvel.Z); | 2785 | m_rotationalVelocity = new Vector3(rotvel.X, rotvel.Y, rotvel.Z); |
2764 | } | 2786 | } |
2765 | 2787 | ||
2766 | //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); | 2788 | //m_log.Debug("ODE: " + m_rotationalVelocity.ToString()); |
@@ -2808,15 +2830,15 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2808 | } | 2830 | } |
2809 | } | 2831 | } |
2810 | 2832 | ||
2811 | public override void SetMomentum(PhysicsVector momentum) | 2833 | public override void SetMomentum(Vector3 momentum) |
2812 | { | 2834 | { |
2813 | } | 2835 | } |
2814 | 2836 | ||
2815 | public override PhysicsVector PIDTarget | 2837 | public override Vector3 PIDTarget |
2816 | { | 2838 | { |
2817 | set | 2839 | set |
2818 | { | 2840 | { |
2819 | if (PhysicsVector.isFinite(value)) | 2841 | if (value.IsFinite()) |
2820 | { | 2842 | { |
2821 | m_PIDTarget = value; | 2843 | m_PIDTarget = value; |
2822 | } | 2844 | } |
@@ -2838,7 +2860,7 @@ if(frcount == 0) Console.WriteLine("mass= " + m_mass + " servo= " + RLAservo + | |||
2838 | public override PIDHoverType PIDHoverType { set { m_PIDHoverType = value; } } | 2860 | public override PIDHoverType PIDHoverType { set { m_PIDHoverType = value; } } |
2839 | public override float PIDHoverTau { set { m_PIDHoverTau = value; } } | 2861 | public override float PIDHoverTau { set { m_PIDHoverTau = value; } } |
2840 | 2862 | ||
2841 | private void createAMotor(PhysicsVector axis) | 2863 | private void createAMotor(Vector3 axis) |
2842 | { | 2864 | { |
2843 | if (Body == IntPtr.Zero) | 2865 | if (Body == IntPtr.Zero) |
2844 | return; | 2866 | return; |
diff --git a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs index 0a065be..2f42646 100644 --- a/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs +++ b/OpenSim/Region/Physics/OdePlugin/OdePlugin.cs | |||
@@ -239,6 +239,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
239 | private readonly HashSet<OdePrim> _prims = new HashSet<OdePrim>(); | 239 | private readonly HashSet<OdePrim> _prims = new HashSet<OdePrim>(); |
240 | private readonly HashSet<OdePrim> _activeprims = new HashSet<OdePrim>(); | 240 | private readonly HashSet<OdePrim> _activeprims = new HashSet<OdePrim>(); |
241 | private readonly HashSet<OdePrim> _taintedPrimH = new HashSet<OdePrim>(); | 241 | private readonly HashSet<OdePrim> _taintedPrimH = new HashSet<OdePrim>(); |
242 | private readonly Object _taintedPrimLock = new Object(); | ||
242 | private readonly List<OdePrim> _taintedPrimL = new List<OdePrim>(); | 243 | private readonly List<OdePrim> _taintedPrimL = new List<OdePrim>(); |
243 | private readonly HashSet<OdeCharacter> _taintedActors = new HashSet<OdeCharacter>(); | 244 | private readonly HashSet<OdeCharacter> _taintedActors = new HashSet<OdeCharacter>(); |
244 | private readonly List<d.ContactGeom> _perloopContact = new List<d.ContactGeom>(); | 245 | private readonly List<d.ContactGeom> _perloopContact = new List<d.ContactGeom>(); |
@@ -683,7 +684,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
683 | /// </summary> | 684 | /// </summary> |
684 | /// <param name="pos"></param> | 685 | /// <param name="pos"></param> |
685 | /// <returns>Returns which split up space the given position is in.</returns> | 686 | /// <returns>Returns which split up space the given position is in.</returns> |
686 | public string whichspaceamIin(PhysicsVector pos) | 687 | public string whichspaceamIin(Vector3 pos) |
687 | { | 688 | { |
688 | return calculateSpaceForGeom(pos).ToString(); | 689 | return calculateSpaceForGeom(pos).ToString(); |
689 | } | 690 | } |
@@ -962,7 +963,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
962 | 963 | ||
963 | //p2.CollidingObj = true; | 964 | //p2.CollidingObj = true; |
964 | contacts[i].depth = 0.00000003f; | 965 | contacts[i].depth = 0.00000003f; |
965 | p2.Velocity = p2.Velocity + new PhysicsVector(0, 0, 0.5f); | 966 | p2.Velocity = p2.Velocity + new Vector3(0f, 0f, 0.5f); |
966 | contacts[i].pos = | 967 | contacts[i].pos = |
967 | new d.Vector3(contacts[i].pos.X + (p1.Size.X/2), | 968 | new d.Vector3(contacts[i].pos.X + (p1.Size.X/2), |
968 | contacts[i].pos.Y + (p1.Size.Y/2), | 969 | contacts[i].pos.Y + (p1.Size.Y/2), |
@@ -980,7 +981,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
980 | 981 | ||
981 | //p2.CollidingObj = true; | 982 | //p2.CollidingObj = true; |
982 | contacts[i].depth = 0.00000003f; | 983 | contacts[i].depth = 0.00000003f; |
983 | p1.Velocity = p1.Velocity + new PhysicsVector(0, 0, 0.5f); | 984 | p1.Velocity = p1.Velocity + new Vector3(0f, 0f, 0.5f); |
984 | contacts[i].pos = | 985 | contacts[i].pos = |
985 | new d.Vector3(contacts[i].pos.X + (p1.Size.X/2), | 986 | new d.Vector3(contacts[i].pos.X + (p1.Size.X/2), |
986 | contacts[i].pos.Y + (p1.Size.Y/2), | 987 | contacts[i].pos.Y + (p1.Size.Y/2), |
@@ -1645,9 +1646,9 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1645 | 1646 | ||
1646 | #region Add/Remove Entities | 1647 | #region Add/Remove Entities |
1647 | 1648 | ||
1648 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 1649 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
1649 | { | 1650 | { |
1650 | PhysicsVector pos = new PhysicsVector(); | 1651 | Vector3 pos; |
1651 | pos.X = position.X; | 1652 | pos.X = position.X; |
1652 | pos.Y = position.Y; | 1653 | pos.Y = position.Y; |
1653 | pos.Z = position.Z; | 1654 | pos.Z = position.Z; |
@@ -1697,18 +1698,12 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1697 | 1698 | ||
1698 | } | 1699 | } |
1699 | 1700 | ||
1700 | private PhysicsActor AddPrim(String name, PhysicsVector position, PhysicsVector size, Quaternion rotation, | 1701 | private PhysicsActor AddPrim(String name, Vector3 position, Vector3 size, Quaternion rotation, |
1701 | IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) | 1702 | IMesh mesh, PrimitiveBaseShape pbs, bool isphysical) |
1702 | { | 1703 | { |
1703 | 1704 | ||
1704 | PhysicsVector pos = new PhysicsVector(position.X, position.Y, position.Z); | 1705 | Vector3 pos = position; |
1705 | //pos.X = position.X; | 1706 | Vector3 siz = size; |
1706 | //pos.Y = position.Y; | ||
1707 | //pos.Z = position.Z; | ||
1708 | PhysicsVector siz = new PhysicsVector(); | ||
1709 | siz.X = size.X; | ||
1710 | siz.Y = size.Y; | ||
1711 | siz.Z = size.Z; | ||
1712 | Quaternion rot = rotation; | 1707 | Quaternion rot = rotation; |
1713 | 1708 | ||
1714 | OdePrim newPrim; | 1709 | OdePrim newPrim; |
@@ -1735,14 +1730,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1735 | } | 1730 | } |
1736 | } | 1731 | } |
1737 | 1732 | ||
1738 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 1733 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
1739 | PhysicsVector size, Quaternion rotation) //To be removed | 1734 | Vector3 size, Quaternion rotation) //To be removed |
1740 | { | 1735 | { |
1741 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 1736 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
1742 | } | 1737 | } |
1743 | 1738 | ||
1744 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 1739 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
1745 | PhysicsVector size, Quaternion rotation, bool isPhysical) | 1740 | Vector3 size, Quaternion rotation, bool isPhysical) |
1746 | { | 1741 | { |
1747 | PhysicsActor result; | 1742 | PhysicsActor result; |
1748 | IMesh mesh = null; | 1743 | IMesh mesh = null; |
@@ -1975,7 +1970,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1975 | // this joint will just be added to a waiting list that is NOT processed during the main | 1970 | // this joint will just be added to a waiting list that is NOT processed during the main |
1976 | // Simulate() loop (to avoid deadlocks). After Simulate() is finished, we handle unprocessed joint requests. | 1971 | // Simulate() loop (to avoid deadlocks). After Simulate() is finished, we handle unprocessed joint requests. |
1977 | 1972 | ||
1978 | public override PhysicsJoint RequestJointCreation(string objectNameInScene, PhysicsJointType jointType, PhysicsVector position, | 1973 | public override PhysicsJoint RequestJointCreation(string objectNameInScene, PhysicsJointType jointType, Vector3 position, |
1979 | Quaternion rotation, string parms, List<string> bodyNames, string trackedBodyName, Quaternion localRotation) | 1974 | Quaternion rotation, string parms, List<string> bodyNames, string trackedBodyName, Quaternion localRotation) |
1980 | 1975 | ||
1981 | { | 1976 | { |
@@ -1983,7 +1978,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
1983 | OdePhysicsJoint joint = new OdePhysicsJoint(); | 1978 | OdePhysicsJoint joint = new OdePhysicsJoint(); |
1984 | joint.ObjectNameInScene = objectNameInScene; | 1979 | joint.ObjectNameInScene = objectNameInScene; |
1985 | joint.Type = jointType; | 1980 | joint.Type = jointType; |
1986 | joint.Position = new PhysicsVector(position.X, position.Y, position.Z); | 1981 | joint.Position = position; |
1987 | joint.Rotation = rotation; | 1982 | joint.Rotation = rotation; |
1988 | joint.RawParams = parms; | 1983 | joint.RawParams = parms; |
1989 | joint.BodyNames = new List<string>(bodyNames); | 1984 | joint.BodyNames = new List<string>(bodyNames); |
@@ -2035,7 +2030,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2035 | } | 2030 | } |
2036 | 2031 | ||
2037 | // normally called from within OnJointMoved, which is called from within a lock (OdeLock) | 2032 | // normally called from within OnJointMoved, which is called from within a lock (OdeLock) |
2038 | public override PhysicsVector GetJointAnchor(PhysicsJoint joint) | 2033 | public override Vector3 GetJointAnchor(PhysicsJoint joint) |
2039 | { | 2034 | { |
2040 | Debug.Assert(joint.IsInPhysicsEngine); | 2035 | Debug.Assert(joint.IsInPhysicsEngine); |
2041 | d.Vector3 pos = new d.Vector3(); | 2036 | d.Vector3 pos = new d.Vector3(); |
@@ -2057,14 +2052,14 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2057 | break; | 2052 | break; |
2058 | } | 2053 | } |
2059 | } | 2054 | } |
2060 | return new PhysicsVector(pos.X, pos.Y, pos.Z); | 2055 | return new Vector3(pos.X, pos.Y, pos.Z); |
2061 | } | 2056 | } |
2062 | 2057 | ||
2063 | // normally called from within OnJointMoved, which is called from within a lock (OdeLock) | 2058 | // normally called from within OnJointMoved, which is called from within a lock (OdeLock) |
2064 | // WARNING: ODE sometimes returns <0,0,0> as the joint axis! Therefore this function | 2059 | // WARNING: ODE sometimes returns <0,0,0> as the joint axis! Therefore this function |
2065 | // appears to be unreliable. Fortunately we can compute the joint axis ourselves by | 2060 | // appears to be unreliable. Fortunately we can compute the joint axis ourselves by |
2066 | // keeping track of the joint's original orientation relative to one of the involved bodies. | 2061 | // keeping track of the joint's original orientation relative to one of the involved bodies. |
2067 | public override PhysicsVector GetJointAxis(PhysicsJoint joint) | 2062 | public override Vector3 GetJointAxis(PhysicsJoint joint) |
2068 | { | 2063 | { |
2069 | Debug.Assert(joint.IsInPhysicsEngine); | 2064 | Debug.Assert(joint.IsInPhysicsEngine); |
2070 | d.Vector3 axis = new d.Vector3(); | 2065 | d.Vector3 axis = new d.Vector3(); |
@@ -2086,7 +2081,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2086 | break; | 2081 | break; |
2087 | } | 2082 | } |
2088 | } | 2083 | } |
2089 | return new PhysicsVector(axis.X, axis.Y, axis.Z); | 2084 | return new Vector3(axis.X, axis.Y, axis.Z); |
2090 | } | 2085 | } |
2091 | 2086 | ||
2092 | 2087 | ||
@@ -2254,7 +2249,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2254 | /// <param name="pos">the position that the geom moved to</param> | 2249 | /// <param name="pos">the position that the geom moved to</param> |
2255 | /// <param name="currentspace">a pointer to the space it was in before it was moved.</param> | 2250 | /// <param name="currentspace">a pointer to the space it was in before it was moved.</param> |
2256 | /// <returns>a pointer to the new space it's in</returns> | 2251 | /// <returns>a pointer to the new space it's in</returns> |
2257 | public IntPtr recalculateSpaceForGeom(IntPtr geom, PhysicsVector pos, IntPtr currentspace) | 2252 | public IntPtr recalculateSpaceForGeom(IntPtr geom, Vector3 pos, IntPtr currentspace) |
2258 | { | 2253 | { |
2259 | // Called from setting the Position and Size of an ODEPrim so | 2254 | // Called from setting the Position and Size of an ODEPrim so |
2260 | // it's already in locked space. | 2255 | // it's already in locked space. |
@@ -2401,7 +2396,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2401 | /// </summary> | 2396 | /// </summary> |
2402 | /// <param name="pos"></param> | 2397 | /// <param name="pos"></param> |
2403 | /// <returns>a pointer to the space. This could be a new space or reused space.</returns> | 2398 | /// <returns>a pointer to the space. This could be a new space or reused space.</returns> |
2404 | public IntPtr calculateSpaceForGeom(PhysicsVector pos) | 2399 | public IntPtr calculateSpaceForGeom(Vector3 pos) |
2405 | { | 2400 | { |
2406 | int[] xyspace = calculateSpaceArrayItemFromPos(pos); | 2401 | int[] xyspace = calculateSpaceArrayItemFromPos(pos); |
2407 | //m_log.Info("[Physics]: Attempting to use arrayItem: " + xyspace[0].ToString() + "," + xyspace[1].ToString()); | 2402 | //m_log.Info("[Physics]: Attempting to use arrayItem: " + xyspace[0].ToString() + "," + xyspace[1].ToString()); |
@@ -2413,7 +2408,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2413 | /// </summary> | 2408 | /// </summary> |
2414 | /// <param name="pos"></param> | 2409 | /// <param name="pos"></param> |
2415 | /// <returns>an array item based on the position</returns> | 2410 | /// <returns>an array item based on the position</returns> |
2416 | public int[] calculateSpaceArrayItemFromPos(PhysicsVector pos) | 2411 | public int[] calculateSpaceArrayItemFromPos(Vector3 pos) |
2417 | { | 2412 | { |
2418 | int[] returnint = new int[2]; | 2413 | int[] returnint = new int[2]; |
2419 | 2414 | ||
@@ -2572,7 +2567,7 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2572 | if (prim is OdePrim) | 2567 | if (prim is OdePrim) |
2573 | { | 2568 | { |
2574 | OdePrim taintedprim = ((OdePrim) prim); | 2569 | OdePrim taintedprim = ((OdePrim) prim); |
2575 | lock (_taintedPrimH) | 2570 | lock (_taintedPrimLock) |
2576 | { | 2571 | { |
2577 | if (!(_taintedPrimH.Contains(taintedprim))) | 2572 | if (!(_taintedPrimH.Contains(taintedprim))) |
2578 | { | 2573 | { |
@@ -2700,24 +2695,28 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
2700 | // Modify other objects in the scene. | 2695 | // Modify other objects in the scene. |
2701 | processedtaints = false; | 2696 | processedtaints = false; |
2702 | 2697 | ||
2703 | lock (_taintedPrimL) | 2698 | lock (_taintedPrimLock) |
2704 | { | 2699 | { |
2705 | foreach (OdePrim prim in _taintedPrimL) | 2700 | foreach (OdePrim prim in _taintedPrimL) |
2706 | { | 2701 | { |
2707 | |||
2708 | |||
2709 | if (prim.m_taintremove) | 2702 | if (prim.m_taintremove) |
2710 | { | 2703 | { |
2711 | //Console.WriteLine("Simulate calls RemovePrimThreadLocked"); | 2704 | //Console.WriteLine("Simulate calls RemovePrimThreadLocked"); |
2712 | RemovePrimThreadLocked(prim); | 2705 | RemovePrimThreadLocked(prim); |
2713 | } | 2706 | } |
2714 | else | 2707 | else |
2715 | { | 2708 | { |
2716 | //Console.WriteLine("Simulate calls ProcessTaints"); | 2709 | //Console.WriteLine("Simulate calls ProcessTaints"); |
2717 | prim.ProcessTaints(timeStep); | 2710 | prim.ProcessTaints(timeStep); |
2718 | } | 2711 | } |
2719 | processedtaints = true; | 2712 | processedtaints = true; |
2720 | prim.m_collisionscore = 0; | 2713 | prim.m_collisionscore = 0; |
2714 | |||
2715 | // This loop can block up the Heartbeat for a very long time on large regions. | ||
2716 | // We need to let the Watchdog know that the Heartbeat is not dead | ||
2717 | // NOTE: This is currently commented out, but if things like OAR loading are | ||
2718 | // timing the heartbeat out we will need to uncomment it | ||
2719 | //Watchdog.UpdateThread(); | ||
2721 | } | 2720 | } |
2722 | 2721 | ||
2723 | if (SupportsNINJAJoints) | 2722 | if (SupportsNINJAJoints) |
diff --git a/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs b/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs index cdd38c4..69e2d03 100644 --- a/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs +++ b/OpenSim/Region/Physics/OdePlugin/Tests/ODETestClass.cs | |||
@@ -76,8 +76,8 @@ namespace OpenSim.Region.Physics.OdePlugin | |||
76 | public void CreateAndDropPhysicalCube() | 76 | public void CreateAndDropPhysicalCube() |
77 | { | 77 | { |
78 | PrimitiveBaseShape newcube = PrimitiveBaseShape.CreateBox(); | 78 | PrimitiveBaseShape newcube = PrimitiveBaseShape.CreateBox(); |
79 | PhysicsVector position = new PhysicsVector(((int)Constants.RegionSize * 0.5f), ((int)Constants.RegionSize * 0.5f), 128); | 79 | Vector3 position = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 128f); |
80 | PhysicsVector size = new PhysicsVector(0.5f, 0.5f, 0.5f); | 80 | Vector3 size = new Vector3(0.5f, 0.5f, 0.5f); |
81 | Quaternion rot = Quaternion.Identity; | 81 | Quaternion rot = Quaternion.Identity; |
82 | PhysicsActor prim = ps.AddPrimShape("CoolShape", newcube, position, size, rot, true); | 82 | PhysicsActor prim = ps.AddPrimShape("CoolShape", newcube, position, size, rot, true); |
83 | OdePrim oprim = (OdePrim)prim; | 83 | OdePrim oprim = (OdePrim)prim; |
diff --git a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs index 135f49e..566b4e7 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSCharacter.cs | |||
@@ -36,20 +36,17 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
36 | { | 36 | { |
37 | public class POSCharacter : PhysicsActor | 37 | public class POSCharacter : PhysicsActor |
38 | { | 38 | { |
39 | private PhysicsVector _position; | 39 | private Vector3 _position; |
40 | public PhysicsVector _velocity; | 40 | public Vector3 _velocity; |
41 | public PhysicsVector _target_velocity = PhysicsVector.Zero; | 41 | public Vector3 _target_velocity = Vector3.Zero; |
42 | public PhysicsVector _size = PhysicsVector.Zero; | 42 | public Vector3 _size = Vector3.Zero; |
43 | private PhysicsVector _acceleration; | 43 | private Vector3 _acceleration; |
44 | private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; | 44 | private Vector3 m_rotationalVelocity = Vector3.Zero; |
45 | private bool flying; | 45 | private bool flying; |
46 | private bool isColliding; | 46 | private bool isColliding; |
47 | 47 | ||
48 | public POSCharacter() | 48 | public POSCharacter() |
49 | { | 49 | { |
50 | _velocity = new PhysicsVector(); | ||
51 | _position = new PhysicsVector(); | ||
52 | _acceleration = new PhysicsVector(); | ||
53 | } | 50 | } |
54 | 51 | ||
55 | public override int PhysicsActorType | 52 | public override int PhysicsActorType |
@@ -58,7 +55,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
58 | set { return; } | 55 | set { return; } |
59 | } | 56 | } |
60 | 57 | ||
61 | public override PhysicsVector RotationalVelocity | 58 | public override Vector3 RotationalVelocity |
62 | { | 59 | { |
63 | get { return m_rotationalVelocity; } | 60 | get { return m_rotationalVelocity; } |
64 | set { m_rotationalVelocity = value; } | 61 | set { m_rotationalVelocity = value; } |
@@ -137,13 +134,13 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
137 | get { return false; } | 134 | get { return false; } |
138 | } | 135 | } |
139 | 136 | ||
140 | public override PhysicsVector Position | 137 | public override Vector3 Position |
141 | { | 138 | { |
142 | get { return _position; } | 139 | get { return _position; } |
143 | set { _position = value; } | 140 | set { _position = value; } |
144 | } | 141 | } |
145 | 142 | ||
146 | public override PhysicsVector Size | 143 | public override Vector3 Size |
147 | { | 144 | { |
148 | get { return _size; } | 145 | get { return _size; } |
149 | set | 146 | set |
@@ -158,9 +155,9 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
158 | get { return 0f; } | 155 | get { return 0f; } |
159 | } | 156 | } |
160 | 157 | ||
161 | public override PhysicsVector Force | 158 | public override Vector3 Force |
162 | { | 159 | { |
163 | get { return PhysicsVector.Zero; } | 160 | get { return Vector3.Zero; } |
164 | set { return; } | 161 | set { return; } |
165 | } | 162 | } |
166 | 163 | ||
@@ -175,7 +172,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
175 | 172 | ||
176 | } | 173 | } |
177 | 174 | ||
178 | public override void VehicleVectorParam(int param, PhysicsVector value) | 175 | public override void VehicleVectorParam(int param, Vector3 value) |
179 | { | 176 | { |
180 | 177 | ||
181 | } | 178 | } |
@@ -190,14 +187,14 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
190 | 187 | ||
191 | } | 188 | } |
192 | 189 | ||
193 | public override PhysicsVector CenterOfMass | 190 | public override Vector3 CenterOfMass |
194 | { | 191 | { |
195 | get { return PhysicsVector.Zero; } | 192 | get { return Vector3.Zero; } |
196 | } | 193 | } |
197 | 194 | ||
198 | public override PhysicsVector GeometricCenter | 195 | public override Vector3 GeometricCenter |
199 | { | 196 | { |
200 | get { return PhysicsVector.Zero; } | 197 | get { return Vector3.Zero; } |
201 | } | 198 | } |
202 | 199 | ||
203 | public override PrimitiveBaseShape Shape | 200 | public override PrimitiveBaseShape Shape |
@@ -205,15 +202,15 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
205 | set { return; } | 202 | set { return; } |
206 | } | 203 | } |
207 | 204 | ||
208 | public override PhysicsVector Velocity | 205 | public override Vector3 Velocity |
209 | { | 206 | { |
210 | get { return _velocity; } | 207 | get { return _velocity; } |
211 | set { _target_velocity = value; } | 208 | set { _target_velocity = value; } |
212 | } | 209 | } |
213 | 210 | ||
214 | public override PhysicsVector Torque | 211 | public override Vector3 Torque |
215 | { | 212 | { |
216 | get { return PhysicsVector.Zero; } | 213 | get { return Vector3.Zero; } |
217 | set { return; } | 214 | set { return; } |
218 | } | 215 | } |
219 | 216 | ||
@@ -229,7 +226,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
229 | set { } | 226 | set { } |
230 | } | 227 | } |
231 | 228 | ||
232 | public override PhysicsVector Acceleration | 229 | public override Vector3 Acceleration |
233 | { | 230 | { |
234 | get { return _acceleration; } | 231 | get { return _acceleration; } |
235 | } | 232 | } |
@@ -248,24 +245,24 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
248 | { | 245 | { |
249 | } | 246 | } |
250 | 247 | ||
251 | public override void LockAngularMotion(PhysicsVector axis) | 248 | public override void LockAngularMotion(Vector3 axis) |
252 | { | 249 | { |
253 | } | 250 | } |
254 | 251 | ||
255 | public void SetAcceleration(PhysicsVector accel) | 252 | public void SetAcceleration(Vector3 accel) |
256 | { | 253 | { |
257 | _acceleration = accel; | 254 | _acceleration = accel; |
258 | } | 255 | } |
259 | 256 | ||
260 | public override void AddForce(PhysicsVector force, bool pushforce) | 257 | public override void AddForce(Vector3 force, bool pushforce) |
261 | { | 258 | { |
262 | } | 259 | } |
263 | 260 | ||
264 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 261 | public override void AddAngularForce(Vector3 force, bool pushforce) |
265 | { | 262 | { |
266 | } | 263 | } |
267 | 264 | ||
268 | public override void SetMomentum(PhysicsVector momentum) | 265 | public override void SetMomentum(Vector3 momentum) |
269 | { | 266 | { |
270 | } | 267 | } |
271 | 268 | ||
@@ -273,7 +270,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
273 | { | 270 | { |
274 | } | 271 | } |
275 | 272 | ||
276 | public override PhysicsVector PIDTarget | 273 | public override Vector3 PIDTarget |
277 | { | 274 | { |
278 | set { return; } | 275 | set { return; } |
279 | } | 276 | } |
diff --git a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs index 4521dce..847b634 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSPrim.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSPrim.cs | |||
@@ -36,19 +36,16 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
36 | { | 36 | { |
37 | public class POSPrim : PhysicsActor | 37 | public class POSPrim : PhysicsActor |
38 | { | 38 | { |
39 | private PhysicsVector _position; | 39 | private Vector3 _position; |
40 | private PhysicsVector _velocity; | 40 | private Vector3 _velocity; |
41 | private PhysicsVector _acceleration; | 41 | private Vector3 _acceleration; |
42 | private PhysicsVector _size; | 42 | private Vector3 _size; |
43 | private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; | 43 | private Vector3 m_rotationalVelocity = Vector3.Zero; |
44 | private Quaternion _orientation; | 44 | private Quaternion _orientation; |
45 | private bool iscolliding; | 45 | private bool iscolliding; |
46 | 46 | ||
47 | public POSPrim() | 47 | public POSPrim() |
48 | { | 48 | { |
49 | _velocity = new PhysicsVector(); | ||
50 | _position = new PhysicsVector(); | ||
51 | _acceleration = new PhysicsVector(); | ||
52 | } | 49 | } |
53 | 50 | ||
54 | public override int PhysicsActorType | 51 | public override int PhysicsActorType |
@@ -57,7 +54,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
57 | set { return; } | 54 | set { return; } |
58 | } | 55 | } |
59 | 56 | ||
60 | public override PhysicsVector RotationalVelocity | 57 | public override Vector3 RotationalVelocity |
61 | { | 58 | { |
62 | get { return m_rotationalVelocity; } | 59 | get { return m_rotationalVelocity; } |
63 | set { m_rotationalVelocity = value; } | 60 | set { m_rotationalVelocity = value; } |
@@ -98,13 +95,13 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
98 | get { return false; } | 95 | get { return false; } |
99 | } | 96 | } |
100 | 97 | ||
101 | public override PhysicsVector Position | 98 | public override Vector3 Position |
102 | { | 99 | { |
103 | get { return _position; } | 100 | get { return _position; } |
104 | set { _position = value; } | 101 | set { _position = value; } |
105 | } | 102 | } |
106 | 103 | ||
107 | public override PhysicsVector Size | 104 | public override Vector3 Size |
108 | { | 105 | { |
109 | get { return _size; } | 106 | get { return _size; } |
110 | set { _size = value; } | 107 | set { _size = value; } |
@@ -115,9 +112,9 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
115 | get { return 0f; } | 112 | get { return 0f; } |
116 | } | 113 | } |
117 | 114 | ||
118 | public override PhysicsVector Force | 115 | public override Vector3 Force |
119 | { | 116 | { |
120 | get { return PhysicsVector.Zero; } | 117 | get { return Vector3.Zero; } |
121 | set { return; } | 118 | set { return; } |
122 | } | 119 | } |
123 | 120 | ||
@@ -132,7 +129,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
132 | 129 | ||
133 | } | 130 | } |
134 | 131 | ||
135 | public override void VehicleVectorParam(int param, PhysicsVector value) | 132 | public override void VehicleVectorParam(int param, Vector3 value) |
136 | { | 133 | { |
137 | 134 | ||
138 | } | 135 | } |
@@ -147,14 +144,14 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
147 | 144 | ||
148 | } | 145 | } |
149 | 146 | ||
150 | public override PhysicsVector CenterOfMass | 147 | public override Vector3 CenterOfMass |
151 | { | 148 | { |
152 | get { return PhysicsVector.Zero; } | 149 | get { return Vector3.Zero; } |
153 | } | 150 | } |
154 | 151 | ||
155 | public override PhysicsVector GeometricCenter | 152 | public override Vector3 GeometricCenter |
156 | { | 153 | { |
157 | get { return PhysicsVector.Zero; } | 154 | get { return Vector3.Zero; } |
158 | } | 155 | } |
159 | 156 | ||
160 | public override PrimitiveBaseShape Shape | 157 | public override PrimitiveBaseShape Shape |
@@ -173,7 +170,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
173 | set { return; } | 170 | set { return; } |
174 | } | 171 | } |
175 | 172 | ||
176 | public override PhysicsVector Velocity | 173 | public override Vector3 Velocity |
177 | { | 174 | { |
178 | get { return _velocity; } | 175 | get { return _velocity; } |
179 | set { _velocity = value; } | 176 | set { _velocity = value; } |
@@ -191,7 +188,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
191 | set { _orientation = value; } | 188 | set { _orientation = value; } |
192 | } | 189 | } |
193 | 190 | ||
194 | public override PhysicsVector Acceleration | 191 | public override Vector3 Acceleration |
195 | { | 192 | { |
196 | get { return _acceleration; } | 193 | get { return _acceleration; } |
197 | } | 194 | } |
@@ -202,26 +199,26 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
202 | set { } | 199 | set { } |
203 | } | 200 | } |
204 | 201 | ||
205 | public void SetAcceleration(PhysicsVector accel) | 202 | public void SetAcceleration(Vector3 accel) |
206 | { | 203 | { |
207 | _acceleration = accel; | 204 | _acceleration = accel; |
208 | } | 205 | } |
209 | 206 | ||
210 | public override void AddForce(PhysicsVector force, bool pushforce) | 207 | public override void AddForce(Vector3 force, bool pushforce) |
211 | { | 208 | { |
212 | } | 209 | } |
213 | 210 | ||
214 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 211 | public override void AddAngularForce(Vector3 force, bool pushforce) |
215 | { | 212 | { |
216 | } | 213 | } |
217 | 214 | ||
218 | public override PhysicsVector Torque | 215 | public override Vector3 Torque |
219 | { | 216 | { |
220 | get { return PhysicsVector.Zero; } | 217 | get { return Vector3.Zero; } |
221 | set { return; } | 218 | set { return; } |
222 | } | 219 | } |
223 | 220 | ||
224 | public override void SetMomentum(PhysicsVector momentum) | 221 | public override void SetMomentum(Vector3 momentum) |
225 | { | 222 | { |
226 | } | 223 | } |
227 | 224 | ||
@@ -255,7 +252,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
255 | { | 252 | { |
256 | } | 253 | } |
257 | 254 | ||
258 | public override void LockAngularMotion(PhysicsVector axis) | 255 | public override void LockAngularMotion(Vector3 axis) |
259 | { | 256 | { |
260 | } | 257 | } |
261 | 258 | ||
@@ -268,7 +265,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
268 | { | 265 | { |
269 | } | 266 | } |
270 | 267 | ||
271 | public override PhysicsVector PIDTarget | 268 | public override Vector3 PIDTarget |
272 | { | 269 | { |
273 | set { return; } | 270 | set { return; } |
274 | } | 271 | } |
diff --git a/OpenSim/Region/Physics/POSPlugin/POSScene.cs b/OpenSim/Region/Physics/POSPlugin/POSScene.cs index fa8cc70..c3f5040 100644 --- a/OpenSim/Region/Physics/POSPlugin/POSScene.cs +++ b/OpenSim/Region/Physics/POSPlugin/POSScene.cs | |||
@@ -56,7 +56,7 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
56 | { | 56 | { |
57 | } | 57 | } |
58 | 58 | ||
59 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 59 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
60 | { | 60 | { |
61 | POSCharacter act = new POSCharacter(); | 61 | POSCharacter act = new POSCharacter(); |
62 | act.Position = position; | 62 | act.Position = position; |
@@ -84,20 +84,20 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
84 | } | 84 | } |
85 | 85 | ||
86 | /* | 86 | /* |
87 | public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) | 87 | public override PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation) |
88 | { | 88 | { |
89 | return null; | 89 | return null; |
90 | } | 90 | } |
91 | */ | 91 | */ |
92 | 92 | ||
93 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 93 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
94 | PhysicsVector size, Quaternion rotation) | 94 | Vector3 size, Quaternion rotation) |
95 | { | 95 | { |
96 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 96 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
97 | } | 97 | } |
98 | 98 | ||
99 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 99 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
100 | PhysicsVector size, Quaternion rotation, bool isPhysical) | 100 | Vector3 size, Quaternion rotation, bool isPhysical) |
101 | { | 101 | { |
102 | POSPrim prim = new POSPrim(); | 102 | POSPrim prim = new POSPrim(); |
103 | prim.Position = position; | 103 | prim.Position = position; |
@@ -152,23 +152,25 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
152 | character._target_velocity.Z += gravity * timeStep; | 152 | character._target_velocity.Z += gravity * timeStep; |
153 | } | 153 | } |
154 | 154 | ||
155 | character.Position.X += character._target_velocity.X * timeStep; | 155 | Vector3 characterPosition = character.Position; |
156 | character.Position.Y += character._target_velocity.Y * timeStep; | ||
157 | 156 | ||
158 | character.Position.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f); | 157 | characterPosition.X += character._target_velocity.X * timeStep; |
159 | character.Position.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f); | 158 | characterPosition.Y += character._target_velocity.Y * timeStep; |
159 | |||
160 | characterPosition.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f); | ||
161 | characterPosition.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f); | ||
160 | 162 | ||
161 | bool forcedZ = false; | 163 | bool forcedZ = false; |
162 | 164 | ||
163 | float terrainheight = _heightMap[(int)character.Position.Y * Constants.RegionSize + (int)character.Position.X]; | 165 | float terrainheight = _heightMap[(int)character.Position.Y * Constants.RegionSize + (int)character.Position.X]; |
164 | if (character.Position.Z + (character._target_velocity.Z * timeStep) < terrainheight + 2) | 166 | if (character.Position.Z + (character._target_velocity.Z * timeStep) < terrainheight + 2) |
165 | { | 167 | { |
166 | character.Position.Z = terrainheight + character.Size.Z; | 168 | characterPosition.Z = terrainheight + character.Size.Z; |
167 | forcedZ = true; | 169 | forcedZ = true; |
168 | } | 170 | } |
169 | else | 171 | else |
170 | { | 172 | { |
171 | character.Position.Z += character._target_velocity.Z*timeStep; | 173 | characterPosition.Z += character._target_velocity.Z*timeStep; |
172 | } | 174 | } |
173 | 175 | ||
174 | /// this is it -- the magic you've all been waiting for! Ladies and gentlemen -- | 176 | /// this is it -- the magic you've all been waiting for! Ladies and gentlemen -- |
@@ -177,29 +179,29 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
177 | 179 | ||
178 | if (isCollidingWithPrim(character)) | 180 | if (isCollidingWithPrim(character)) |
179 | { | 181 | { |
180 | character.Position.Z = oldposZ; // first try Z axis | 182 | characterPosition.Z = oldposZ; // first try Z axis |
181 | if (isCollidingWithPrim(character)) | 183 | if (isCollidingWithPrim(character)) |
182 | { | 184 | { |
183 | character.Position.Z = oldposZ + character.Size.Z / 4.4f; // try harder | 185 | characterPosition.Z = oldposZ + character.Size.Z / 4.4f; // try harder |
184 | if (isCollidingWithPrim(character)) | 186 | if (isCollidingWithPrim(character)) |
185 | { | 187 | { |
186 | character.Position.Z = oldposZ + character.Size.Z / 2.2f; // try very hard | 188 | characterPosition.Z = oldposZ + character.Size.Z / 2.2f; // try very hard |
187 | if (isCollidingWithPrim(character)) | 189 | if (isCollidingWithPrim(character)) |
188 | { | 190 | { |
189 | character.Position.X = oldposX; | 191 | characterPosition.X = oldposX; |
190 | character.Position.Y = oldposY; | 192 | characterPosition.Y = oldposY; |
191 | character.Position.Z = oldposZ; | 193 | characterPosition.Z = oldposZ; |
192 | 194 | ||
193 | character.Position.X += character._target_velocity.X * timeStep; | 195 | characterPosition.X += character._target_velocity.X * timeStep; |
194 | if (isCollidingWithPrim(character)) | 196 | if (isCollidingWithPrim(character)) |
195 | { | 197 | { |
196 | character.Position.X = oldposX; | 198 | characterPosition.X = oldposX; |
197 | } | 199 | } |
198 | 200 | ||
199 | character.Position.Y += character._target_velocity.Y * timeStep; | 201 | characterPosition.Y += character._target_velocity.Y * timeStep; |
200 | if (isCollidingWithPrim(character)) | 202 | if (isCollidingWithPrim(character)) |
201 | { | 203 | { |
202 | character.Position.Y = oldposY; | 204 | characterPosition.Y = oldposY; |
203 | } | 205 | } |
204 | } | 206 | } |
205 | else | 207 | else |
@@ -218,8 +220,10 @@ namespace OpenSim.Region.Physics.POSPlugin | |||
218 | } | 220 | } |
219 | } | 221 | } |
220 | 222 | ||
221 | character.Position.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f); | 223 | characterPosition.X = Util.Clamp(character.Position.X, 0.01f, Constants.RegionSize - 0.01f); |
222 | character.Position.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f); | 224 | characterPosition.Y = Util.Clamp(character.Position.Y, 0.01f, Constants.RegionSize - 0.01f); |
225 | |||
226 | character.Position = characterPosition; | ||
223 | 227 | ||
224 | character._velocity.X = (character.Position.X - oldposX)/timeStep; | 228 | character._velocity.X = (character.Position.X - oldposX)/timeStep; |
225 | character._velocity.Y = (character.Position.Y - oldposY)/timeStep; | 229 | character._velocity.Y = (character.Position.Y - oldposY)/timeStep; |
diff --git a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs index b3bf70b..24eb6b1 100644 --- a/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs +++ b/OpenSim/Region/Physics/PhysXPlugin/PhysXPlugin.cs | |||
@@ -34,6 +34,7 @@ using PhysXWrapper; | |||
34 | using Quaternion=OpenMetaverse.Quaternion; | 34 | using Quaternion=OpenMetaverse.Quaternion; |
35 | using System.Reflection; | 35 | using System.Reflection; |
36 | using log4net; | 36 | using log4net; |
37 | using OpenMetaverse; | ||
37 | 38 | ||
38 | namespace OpenSim.Region.Physics.PhysXPlugin | 39 | namespace OpenSim.Region.Physics.PhysXPlugin |
39 | { | 40 | { |
@@ -106,7 +107,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
106 | 107 | ||
107 | } | 108 | } |
108 | 109 | ||
109 | public override PhysicsActor AddAvatar(string avName, PhysicsVector position, PhysicsVector size, bool isFlying) | 110 | public override PhysicsActor AddAvatar(string avName, Vector3 position, Vector3 size, bool isFlying) |
110 | { | 111 | { |
111 | Vec3 pos = new Vec3(); | 112 | Vec3 pos = new Vec3(); |
112 | pos.X = position.X; | 113 | pos.X = position.X; |
@@ -127,7 +128,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
127 | { | 128 | { |
128 | } | 129 | } |
129 | 130 | ||
130 | private PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size, Quaternion rotation) | 131 | private PhysicsActor AddPrim(Vector3 position, Vector3 size, Quaternion rotation) |
131 | { | 132 | { |
132 | Vec3 pos = new Vec3(); | 133 | Vec3 pos = new Vec3(); |
133 | pos.X = position.X; | 134 | pos.X = position.X; |
@@ -142,14 +143,14 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
142 | return act; | 143 | return act; |
143 | } | 144 | } |
144 | 145 | ||
145 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 146 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
146 | PhysicsVector size, Quaternion rotation) //To be removed | 147 | Vector3 size, Quaternion rotation) //To be removed |
147 | { | 148 | { |
148 | return AddPrimShape(primName, pbs, position, size, rotation, false); | 149 | return AddPrimShape(primName, pbs, position, size, rotation, false); |
149 | } | 150 | } |
150 | 151 | ||
151 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, PhysicsVector position, | 152 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
152 | PhysicsVector size, Quaternion rotation, bool isPhysical) | 153 | Vector3 size, Quaternion rotation, bool isPhysical) |
153 | { | 154 | { |
154 | return AddPrim(position, size, rotation); | 155 | return AddPrim(position, size, rotation); |
155 | } | 156 | } |
@@ -219,10 +220,10 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
219 | 220 | ||
220 | public class PhysXCharacter : PhysicsActor | 221 | public class PhysXCharacter : PhysicsActor |
221 | { | 222 | { |
222 | private PhysicsVector _position; | 223 | private Vector3 _position; |
223 | private PhysicsVector _velocity; | 224 | private Vector3 _velocity; |
224 | private PhysicsVector m_rotationalVelocity = PhysicsVector.Zero; | 225 | private Vector3 m_rotationalVelocity = Vector3.Zero; |
225 | private PhysicsVector _acceleration; | 226 | private Vector3 _acceleration; |
226 | private NxCharacter _character; | 227 | private NxCharacter _character; |
227 | private bool flying; | 228 | private bool flying; |
228 | private bool iscolliding = false; | 229 | private bool iscolliding = false; |
@@ -230,9 +231,6 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
230 | 231 | ||
231 | public PhysXCharacter(NxCharacter character) | 232 | public PhysXCharacter(NxCharacter character) |
232 | { | 233 | { |
233 | _velocity = new PhysicsVector(); | ||
234 | _position = new PhysicsVector(); | ||
235 | _acceleration = new PhysicsVector(); | ||
236 | _character = character; | 234 | _character = character; |
237 | } | 235 | } |
238 | 236 | ||
@@ -310,7 +308,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
310 | set { return; } | 308 | set { return; } |
311 | } | 309 | } |
312 | 310 | ||
313 | public override PhysicsVector RotationalVelocity | 311 | public override Vector3 RotationalVelocity |
314 | { | 312 | { |
315 | get { return m_rotationalVelocity; } | 313 | get { return m_rotationalVelocity; } |
316 | set { m_rotationalVelocity = value; } | 314 | set { m_rotationalVelocity = value; } |
@@ -321,7 +319,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
321 | get { return false; } | 319 | get { return false; } |
322 | } | 320 | } |
323 | 321 | ||
324 | public override PhysicsVector Position | 322 | public override Vector3 Position |
325 | { | 323 | { |
326 | get { return _position; } | 324 | get { return _position; } |
327 | set | 325 | set |
@@ -335,9 +333,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
335 | } | 333 | } |
336 | } | 334 | } |
337 | 335 | ||
338 | public override PhysicsVector Size | 336 | public override Vector3 Size |
339 | { | 337 | { |
340 | get { return PhysicsVector.Zero; } | 338 | get { return Vector3.Zero; } |
341 | set { } | 339 | set { } |
342 | } | 340 | } |
343 | 341 | ||
@@ -346,9 +344,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
346 | get { return 0f; } | 344 | get { return 0f; } |
347 | } | 345 | } |
348 | 346 | ||
349 | public override PhysicsVector Force | 347 | public override Vector3 Force |
350 | { | 348 | { |
351 | get { return PhysicsVector.Zero; } | 349 | get { return Vector3.Zero; } |
352 | set { return; } | 350 | set { return; } |
353 | } | 351 | } |
354 | 352 | ||
@@ -363,7 +361,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
363 | 361 | ||
364 | } | 362 | } |
365 | 363 | ||
366 | public override void VehicleVectorParam(int param, PhysicsVector value) | 364 | public override void VehicleVectorParam(int param, Vector3 value) |
367 | { | 365 | { |
368 | 366 | ||
369 | } | 367 | } |
@@ -379,17 +377,17 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
379 | } | 377 | } |
380 | 378 | ||
381 | 379 | ||
382 | public override PhysicsVector CenterOfMass | 380 | public override Vector3 CenterOfMass |
383 | { | 381 | { |
384 | get { return PhysicsVector.Zero; } | 382 | get { return Vector3.Zero; } |
385 | } | 383 | } |
386 | 384 | ||
387 | public override PhysicsVector GeometricCenter | 385 | public override Vector3 GeometricCenter |
388 | { | 386 | { |
389 | get { return PhysicsVector.Zero; } | 387 | get { return Vector3.Zero; } |
390 | } | 388 | } |
391 | 389 | ||
392 | public override PhysicsVector Velocity | 390 | public override Vector3 Velocity |
393 | { | 391 | { |
394 | get { return _velocity; } | 392 | get { return _velocity; } |
395 | set { _velocity = value; } | 393 | set { _velocity = value; } |
@@ -413,25 +411,25 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
413 | set { } | 411 | set { } |
414 | } | 412 | } |
415 | 413 | ||
416 | public override PhysicsVector Acceleration | 414 | public override Vector3 Acceleration |
417 | { | 415 | { |
418 | get { return _acceleration; } | 416 | get { return _acceleration; } |
419 | } | 417 | } |
420 | 418 | ||
421 | public void SetAcceleration(PhysicsVector accel) | 419 | public void SetAcceleration(Vector3 accel) |
422 | { | 420 | { |
423 | _acceleration = accel; | 421 | _acceleration = accel; |
424 | } | 422 | } |
425 | 423 | ||
426 | public override void AddForce(PhysicsVector force, bool pushforce) | 424 | public override void AddForce(Vector3 force, bool pushforce) |
427 | { | 425 | { |
428 | } | 426 | } |
429 | public override PhysicsVector Torque | 427 | public override Vector3 Torque |
430 | { | 428 | { |
431 | get { return PhysicsVector.Zero; } | 429 | get { return Vector3.Zero; } |
432 | set { return; } | 430 | set { return; } |
433 | } | 431 | } |
434 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 432 | public override void AddAngularForce(Vector3 force, bool pushforce) |
435 | { | 433 | { |
436 | } | 434 | } |
437 | 435 | ||
@@ -445,12 +443,12 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
445 | 443 | ||
446 | } | 444 | } |
447 | 445 | ||
448 | public override void LockAngularMotion(PhysicsVector axis) | 446 | public override void LockAngularMotion(Vector3 axis) |
449 | { | 447 | { |
450 | 448 | ||
451 | } | 449 | } |
452 | 450 | ||
453 | public override void SetMomentum(PhysicsVector momentum) | 451 | public override void SetMomentum(Vector3 momentum) |
454 | { | 452 | { |
455 | } | 453 | } |
456 | 454 | ||
@@ -492,7 +490,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
492 | 490 | ||
493 | } | 491 | } |
494 | 492 | ||
495 | public override PhysicsVector PIDTarget { set { return; } } | 493 | public override Vector3 PIDTarget { set { return; } } |
496 | public override bool PIDActive { set { return; } } | 494 | public override bool PIDActive { set { return; } } |
497 | public override float PIDTau { set { return; } } | 495 | public override float PIDTau { set { return; } } |
498 | 496 | ||
@@ -540,15 +538,15 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
540 | 538 | ||
541 | public class PhysXPrim : PhysicsActor | 539 | public class PhysXPrim : PhysicsActor |
542 | { | 540 | { |
543 | private PhysicsVector _velocity; | 541 | private Vector3 _velocity; |
544 | private PhysicsVector _acceleration; | 542 | private Vector3 _acceleration; |
545 | private PhysicsVector m_rotationalVelocity; | 543 | private Vector3 m_rotationalVelocity; |
546 | private NxActor _prim; | 544 | private NxActor _prim; |
547 | 545 | ||
548 | public PhysXPrim(NxActor prim) | 546 | public PhysXPrim(NxActor prim) |
549 | { | 547 | { |
550 | _velocity = new PhysicsVector(); | 548 | _velocity = Vector3.Zero; |
551 | _acceleration = new PhysicsVector(); | 549 | _acceleration = Vector3.Zero; |
552 | _prim = prim; | 550 | _prim = prim; |
553 | } | 551 | } |
554 | 552 | ||
@@ -602,7 +600,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
602 | set { return; } | 600 | set { return; } |
603 | } | 601 | } |
604 | 602 | ||
605 | public override PhysicsVector RotationalVelocity | 603 | public override Vector3 RotationalVelocity |
606 | { | 604 | { |
607 | get { return m_rotationalVelocity; } | 605 | get { return m_rotationalVelocity; } |
608 | set { m_rotationalVelocity = value; } | 606 | set { m_rotationalVelocity = value; } |
@@ -638,11 +636,11 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
638 | get { return false; } | 636 | get { return false; } |
639 | } | 637 | } |
640 | 638 | ||
641 | public override PhysicsVector Position | 639 | public override Vector3 Position |
642 | { | 640 | { |
643 | get | 641 | get |
644 | { | 642 | { |
645 | PhysicsVector pos = new PhysicsVector(); | 643 | Vector3 pos = Vector3.Zero; |
646 | Vec3 vec = _prim.Position; | 644 | Vec3 vec = _prim.Position; |
647 | pos.X = vec.X; | 645 | pos.X = vec.X; |
648 | pos.Y = vec.Y; | 646 | pos.Y = vec.Y; |
@@ -651,7 +649,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
651 | } | 649 | } |
652 | set | 650 | set |
653 | { | 651 | { |
654 | PhysicsVector vec = value; | 652 | Vector3 vec = value; |
655 | Vec3 pos = new Vec3(); | 653 | Vec3 pos = new Vec3(); |
656 | pos.X = vec.X; | 654 | pos.X = vec.X; |
657 | pos.Y = vec.Y; | 655 | pos.Y = vec.Y; |
@@ -665,15 +663,15 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
665 | set { return; } | 663 | set { return; } |
666 | } | 664 | } |
667 | 665 | ||
668 | public override PhysicsVector Velocity | 666 | public override Vector3 Velocity |
669 | { | 667 | { |
670 | get { return _velocity; } | 668 | get { return _velocity; } |
671 | set { _velocity = value; } | 669 | set { _velocity = value; } |
672 | } | 670 | } |
673 | 671 | ||
674 | public override PhysicsVector Torque | 672 | public override Vector3 Torque |
675 | { | 673 | { |
676 | get { return PhysicsVector.Zero; } | 674 | get { return Vector3.Zero; } |
677 | set { return; } | 675 | set { return; } |
678 | } | 676 | } |
679 | 677 | ||
@@ -704,31 +702,31 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
704 | set { } | 702 | set { } |
705 | } | 703 | } |
706 | 704 | ||
707 | public override PhysicsVector Acceleration | 705 | public override Vector3 Acceleration |
708 | { | 706 | { |
709 | get { return _acceleration; } | 707 | get { return _acceleration; } |
710 | } | 708 | } |
711 | 709 | ||
712 | public void SetAcceleration(PhysicsVector accel) | 710 | public void SetAcceleration(Vector3 accel) |
713 | { | 711 | { |
714 | _acceleration = accel; | 712 | _acceleration = accel; |
715 | } | 713 | } |
716 | 714 | ||
717 | public override void AddForce(PhysicsVector force, bool pushforce) | 715 | public override void AddForce(Vector3 force, bool pushforce) |
718 | { | 716 | { |
719 | } | 717 | } |
720 | 718 | ||
721 | public override void AddAngularForce(PhysicsVector force, bool pushforce) | 719 | public override void AddAngularForce(Vector3 force, bool pushforce) |
722 | { | 720 | { |
723 | } | 721 | } |
724 | 722 | ||
725 | public override void SetMomentum(PhysicsVector momentum) | 723 | public override void SetMomentum(Vector3 momentum) |
726 | { | 724 | { |
727 | } | 725 | } |
728 | 726 | ||
729 | public override PhysicsVector Size | 727 | public override Vector3 Size |
730 | { | 728 | { |
731 | get { return PhysicsVector.Zero; } | 729 | get { return Vector3.Zero; } |
732 | set { } | 730 | set { } |
733 | } | 731 | } |
734 | 732 | ||
@@ -740,7 +738,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
740 | { | 738 | { |
741 | } | 739 | } |
742 | 740 | ||
743 | public override void LockAngularMotion(PhysicsVector axis) | 741 | public override void LockAngularMotion(Vector3 axis) |
744 | { | 742 | { |
745 | 743 | ||
746 | } | 744 | } |
@@ -750,9 +748,9 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
750 | get { return 0f; } | 748 | get { return 0f; } |
751 | } | 749 | } |
752 | 750 | ||
753 | public override PhysicsVector Force | 751 | public override Vector3 Force |
754 | { | 752 | { |
755 | get { return PhysicsVector.Zero; } | 753 | get { return Vector3.Zero; } |
756 | set { return; } | 754 | set { return; } |
757 | } | 755 | } |
758 | 756 | ||
@@ -767,7 +765,7 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
767 | 765 | ||
768 | } | 766 | } |
769 | 767 | ||
770 | public override void VehicleVectorParam(int param, PhysicsVector value) | 768 | public override void VehicleVectorParam(int param, Vector3 value) |
771 | { | 769 | { |
772 | 770 | ||
773 | } | 771 | } |
@@ -782,21 +780,21 @@ namespace OpenSim.Region.Physics.PhysXPlugin | |||
782 | 780 | ||
783 | } | 781 | } |
784 | 782 | ||
785 | public override PhysicsVector CenterOfMass | 783 | public override Vector3 CenterOfMass |
786 | { | 784 | { |
787 | get { return PhysicsVector.Zero; } | 785 | get { return Vector3.Zero; } |
788 | } | 786 | } |
789 | 787 | ||
790 | public override PhysicsVector GeometricCenter | 788 | public override Vector3 GeometricCenter |
791 | { | 789 | { |
792 | get { return PhysicsVector.Zero; } | 790 | get { return Vector3.Zero; } |
793 | } | 791 | } |
794 | 792 | ||
795 | public override void CrossingFailure() | 793 | public override void CrossingFailure() |
796 | { | 794 | { |
797 | } | 795 | } |
798 | 796 | ||
799 | public override PhysicsVector PIDTarget { set { return; } } | 797 | public override Vector3 PIDTarget { set { return; } } |
800 | public override bool PIDActive { set { return; } } | 798 | public override bool PIDActive { set { return; } } |
801 | public override float PIDTau { set { return; } } | 799 | public override float PIDTau { set { return; } } |
802 | 800 | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs deleted file mode 100644 index 7116512..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs +++ /dev/null | |||
@@ -1,234 +0,0 @@ | |||
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.Generic; | ||
31 | using System.Reflection; | ||
32 | using System.Security; | ||
33 | using System.Security.Policy; | ||
34 | using System.Security.Permissions; | ||
35 | using OpenSim.Region.ScriptEngine.Interfaces; | ||
36 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||
37 | using log4net; | ||
38 | |||
39 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
40 | { | ||
41 | public class AppDomainManager | ||
42 | { | ||
43 | // | ||
44 | // This class does AppDomain handling and loading/unloading of | ||
45 | // scripts in it. It is instanced in "ScriptEngine" and controlled | ||
46 | // from "ScriptManager" | ||
47 | // | ||
48 | // 1. Create a new AppDomain if old one is full (or doesn't exist) | ||
49 | // 2. Load scripts into AppDomain | ||
50 | // 3. Unload scripts from AppDomain (stopping them and marking | ||
51 | // them as inactive) | ||
52 | // 4. Unload AppDomain completely when all scripts in it has stopped | ||
53 | // | ||
54 | |||
55 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
56 | |||
57 | private int maxScriptsPerAppDomain = 1; | ||
58 | |||
59 | // Internal list of all AppDomains | ||
60 | private List<AppDomainStructure> appDomains = | ||
61 | new List<AppDomainStructure>(); | ||
62 | |||
63 | // Structure to keep track of data around AppDomain | ||
64 | private class AppDomainStructure | ||
65 | { | ||
66 | // The AppDomain itself | ||
67 | public AppDomain CurrentAppDomain; | ||
68 | |||
69 | // Number of scripts loaded into AppDomain | ||
70 | public int ScriptsLoaded; | ||
71 | |||
72 | // Number of dead scripts | ||
73 | public int ScriptsWaitingUnload; | ||
74 | } | ||
75 | |||
76 | // Current AppDomain | ||
77 | private AppDomainStructure currentAD; | ||
78 | |||
79 | private object getLock = new object(); // Mutex | ||
80 | private object freeLock = new object(); // Mutex | ||
81 | |||
82 | private ScriptEngine m_scriptEngine; | ||
83 | //public AppDomainManager(ScriptEngine scriptEngine) | ||
84 | public AppDomainManager(ScriptEngine scriptEngine) | ||
85 | { | ||
86 | m_scriptEngine = scriptEngine; | ||
87 | ReadConfig(); | ||
88 | } | ||
89 | |||
90 | public void ReadConfig() | ||
91 | { | ||
92 | maxScriptsPerAppDomain = m_scriptEngine.ScriptConfigSource.GetInt( | ||
93 | "ScriptsPerAppDomain", 1); | ||
94 | } | ||
95 | |||
96 | // Find a free AppDomain, creating one if necessary | ||
97 | private AppDomainStructure GetFreeAppDomain() | ||
98 | { | ||
99 | lock (getLock) | ||
100 | { | ||
101 | // Current full? | ||
102 | if (currentAD != null && | ||
103 | currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) | ||
104 | { | ||
105 | // Add it to AppDomains list and empty current | ||
106 | appDomains.Add(currentAD); | ||
107 | currentAD = null; | ||
108 | } | ||
109 | // No current | ||
110 | if (currentAD == null) | ||
111 | { | ||
112 | // Create a new current AppDomain | ||
113 | currentAD = new AppDomainStructure(); | ||
114 | currentAD.CurrentAppDomain = PrepareNewAppDomain(); | ||
115 | } | ||
116 | |||
117 | return currentAD; | ||
118 | } | ||
119 | } | ||
120 | |||
121 | private int AppDomainNameCount; | ||
122 | |||
123 | // Create and prepare a new AppDomain for scripts | ||
124 | private AppDomain PrepareNewAppDomain() | ||
125 | { | ||
126 | // Create and prepare a new AppDomain | ||
127 | AppDomainNameCount++; | ||
128 | |||
129 | // TODO: Currently security match current appdomain | ||
130 | |||
131 | // Construct and initialize settings for a second AppDomain. | ||
132 | AppDomainSetup ads = new AppDomainSetup(); | ||
133 | ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; | ||
134 | ads.DisallowBindingRedirects = true; | ||
135 | ads.DisallowCodeDownload = true; | ||
136 | ads.LoaderOptimization = LoaderOptimization.MultiDomainHost; | ||
137 | ads.ShadowCopyFiles = "false"; // Disable shadowing | ||
138 | ads.ConfigurationFile = | ||
139 | AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; | ||
140 | |||
141 | AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + | ||
142 | AppDomainNameCount, null, ads); | ||
143 | |||
144 | m_log.Info("[" + m_scriptEngine.ScriptEngineName + | ||
145 | "]: AppDomain Loading: " + | ||
146 | AssemblyName.GetAssemblyName( | ||
147 | "OpenSim.Region.ScriptEngine.Shared.dll").ToString()); | ||
148 | AD.Load(AssemblyName.GetAssemblyName( | ||
149 | "OpenSim.Region.ScriptEngine.Shared.dll")); | ||
150 | |||
151 | // Return the new AppDomain | ||
152 | return AD; | ||
153 | } | ||
154 | |||
155 | // Unload appdomains that are full and have only dead scripts | ||
156 | private void UnloadAppDomains() | ||
157 | { | ||
158 | lock (freeLock) | ||
159 | { | ||
160 | // Go through all | ||
161 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||
162 | { | ||
163 | // Don't process current AppDomain | ||
164 | if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) | ||
165 | { | ||
166 | // Not current AppDomain | ||
167 | // Is number of unloaded bigger or equal to number of loaded? | ||
168 | if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) | ||
169 | { | ||
170 | // Remove from internal list | ||
171 | appDomains.Remove(ads); | ||
172 | |||
173 | // Unload | ||
174 | AppDomain.Unload(ads.CurrentAppDomain); | ||
175 | } | ||
176 | } | ||
177 | } | ||
178 | } | ||
179 | } | ||
180 | |||
181 | public IScript LoadScript(string FileName, out AppDomain ad) | ||
182 | { | ||
183 | // Find next available AppDomain to put it in | ||
184 | AppDomainStructure FreeAppDomain = GetFreeAppDomain(); | ||
185 | |||
186 | IScript mbrt = (IScript) | ||
187 | FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap( | ||
188 | FileName, "SecondLife.Script"); | ||
189 | |||
190 | FreeAppDomain.ScriptsLoaded++; | ||
191 | ad = FreeAppDomain.CurrentAppDomain; | ||
192 | |||
193 | return mbrt; | ||
194 | } | ||
195 | |||
196 | |||
197 | // Increase "dead script" counter for an AppDomain | ||
198 | public void StopScript(AppDomain ad) | ||
199 | { | ||
200 | lock (freeLock) | ||
201 | { | ||
202 | // Check if it is current AppDomain | ||
203 | if (currentAD.CurrentAppDomain == ad) | ||
204 | { | ||
205 | // Yes - increase | ||
206 | currentAD.ScriptsWaitingUnload++; | ||
207 | return; | ||
208 | } | ||
209 | |||
210 | // Lopp through all AppDomains | ||
211 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||
212 | { | ||
213 | if (ads.CurrentAppDomain == ad) | ||
214 | { | ||
215 | // Found it | ||
216 | ads.ScriptsWaitingUnload++; | ||
217 | break; | ||
218 | } | ||
219 | } | ||
220 | } | ||
221 | |||
222 | UnloadAppDomains(); // Outsite lock, has its own GetLock | ||
223 | } | ||
224 | |||
225 | // If set to true then threads and stuff should try | ||
226 | // to make a graceful exit | ||
227 | public bool PleaseShutdown | ||
228 | { | ||
229 | get { return _PleaseShutdown; } | ||
230 | set { _PleaseShutdown = value; } | ||
231 | } | ||
232 | private bool _PleaseShutdown = false; | ||
233 | } | ||
234 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Common.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Common.cs deleted file mode 100644 index 1cd60e3..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Common.cs +++ /dev/null | |||
@@ -1,51 +0,0 @@ | |||
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.Reflection; | ||
29 | using log4net; | ||
30 | |||
31 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
32 | { | ||
33 | public static class Common | ||
34 | { | ||
35 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
36 | |||
37 | public static ScriptEngine mySE; | ||
38 | |||
39 | // This class just contains some static log stuff used for debugging. | ||
40 | |||
41 | public static void SendToDebug(string message) | ||
42 | { | ||
43 | m_log.Info("[" + mySE.ScriptEngineName + "]: Debug: " + message); | ||
44 | } | ||
45 | |||
46 | public static void SendToLog(string message) | ||
47 | { | ||
48 | m_log.Info("[" + mySE.ScriptEngineName + "]: LOG: " + message); | ||
49 | } | ||
50 | } | ||
51 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs deleted file mode 100644 index 4e13fb3..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs +++ /dev/null | |||
@@ -1,544 +0,0 @@ | |||
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.Generic; | ||
30 | using System.Reflection; | ||
31 | using OpenMetaverse; | ||
32 | using OpenSim.Framework; | ||
33 | using OpenSim.Region.CoreModules; | ||
34 | using OpenSim.Region; | ||
35 | using OpenSim.Region.Framework.Scenes; | ||
36 | using OpenSim.Region.Framework.Interfaces; | ||
37 | using OpenSim.Region.ScriptEngine.Shared; | ||
38 | using log4net; | ||
39 | |||
40 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
41 | { | ||
42 | /// <summary> | ||
43 | /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. | ||
44 | /// </summary> | ||
45 | [Serializable] | ||
46 | public class EventManager | ||
47 | { | ||
48 | // | ||
49 | // Class is instanced in "ScriptEngine" and Uses "EventQueueManager" | ||
50 | // that is also instanced in "ScriptEngine". | ||
51 | // This class needs a bit of explaining: | ||
52 | // | ||
53 | // This class it the link between an event inside OpenSim and | ||
54 | // the corresponding event in a user script being executed. | ||
55 | // | ||
56 | // For example when an user touches an object then the | ||
57 | // "myScriptEngine.World.EventManager.OnObjectGrab" event is fired | ||
58 | // inside OpenSim. | ||
59 | // We hook up to this event and queue a touch_start in | ||
60 | // EventQueueManager with the proper LSL parameters. | ||
61 | // It will then be delivered to the script by EventQueueManager. | ||
62 | // | ||
63 | // You can check debug C# dump of an LSL script if you need to | ||
64 | // verify what exact parameters are needed. | ||
65 | // | ||
66 | |||
67 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
68 | |||
69 | private ScriptEngine myScriptEngine; | ||
70 | |||
71 | public EventManager(ScriptEngine _ScriptEngine, bool performHookUp) | ||
72 | { | ||
73 | myScriptEngine = _ScriptEngine; | ||
74 | ReadConfig(); | ||
75 | |||
76 | if (performHookUp) | ||
77 | { | ||
78 | myScriptEngine.World.EventManager.OnRezScript += OnRezScript; | ||
79 | } | ||
80 | } | ||
81 | |||
82 | public void HookUpEvents() | ||
83 | { | ||
84 | m_log.Info("[" + myScriptEngine.ScriptEngineName + | ||
85 | "]: Hooking up to server events"); | ||
86 | |||
87 | myScriptEngine.World.EventManager.OnObjectGrab += | ||
88 | touch_start; | ||
89 | myScriptEngine.World.EventManager.OnObjectDeGrab += | ||
90 | touch_end; | ||
91 | myScriptEngine.World.EventManager.OnRemoveScript += | ||
92 | OnRemoveScript; | ||
93 | myScriptEngine.World.EventManager.OnScriptChangedEvent += | ||
94 | changed; | ||
95 | myScriptEngine.World.EventManager.OnScriptAtTargetEvent += | ||
96 | at_target; | ||
97 | myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += | ||
98 | not_at_target; | ||
99 | myScriptEngine.World.EventManager.OnScriptControlEvent += | ||
100 | control; | ||
101 | myScriptEngine.World.EventManager.OnScriptColliderStart += | ||
102 | collision_start; | ||
103 | myScriptEngine.World.EventManager.OnScriptColliding += | ||
104 | collision; | ||
105 | myScriptEngine.World.EventManager.OnScriptCollidingEnd += | ||
106 | collision_end; | ||
107 | |||
108 | IMoneyModule money = | ||
109 | myScriptEngine.World.RequestModuleInterface<IMoneyModule>(); | ||
110 | if (money != null) | ||
111 | money.OnObjectPaid+=HandleObjectPaid; | ||
112 | } | ||
113 | |||
114 | public void ReadConfig() | ||
115 | { | ||
116 | } | ||
117 | |||
118 | private void HandleObjectPaid(UUID objectID, UUID agentID, int amount) | ||
119 | { | ||
120 | SceneObjectPart part = | ||
121 | myScriptEngine.World.GetSceneObjectPart(objectID); | ||
122 | |||
123 | if (part != null) | ||
124 | { | ||
125 | money(part.LocalId, agentID, amount); | ||
126 | } | ||
127 | } | ||
128 | |||
129 | public void changed(uint localID, uint change) | ||
130 | { | ||
131 | // Add to queue for all scripts in localID, Object pass change. | ||
132 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
133 | "changed",new object[] { new LSL_Types.LSLInteger(change) }, | ||
134 | new DetectParams[0])); | ||
135 | } | ||
136 | |||
137 | public void state_entry(uint localID) | ||
138 | { | ||
139 | // Add to queue for all scripts in ObjectID object | ||
140 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
141 | "state_entry",new object[] { }, | ||
142 | new DetectParams[0])); | ||
143 | } | ||
144 | |||
145 | public void touch_start(uint localID, uint originalID, | ||
146 | Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs) | ||
147 | { | ||
148 | // Add to queue for all scripts in ObjectID object | ||
149 | DetectParams[] det = new DetectParams[1]; | ||
150 | det[0] = new DetectParams(); | ||
151 | det[0].Key = remoteClient.AgentId; | ||
152 | det[0].Populate(myScriptEngine.World); | ||
153 | |||
154 | if (originalID == 0) | ||
155 | { | ||
156 | SceneObjectPart part = | ||
157 | myScriptEngine.World.GetSceneObjectPart(localID); | ||
158 | |||
159 | if (part == null) | ||
160 | return; | ||
161 | |||
162 | det[0].LinkNum = part.LinkNum; | ||
163 | } | ||
164 | else | ||
165 | { | ||
166 | SceneObjectPart originalPart = | ||
167 | myScriptEngine.World.GetSceneObjectPart(originalID); | ||
168 | det[0].LinkNum = originalPart.LinkNum; | ||
169 | } | ||
170 | if (surfaceArgs != null) | ||
171 | { | ||
172 | det[0].SurfaceTouchArgs = surfaceArgs; | ||
173 | } | ||
174 | |||
175 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
176 | "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
177 | det)); | ||
178 | } | ||
179 | |||
180 | public void touch(uint localID, uint originalID, Vector3 offsetPos, | ||
181 | IClientAPI remoteClient) | ||
182 | { | ||
183 | // Add to queue for all scripts in ObjectID object | ||
184 | DetectParams[] det = new DetectParams[1]; | ||
185 | det[0] = new DetectParams(); | ||
186 | det[0].Key = remoteClient.AgentId; | ||
187 | det[0].Populate(myScriptEngine.World); | ||
188 | det[0].OffsetPos = new LSL_Types.Vector3(offsetPos.X, | ||
189 | offsetPos.Y, | ||
190 | offsetPos.Z); | ||
191 | |||
192 | if (originalID == 0) | ||
193 | { | ||
194 | SceneObjectPart part = myScriptEngine.World.GetSceneObjectPart(localID); | ||
195 | if (part == null) | ||
196 | return; | ||
197 | |||
198 | det[0].LinkNum = part.LinkNum; | ||
199 | } | ||
200 | else | ||
201 | { | ||
202 | SceneObjectPart originalPart = myScriptEngine.World.GetSceneObjectPart(originalID); | ||
203 | det[0].LinkNum = originalPart.LinkNum; | ||
204 | } | ||
205 | |||
206 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
207 | "touch", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
208 | det)); | ||
209 | } | ||
210 | |||
211 | public void touch_end(uint localID, uint originalID, IClientAPI remoteClient, | ||
212 | SurfaceTouchEventArgs surfaceArgs) | ||
213 | { | ||
214 | // Add to queue for all scripts in ObjectID object | ||
215 | DetectParams[] det = new DetectParams[1]; | ||
216 | det[0] = new DetectParams(); | ||
217 | det[0].Key = remoteClient.AgentId; | ||
218 | det[0].Populate(myScriptEngine.World); | ||
219 | |||
220 | if (originalID == 0) | ||
221 | { | ||
222 | SceneObjectPart part = | ||
223 | myScriptEngine.World.GetSceneObjectPart(localID); | ||
224 | if (part == null) | ||
225 | return; | ||
226 | |||
227 | det[0].LinkNum = part.LinkNum; | ||
228 | } | ||
229 | else | ||
230 | { | ||
231 | SceneObjectPart originalPart = | ||
232 | myScriptEngine.World.GetSceneObjectPart(originalID); | ||
233 | det[0].LinkNum = originalPart.LinkNum; | ||
234 | } | ||
235 | |||
236 | if (surfaceArgs != null) | ||
237 | { | ||
238 | det[0].SurfaceTouchArgs = surfaceArgs; | ||
239 | } | ||
240 | |||
241 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
242 | "touch_end", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
243 | det)); | ||
244 | } | ||
245 | |||
246 | public void OnRezScript(uint localID, UUID itemID, string script, | ||
247 | int startParam, bool postOnRez, string engine, int stateSource) | ||
248 | { | ||
249 | if (script.StartsWith("//MRM:")) | ||
250 | return; | ||
251 | |||
252 | List<IScriptModule> engines = | ||
253 | new List<IScriptModule>( | ||
254 | myScriptEngine.World.RequestModuleInterfaces<IScriptModule>()); | ||
255 | |||
256 | List<string> names = new List<string>(); | ||
257 | foreach (IScriptModule m in engines) | ||
258 | names.Add(m.ScriptEngineName); | ||
259 | |||
260 | int lineEnd = script.IndexOf('\n'); | ||
261 | |||
262 | if (lineEnd > 1) | ||
263 | { | ||
264 | string firstline = script.Substring(0, lineEnd).Trim(); | ||
265 | |||
266 | int colon = firstline.IndexOf(':'); | ||
267 | if (firstline.Length > 2 && | ||
268 | firstline.Substring(0, 2) == "//" && colon != -1) | ||
269 | { | ||
270 | string engineName = firstline.Substring(2, colon-2); | ||
271 | |||
272 | if (names.Contains(engineName)) | ||
273 | { | ||
274 | engine = engineName; | ||
275 | script = "//" + script.Substring(script.IndexOf(':')+1); | ||
276 | } | ||
277 | else | ||
278 | { | ||
279 | if (engine == myScriptEngine.ScriptEngineName) | ||
280 | { | ||
281 | SceneObjectPart part = | ||
282 | myScriptEngine.World.GetSceneObjectPart( | ||
283 | localID); | ||
284 | |||
285 | TaskInventoryItem item = | ||
286 | part.Inventory.GetInventoryItem(itemID); | ||
287 | |||
288 | ScenePresence presence = | ||
289 | myScriptEngine.World.GetScenePresence( | ||
290 | item.OwnerID); | ||
291 | |||
292 | if (presence != null) | ||
293 | { | ||
294 | presence.ControllingClient.SendAgentAlertMessage( | ||
295 | "Selected engine unavailable. "+ | ||
296 | "Running script on "+ | ||
297 | myScriptEngine.ScriptEngineName, | ||
298 | false); | ||
299 | } | ||
300 | } | ||
301 | } | ||
302 | } | ||
303 | } | ||
304 | |||
305 | if (engine != myScriptEngine.ScriptEngineName) | ||
306 | return; | ||
307 | |||
308 | // m_log.Debug("OnRezScript localID: " + localID + | ||
309 | // " LLUID: " + itemID.ToString() + " Size: " + | ||
310 | // script.Length); | ||
311 | |||
312 | myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script, | ||
313 | startParam, postOnRez); | ||
314 | } | ||
315 | |||
316 | public void OnRemoveScript(uint localID, UUID itemID) | ||
317 | { | ||
318 | // m_log.Debug("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); | ||
319 | myScriptEngine.m_ScriptManager.StopScript( | ||
320 | localID, | ||
321 | itemID | ||
322 | ); | ||
323 | } | ||
324 | |||
325 | public void money(uint localID, UUID agentID, int amount) | ||
326 | { | ||
327 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
328 | "money", new object[] { | ||
329 | new LSL_Types.LSLString(agentID.ToString()), | ||
330 | new LSL_Types.LSLInteger(amount) }, | ||
331 | new DetectParams[0])); | ||
332 | } | ||
333 | |||
334 | // TODO: Replace placeholders below | ||
335 | // NOTE! THE PARAMETERS FOR THESE FUNCTIONS ARE NOT CORRECT! | ||
336 | // These needs to be hooked up to OpenSim during init of this class | ||
337 | // then queued in EventQueueManager. | ||
338 | // When queued in EventQueueManager they need to be LSL compatible (name and params) | ||
339 | |||
340 | public void state_exit(uint localID) | ||
341 | { | ||
342 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
343 | "state_exit", new object[] { }, | ||
344 | new DetectParams[0])); | ||
345 | } | ||
346 | |||
347 | public void collision_start(uint localID, ColliderArgs col) | ||
348 | { | ||
349 | // Add to queue for all scripts in ObjectID object | ||
350 | List<DetectParams> det = new List<DetectParams>(); | ||
351 | |||
352 | foreach (DetectedObject detobj in col.Colliders) | ||
353 | { | ||
354 | DetectParams d = new DetectParams(); | ||
355 | d.Key =detobj.keyUUID; | ||
356 | d.Populate(myScriptEngine.World); | ||
357 | det.Add(d); | ||
358 | } | ||
359 | |||
360 | if (det.Count > 0) | ||
361 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
362 | "collision_start", | ||
363 | new Object[] { new LSL_Types.LSLInteger(det.Count) }, | ||
364 | det.ToArray())); | ||
365 | } | ||
366 | |||
367 | public void collision(uint localID, ColliderArgs col) | ||
368 | { | ||
369 | // Add to queue for all scripts in ObjectID object | ||
370 | List<DetectParams> det = new List<DetectParams>(); | ||
371 | |||
372 | foreach (DetectedObject detobj in col.Colliders) | ||
373 | { | ||
374 | DetectParams d = new DetectParams(); | ||
375 | d.Key =detobj.keyUUID; | ||
376 | d.Populate(myScriptEngine.World); | ||
377 | det.Add(d); | ||
378 | } | ||
379 | |||
380 | if (det.Count > 0) | ||
381 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
382 | "collision", new Object[] { new LSL_Types.LSLInteger(det.Count) }, | ||
383 | det.ToArray())); | ||
384 | } | ||
385 | |||
386 | public void collision_end(uint localID, ColliderArgs col) | ||
387 | { | ||
388 | // Add to queue for all scripts in ObjectID object | ||
389 | List<DetectParams> det = new List<DetectParams>(); | ||
390 | |||
391 | foreach (DetectedObject detobj in col.Colliders) | ||
392 | { | ||
393 | DetectParams d = new DetectParams(); | ||
394 | d.Key =detobj.keyUUID; | ||
395 | d.Populate(myScriptEngine.World); | ||
396 | det.Add(d); | ||
397 | } | ||
398 | |||
399 | if (det.Count > 0) | ||
400 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
401 | "collision_end", | ||
402 | new Object[] { new LSL_Types.LSLInteger(det.Count) }, | ||
403 | det.ToArray())); | ||
404 | } | ||
405 | |||
406 | public void land_collision_start(uint localID, UUID itemID) | ||
407 | { | ||
408 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
409 | "land_collision_start", | ||
410 | new object[0], | ||
411 | new DetectParams[0])); | ||
412 | } | ||
413 | |||
414 | public void land_collision(uint localID, UUID itemID) | ||
415 | { | ||
416 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
417 | "land_collision", | ||
418 | new object[0], | ||
419 | new DetectParams[0])); | ||
420 | } | ||
421 | |||
422 | public void land_collision_end(uint localID, UUID itemID) | ||
423 | { | ||
424 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
425 | "land_collision_end", | ||
426 | new object[0], | ||
427 | new DetectParams[0])); | ||
428 | } | ||
429 | |||
430 | // Handled by long commands | ||
431 | public void timer(uint localID, UUID itemID) | ||
432 | { | ||
433 | } | ||
434 | |||
435 | public void listen(uint localID, UUID itemID) | ||
436 | { | ||
437 | } | ||
438 | |||
439 | public void control(uint localID, UUID itemID, UUID agentID, uint held, uint change) | ||
440 | { | ||
441 | if ((change == 0) && (myScriptEngine.m_EventQueueManager.CheckEeventQueueForEvent(localID,"control"))) return; | ||
442 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
443 | "control",new object[] { | ||
444 | new LSL_Types.LSLString(agentID.ToString()), | ||
445 | new LSL_Types.LSLInteger(held), | ||
446 | new LSL_Types.LSLInteger(change)}, | ||
447 | new DetectParams[0])); | ||
448 | } | ||
449 | |||
450 | public void email(uint localID, UUID itemID, string timeSent, | ||
451 | string address, string subject, string message, int numLeft) | ||
452 | { | ||
453 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
454 | "email",new object[] { | ||
455 | new LSL_Types.LSLString(timeSent), | ||
456 | new LSL_Types.LSLString(address), | ||
457 | new LSL_Types.LSLString(subject), | ||
458 | new LSL_Types.LSLString(message), | ||
459 | new LSL_Types.LSLInteger(numLeft)}, | ||
460 | new DetectParams[0])); | ||
461 | } | ||
462 | |||
463 | public void at_target(uint localID, uint handle, Vector3 targetpos, | ||
464 | Vector3 atpos) | ||
465 | { | ||
466 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
467 | "at_target", new object[] { | ||
468 | new LSL_Types.LSLInteger(handle), | ||
469 | new LSL_Types.Vector3(targetpos.X,targetpos.Y,targetpos.Z), | ||
470 | new LSL_Types.Vector3(atpos.X,atpos.Y,atpos.Z) }, | ||
471 | new DetectParams[0])); | ||
472 | } | ||
473 | |||
474 | public void not_at_target(uint localID) | ||
475 | { | ||
476 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
477 | "not_at_target",new object[0], | ||
478 | new DetectParams[0])); | ||
479 | } | ||
480 | |||
481 | public void at_rot_target(uint localID, UUID itemID) | ||
482 | { | ||
483 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
484 | "at_rot_target",new object[0], | ||
485 | new DetectParams[0])); | ||
486 | } | ||
487 | |||
488 | public void not_at_rot_target(uint localID, UUID itemID) | ||
489 | { | ||
490 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
491 | "not_at_rot_target",new object[0], | ||
492 | new DetectParams[0])); | ||
493 | } | ||
494 | |||
495 | public void attach(uint localID, UUID itemID) | ||
496 | { | ||
497 | } | ||
498 | |||
499 | public void dataserver(uint localID, UUID itemID) | ||
500 | { | ||
501 | } | ||
502 | |||
503 | public void link_message(uint localID, UUID itemID) | ||
504 | { | ||
505 | } | ||
506 | |||
507 | public void moving_start(uint localID, UUID itemID) | ||
508 | { | ||
509 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
510 | "moving_start",new object[0], | ||
511 | new DetectParams[0])); | ||
512 | } | ||
513 | |||
514 | public void moving_end(uint localID, UUID itemID) | ||
515 | { | ||
516 | myScriptEngine.PostObjectEvent(localID, new EventParams( | ||
517 | "moving_end",new object[0], | ||
518 | new DetectParams[0])); | ||
519 | } | ||
520 | |||
521 | public void object_rez(uint localID, UUID itemID) | ||
522 | { | ||
523 | } | ||
524 | |||
525 | public void remote_data(uint localID, UUID itemID) | ||
526 | { | ||
527 | } | ||
528 | |||
529 | // Handled by long commands | ||
530 | public void http_response(uint localID, UUID itemID) | ||
531 | { | ||
532 | } | ||
533 | |||
534 | /// <summary> | ||
535 | /// If set to true then threads and stuff should try to make a graceful exit | ||
536 | /// </summary> | ||
537 | public bool PleaseShutdown | ||
538 | { | ||
539 | get { return _PleaseShutdown; } | ||
540 | set { _PleaseShutdown = value; } | ||
541 | } | ||
542 | private bool _PleaseShutdown = false; | ||
543 | } | ||
544 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs deleted file mode 100644 index 5865452..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs +++ /dev/null | |||
@@ -1,460 +0,0 @@ | |||
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.Generic; | ||
31 | using System.Reflection; | ||
32 | using OpenMetaverse; | ||
33 | using OpenSim.Region.ScriptEngine.Shared; | ||
34 | using log4net; | ||
35 | |||
36 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
37 | { | ||
38 | /// <summary> | ||
39 | /// EventQueueManager handles event queues | ||
40 | /// Events are queued and executed in separate thread | ||
41 | /// </summary> | ||
42 | [Serializable] | ||
43 | public class EventQueueManager | ||
44 | { | ||
45 | // | ||
46 | // Class is instanced in "ScriptEngine" and used by "EventManager" which is also instanced in "ScriptEngine". | ||
47 | // | ||
48 | // Class purpose is to queue and execute functions that are received by "EventManager": | ||
49 | // - allowing "EventManager" to release its event thread immediately, thus not interrupting server execution. | ||
50 | // - allowing us to prioritize and control execution of script functions. | ||
51 | // Class can use multiple threads for simultaneous execution. Mutexes are used for thread safety. | ||
52 | // | ||
53 | // 1. Hold an execution queue for scripts | ||
54 | // 2. Use threads to process queue, each thread executes one script function on each pass. | ||
55 | // 3. Catch any script error and process it | ||
56 | // | ||
57 | // | ||
58 | // Notes: | ||
59 | // * Current execution load balancing is optimized for 1 thread, and can cause unfair execute balancing between scripts. | ||
60 | // Not noticeable unless server is under high load. | ||
61 | // | ||
62 | |||
63 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
64 | |||
65 | public ScriptEngine m_ScriptEngine; | ||
66 | |||
67 | /// <summary> | ||
68 | /// List of threads (classes) processing event queue | ||
69 | /// Note that this may or may not be a reference to a static object depending on PrivateRegionThreads config setting. | ||
70 | /// </summary> | ||
71 | internal static List<EventQueueThreadClass> eventQueueThreads = new List<EventQueueThreadClass>(); // Thread pool that we work on | ||
72 | /// <summary> | ||
73 | /// Locking access to eventQueueThreads AND staticGlobalEventQueueThreads. | ||
74 | /// </summary> | ||
75 | // private object eventQueueThreadsLock = new object(); | ||
76 | // Static objects for referencing the objects above if we don't have private threads: | ||
77 | //internal static List<EventQueueThreadClass> staticEventQueueThreads; // A static reference used if we don't use private threads | ||
78 | // internal static object staticEventQueueThreadsLock; // Statick lock object reference for same reason | ||
79 | |||
80 | /// <summary> | ||
81 | /// Global static list of all threads (classes) processing event queue -- used by max enforcment thread | ||
82 | /// </summary> | ||
83 | //private List<EventQueueThreadClass> staticGlobalEventQueueThreads = new List<EventQueueThreadClass>(); | ||
84 | |||
85 | /// <summary> | ||
86 | /// Used internally to specify how many threads should exit gracefully | ||
87 | /// </summary> | ||
88 | public static int ThreadsToExit; | ||
89 | public static object ThreadsToExitLock = new object(); | ||
90 | |||
91 | |||
92 | //public object queueLock = new object(); // Mutex lock object | ||
93 | |||
94 | /// <summary> | ||
95 | /// How many threads to process queue with | ||
96 | /// </summary> | ||
97 | internal static int numberOfThreads; | ||
98 | |||
99 | internal static int EventExecutionMaxQueueSize; | ||
100 | |||
101 | /// <summary> | ||
102 | /// Maximum time one function can use for execution before we perform a thread kill. | ||
103 | /// </summary> | ||
104 | private static int maxFunctionExecutionTimems | ||
105 | { | ||
106 | get { return (int)(maxFunctionExecutionTimens / 10000); } | ||
107 | set { maxFunctionExecutionTimens = value * 10000; } | ||
108 | } | ||
109 | |||
110 | /// <summary> | ||
111 | /// Contains nanoseconds version of maxFunctionExecutionTimems so that it matches time calculations better (performance reasons). | ||
112 | /// WARNING! ONLY UPDATE maxFunctionExecutionTimems, NEVER THIS DIRECTLY. | ||
113 | /// </summary> | ||
114 | public static long maxFunctionExecutionTimens; | ||
115 | |||
116 | /// <summary> | ||
117 | /// Enforce max execution time | ||
118 | /// </summary> | ||
119 | public static bool EnforceMaxExecutionTime; | ||
120 | |||
121 | /// <summary> | ||
122 | /// Kill script (unload) when it exceeds execution time | ||
123 | /// </summary> | ||
124 | private static bool KillScriptOnMaxFunctionExecutionTime; | ||
125 | |||
126 | /// <summary> | ||
127 | /// List of localID locks for mutex processing of script events | ||
128 | /// </summary> | ||
129 | private List<uint> objectLocks = new List<uint>(); | ||
130 | private object tryLockLock = new object(); // Mutex lock object | ||
131 | |||
132 | /// <summary> | ||
133 | /// Queue containing events waiting to be executed | ||
134 | /// </summary> | ||
135 | public Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); | ||
136 | |||
137 | #region " Queue structures " | ||
138 | /// <summary> | ||
139 | /// Queue item structure | ||
140 | /// </summary> | ||
141 | public struct QueueItemStruct | ||
142 | { | ||
143 | public uint localID; | ||
144 | public UUID itemID; | ||
145 | public string functionName; | ||
146 | public DetectParams[] llDetectParams; | ||
147 | public object[] param; | ||
148 | public Dictionary<KeyValuePair<int,int>,KeyValuePair<int,int>> | ||
149 | LineMap; | ||
150 | } | ||
151 | |||
152 | #endregion | ||
153 | |||
154 | #region " Initialization / Startup " | ||
155 | public EventQueueManager(ScriptEngine _ScriptEngine) | ||
156 | { | ||
157 | m_ScriptEngine = _ScriptEngine; | ||
158 | |||
159 | ReadConfig(); | ||
160 | AdjustNumberOfScriptThreads(); | ||
161 | } | ||
162 | |||
163 | public void ReadConfig() | ||
164 | { | ||
165 | // Refresh config | ||
166 | numberOfThreads = m_ScriptEngine.ScriptConfigSource.GetInt("NumberOfScriptThreads", 2); | ||
167 | maxFunctionExecutionTimems = m_ScriptEngine.ScriptConfigSource.GetInt("MaxEventExecutionTimeMs", 5000); | ||
168 | EnforceMaxExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("EnforceMaxEventExecutionTime", true); | ||
169 | KillScriptOnMaxFunctionExecutionTime = m_ScriptEngine.ScriptConfigSource.GetBoolean("DeactivateScriptOnTimeout", false); | ||
170 | EventExecutionMaxQueueSize = m_ScriptEngine.ScriptConfigSource.GetInt("EventExecutionMaxQueueSize", 300); | ||
171 | |||
172 | // Now refresh config in all threads | ||
173 | lock (eventQueueThreads) | ||
174 | { | ||
175 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) | ||
176 | { | ||
177 | EventQueueThread.ReadConfig(); | ||
178 | } | ||
179 | } | ||
180 | } | ||
181 | |||
182 | #endregion | ||
183 | |||
184 | #region " Shutdown all threads " | ||
185 | ~EventQueueManager() | ||
186 | { | ||
187 | Stop(); | ||
188 | } | ||
189 | |||
190 | private void Stop() | ||
191 | { | ||
192 | if (eventQueueThreads != null) | ||
193 | { | ||
194 | // Kill worker threads | ||
195 | lock (eventQueueThreads) | ||
196 | { | ||
197 | foreach (EventQueueThreadClass EventQueueThread in new ArrayList(eventQueueThreads)) | ||
198 | { | ||
199 | AbortThreadClass(EventQueueThread); | ||
200 | } | ||
201 | //eventQueueThreads.Clear(); | ||
202 | //staticGlobalEventQueueThreads.Clear(); | ||
203 | } | ||
204 | } | ||
205 | |||
206 | // Remove all entries from our event queue | ||
207 | lock (eventQueue) | ||
208 | { | ||
209 | eventQueue.Clear(); | ||
210 | } | ||
211 | } | ||
212 | |||
213 | #endregion | ||
214 | |||
215 | #region " Start / stop script execution threads (ThreadClasses) " | ||
216 | private void StartNewThreadClass() | ||
217 | { | ||
218 | EventQueueThreadClass eqtc = new EventQueueThreadClass(); | ||
219 | eventQueueThreads.Add(eqtc); | ||
220 | //m_log.Debug("[" + m_ScriptEngine.ScriptEngineName + "]: Started new script execution thread. Current thread count: " + eventQueueThreads.Count); | ||
221 | } | ||
222 | |||
223 | private void AbortThreadClass(EventQueueThreadClass threadClass) | ||
224 | { | ||
225 | if (eventQueueThreads.Contains(threadClass)) | ||
226 | eventQueueThreads.Remove(threadClass); | ||
227 | |||
228 | try | ||
229 | { | ||
230 | threadClass.Stop(); | ||
231 | } | ||
232 | catch (Exception) | ||
233 | { | ||
234 | //m_log.Error("[" + m_ScriptEngine.ScriptEngineName + ":EventQueueManager]: If you see this, could you please report it to Tedd:"); | ||
235 | //m_log.Error("[" + m_ScriptEngine.ScriptEngineName + ":EventQueueManager]: Script thread execution timeout kill ended in exception: " + ex.ToString()); | ||
236 | } | ||
237 | //m_log.Debug("[" + m_ScriptEngine.ScriptEngineName + "]: Killed script execution thread. Remaining thread count: " + eventQueueThreads.Count); | ||
238 | } | ||
239 | #endregion | ||
240 | |||
241 | #region " Mutex locks for queue access " | ||
242 | /// <summary> | ||
243 | /// Try to get a mutex lock on localID | ||
244 | /// </summary> | ||
245 | /// <param name="localID"></param> | ||
246 | /// <returns></returns> | ||
247 | public bool TryLock(uint localID) | ||
248 | { | ||
249 | lock (tryLockLock) | ||
250 | { | ||
251 | if (objectLocks.Contains(localID) == true) | ||
252 | { | ||
253 | return false; | ||
254 | } | ||
255 | else | ||
256 | { | ||
257 | objectLocks.Add(localID); | ||
258 | return true; | ||
259 | } | ||
260 | } | ||
261 | } | ||
262 | |||
263 | /// <summary> | ||
264 | /// Release mutex lock on localID | ||
265 | /// </summary> | ||
266 | /// <param name="localID"></param> | ||
267 | public void ReleaseLock(uint localID) | ||
268 | { | ||
269 | lock (tryLockLock) | ||
270 | { | ||
271 | if (objectLocks.Contains(localID) == true) | ||
272 | { | ||
273 | objectLocks.Remove(localID); | ||
274 | } | ||
275 | } | ||
276 | } | ||
277 | #endregion | ||
278 | |||
279 | #region " Check execution queue for a specified Event" | ||
280 | /// <summary> | ||
281 | /// checks to see if a specified event type is already in the queue | ||
282 | /// </summary> | ||
283 | /// <param name="localID">Region object ID</param> | ||
284 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||
285 | /// <returns>true if event is found , false if not found</returns> | ||
286 | /// | ||
287 | public bool CheckEeventQueueForEvent(uint localID, string FunctionName) | ||
288 | { | ||
289 | if (eventQueue.Count > 0) | ||
290 | { | ||
291 | lock (eventQueue) | ||
292 | { | ||
293 | foreach (EventQueueManager.QueueItemStruct QIS in eventQueue) | ||
294 | { | ||
295 | if ((QIS.functionName == FunctionName) && (QIS.localID == localID)) | ||
296 | return true; | ||
297 | } | ||
298 | } | ||
299 | } | ||
300 | return false; | ||
301 | } | ||
302 | #endregion | ||
303 | |||
304 | #region " Add events to execution queue " | ||
305 | /// <summary> | ||
306 | /// Add event to event execution queue | ||
307 | /// </summary> | ||
308 | /// <param name="localID">Region object ID</param> | ||
309 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||
310 | /// <param name="param">Array of parameters to match event mask</param> | ||
311 | public bool AddToObjectQueue(uint localID, string FunctionName, DetectParams[] qParams, params object[] param) | ||
312 | { | ||
313 | // Determine all scripts in Object and add to their queue | ||
314 | //myScriptEngine.log.Info("[" + ScriptEngineName + "]: EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); | ||
315 | |||
316 | // Do we have any scripts in this object at all? If not, return | ||
317 | if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) | ||
318 | { | ||
319 | //m_log.Debug("Event \String.Empty + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); | ||
320 | return false; | ||
321 | } | ||
322 | |||
323 | List<UUID> scriptKeys = | ||
324 | m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); | ||
325 | |||
326 | foreach (UUID itemID in scriptKeys) | ||
327 | { | ||
328 | // Add to each script in that object | ||
329 | // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter? | ||
330 | AddToScriptQueue(localID, itemID, FunctionName, qParams, param); | ||
331 | } | ||
332 | return true; | ||
333 | } | ||
334 | |||
335 | /// <summary> | ||
336 | /// Add event to event execution queue | ||
337 | /// </summary> | ||
338 | /// <param name="localID">Region object ID</param> | ||
339 | /// <param name="itemID">Region script ID</param> | ||
340 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||
341 | /// <param name="param">Array of parameters to match event mask</param> | ||
342 | public bool AddToScriptQueue(uint localID, UUID itemID, string FunctionName, DetectParams[] qParams, params object[] param) | ||
343 | { | ||
344 | List<UUID> keylist = m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); | ||
345 | |||
346 | if (!keylist.Contains(itemID)) // We don't manage that script | ||
347 | { | ||
348 | return false; | ||
349 | } | ||
350 | |||
351 | lock (eventQueue) | ||
352 | { | ||
353 | if (eventQueue.Count >= EventExecutionMaxQueueSize) | ||
354 | { | ||
355 | m_log.Error("[" + m_ScriptEngine.ScriptEngineName + "]: ERROR: Event execution queue item count is at " + eventQueue.Count + ". Config variable \"EventExecutionMaxQueueSize\" is set to " + EventExecutionMaxQueueSize + ", so ignoring new event."); | ||
356 | m_log.Error("[" + m_ScriptEngine.ScriptEngineName + "]: Event ignored: localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); | ||
357 | return false; | ||
358 | } | ||
359 | |||
360 | InstanceData id = m_ScriptEngine.m_ScriptManager.GetScript( | ||
361 | localID, itemID); | ||
362 | |||
363 | // Create a structure and add data | ||
364 | QueueItemStruct QIS = new QueueItemStruct(); | ||
365 | QIS.localID = localID; | ||
366 | QIS.itemID = itemID; | ||
367 | QIS.functionName = FunctionName; | ||
368 | QIS.llDetectParams = qParams; | ||
369 | QIS.param = param; | ||
370 | if (id != null) | ||
371 | QIS.LineMap = id.LineMap; | ||
372 | |||
373 | // Add it to queue | ||
374 | eventQueue.Enqueue(QIS); | ||
375 | } | ||
376 | return true; | ||
377 | } | ||
378 | #endregion | ||
379 | |||
380 | #region " Maintenance thread " | ||
381 | |||
382 | /// <summary> | ||
383 | /// Adjust number of script thread classes. It can start new, but if it needs to stop it will just set number of threads in "ThreadsToExit" and threads will have to exit themselves. | ||
384 | /// Called from MaintenanceThread | ||
385 | /// </summary> | ||
386 | public void AdjustNumberOfScriptThreads() | ||
387 | { | ||
388 | // Is there anything here for us to do? | ||
389 | if (eventQueueThreads.Count == numberOfThreads) | ||
390 | return; | ||
391 | |||
392 | lock (eventQueueThreads) | ||
393 | { | ||
394 | int diff = numberOfThreads - eventQueueThreads.Count; | ||
395 | // Positive number: Start | ||
396 | // Negative number: too many are running | ||
397 | if (diff > 0) | ||
398 | { | ||
399 | // We need to add more threads | ||
400 | for (int ThreadCount = eventQueueThreads.Count; ThreadCount < numberOfThreads; ThreadCount++) | ||
401 | { | ||
402 | StartNewThreadClass(); | ||
403 | } | ||
404 | } | ||
405 | if (diff < 0) | ||
406 | { | ||
407 | // We need to kill some threads | ||
408 | lock (ThreadsToExitLock) | ||
409 | { | ||
410 | ThreadsToExit = Math.Abs(diff); | ||
411 | } | ||
412 | } | ||
413 | } | ||
414 | } | ||
415 | |||
416 | /// <summary> | ||
417 | /// Check if any thread class has been executing an event too long | ||
418 | /// </summary> | ||
419 | public void CheckScriptMaxExecTime() | ||
420 | { | ||
421 | // Iterate through all ScriptThreadClasses and check how long their current function has been executing | ||
422 | lock (eventQueueThreads) | ||
423 | { | ||
424 | foreach (EventQueueThreadClass EventQueueThread in eventQueueThreads) | ||
425 | { | ||
426 | // Is thread currently executing anything? | ||
427 | if (EventQueueThread.InExecution) | ||
428 | { | ||
429 | // Has execution time expired? | ||
430 | if (DateTime.Now.Ticks - EventQueueThread.LastExecutionStarted > | ||
431 | maxFunctionExecutionTimens) | ||
432 | { | ||
433 | // Yes! We need to kill this thread! | ||
434 | |||
435 | // Set flag if script should be removed or not | ||
436 | EventQueueThread.KillCurrentScript = KillScriptOnMaxFunctionExecutionTime; | ||
437 | |||
438 | // Abort this thread | ||
439 | AbortThreadClass(EventQueueThread); | ||
440 | |||
441 | // We do not need to start another, MaintenenceThread will do that for us | ||
442 | //StartNewThreadClass(); | ||
443 | } | ||
444 | } | ||
445 | } | ||
446 | } | ||
447 | } | ||
448 | #endregion | ||
449 | |||
450 | ///// <summary> | ||
451 | ///// If set to true then threads and stuff should try to make a graceful exit | ||
452 | ///// </summary> | ||
453 | //public bool PleaseShutdown | ||
454 | //{ | ||
455 | // get { return _PleaseShutdown; } | ||
456 | // set { _PleaseShutdown = value; } | ||
457 | //} | ||
458 | //private bool _PleaseShutdown = false; | ||
459 | } | ||
460 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs deleted file mode 100644 index 583d2ff..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueThreadClass.cs +++ /dev/null | |||
@@ -1,428 +0,0 @@ | |||
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.Generic; | ||
31 | using System.Reflection; | ||
32 | using System.Text.RegularExpressions; | ||
33 | using System.Threading; | ||
34 | using System.Globalization; | ||
35 | using OpenMetaverse; | ||
36 | using log4net; | ||
37 | using OpenSim.Framework; | ||
38 | using OpenSim.Region.Framework.Scenes; | ||
39 | using OpenSim.Region.Framework.Scenes.Scripting; | ||
40 | using OpenSim.Region.ScriptEngine.Shared; | ||
41 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | ||
42 | |||
43 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
44 | { | ||
45 | // Because every thread needs some data set for it | ||
46 | // (time started to execute current function), it will do its work | ||
47 | // within a class | ||
48 | public class EventQueueThreadClass | ||
49 | { | ||
50 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
51 | |||
52 | // How many ms to sleep if queue is empty | ||
53 | private static int nothingToDoSleepms;// = 50; | ||
54 | private static ThreadPriority MyThreadPriority; | ||
55 | |||
56 | public long LastExecutionStarted; | ||
57 | public bool InExecution = false; | ||
58 | public bool KillCurrentScript = false; | ||
59 | |||
60 | //private EventQueueManager eventQueueManager; | ||
61 | public Thread EventQueueThread; | ||
62 | private static int ThreadCount = 0; | ||
63 | |||
64 | private string ScriptEngineName = "ScriptEngine.Common"; | ||
65 | |||
66 | public EventQueueThreadClass()//EventQueueManager eqm | ||
67 | { | ||
68 | CultureInfo USCulture = new CultureInfo("en-US"); | ||
69 | Thread.CurrentThread.CurrentCulture = USCulture; | ||
70 | |||
71 | //eventQueueManager = eqm; | ||
72 | ReadConfig(); | ||
73 | Start(); | ||
74 | } | ||
75 | |||
76 | ~EventQueueThreadClass() | ||
77 | { | ||
78 | Stop(); | ||
79 | } | ||
80 | |||
81 | public void ReadConfig() | ||
82 | { | ||
83 | lock (ScriptEngine.ScriptEngines) | ||
84 | { | ||
85 | foreach (ScriptEngine m_ScriptEngine in | ||
86 | ScriptEngine.ScriptEngines) | ||
87 | { | ||
88 | ScriptEngineName = m_ScriptEngine.ScriptEngineName; | ||
89 | nothingToDoSleepms = | ||
90 | m_ScriptEngine.ScriptConfigSource.GetInt( | ||
91 | "SleepTimeIfNoScriptExecutionMs", 50); | ||
92 | |||
93 | string pri = m_ScriptEngine.ScriptConfigSource.GetString( | ||
94 | "ScriptThreadPriority", "BelowNormal"); | ||
95 | |||
96 | switch (pri.ToLower()) | ||
97 | { | ||
98 | case "lowest": | ||
99 | MyThreadPriority = ThreadPriority.Lowest; | ||
100 | break; | ||
101 | case "belownormal": | ||
102 | MyThreadPriority = ThreadPriority.BelowNormal; | ||
103 | break; | ||
104 | case "normal": | ||
105 | MyThreadPriority = ThreadPriority.Normal; | ||
106 | break; | ||
107 | case "abovenormal": | ||
108 | MyThreadPriority = ThreadPriority.AboveNormal; | ||
109 | break; | ||
110 | case "highest": | ||
111 | MyThreadPriority = ThreadPriority.Highest; | ||
112 | break; | ||
113 | default: | ||
114 | MyThreadPriority = ThreadPriority.BelowNormal; | ||
115 | m_log.Error( | ||
116 | "[ScriptEngine.DotNetEngine]: Unknown "+ | ||
117 | "priority type \"" + pri + | ||
118 | "\" in config file. Defaulting to "+ | ||
119 | "\"BelowNormal\"."); | ||
120 | break; | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | // Now set that priority | ||
125 | if (EventQueueThread != null) | ||
126 | if (EventQueueThread.IsAlive) | ||
127 | EventQueueThread.Priority = MyThreadPriority; | ||
128 | } | ||
129 | |||
130 | /// <summary> | ||
131 | /// Start thread | ||
132 | /// </summary> | ||
133 | private void Start() | ||
134 | { | ||
135 | EventQueueThread = new Thread(EventQueueThreadLoop); | ||
136 | EventQueueThread.IsBackground = true; | ||
137 | |||
138 | EventQueueThread.Priority = MyThreadPriority; | ||
139 | EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; | ||
140 | EventQueueThread.Start(); | ||
141 | |||
142 | // Look at this... Don't you wish everyone did that solid | ||
143 | // coding everywhere? :P | ||
144 | |||
145 | if (ThreadCount == int.MaxValue) | ||
146 | ThreadCount = 0; | ||
147 | |||
148 | ThreadCount++; | ||
149 | } | ||
150 | |||
151 | public void Stop() | ||
152 | { | ||
153 | if (EventQueueThread != null && EventQueueThread.IsAlive == true) | ||
154 | { | ||
155 | try | ||
156 | { | ||
157 | EventQueueThread.Abort(); // Send abort | ||
158 | } | ||
159 | catch (Exception) | ||
160 | { | ||
161 | } | ||
162 | } | ||
163 | } | ||
164 | |||
165 | private EventQueueManager.QueueItemStruct BlankQIS = | ||
166 | new EventQueueManager.QueueItemStruct(); | ||
167 | |||
168 | private ScriptEngine lastScriptEngine; | ||
169 | private uint lastLocalID; | ||
170 | private UUID lastItemID; | ||
171 | |||
172 | // Queue processing thread loop | ||
173 | private void EventQueueThreadLoop() | ||
174 | { | ||
175 | CultureInfo USCulture = new CultureInfo("en-US"); | ||
176 | Thread.CurrentThread.CurrentCulture = USCulture; | ||
177 | |||
178 | try | ||
179 | { | ||
180 | while (true) | ||
181 | { | ||
182 | try | ||
183 | { | ||
184 | while (true) | ||
185 | { | ||
186 | DoProcessQueue(); | ||
187 | } | ||
188 | } | ||
189 | catch (ThreadAbortException) | ||
190 | { | ||
191 | m_log.Info("[" + ScriptEngineName + | ||
192 | "]: ThreadAbortException while executing "+ | ||
193 | "function."); | ||
194 | } | ||
195 | catch (SelfDeleteException) // Must delete SOG | ||
196 | { | ||
197 | SceneObjectPart part = | ||
198 | lastScriptEngine.World.GetSceneObjectPart( | ||
199 | lastLocalID); | ||
200 | if (part != null && part.ParentGroup != null) | ||
201 | lastScriptEngine.World.DeleteSceneObject( | ||
202 | part.ParentGroup, false); | ||
203 | } | ||
204 | catch (ScriptDeleteException) // Must delete item | ||
205 | { | ||
206 | SceneObjectPart part = | ||
207 | lastScriptEngine.World.GetSceneObjectPart( | ||
208 | lastLocalID); | ||
209 | if (part != null && part.ParentGroup != null) | ||
210 | part.Inventory.RemoveInventoryItem(lastItemID); | ||
211 | } | ||
212 | catch (Exception e) | ||
213 | { | ||
214 | m_log.ErrorFormat("[{0}]: Exception {1} thrown", ScriptEngineName, e.GetType().ToString()); | ||
215 | throw e; | ||
216 | } | ||
217 | } | ||
218 | } | ||
219 | catch (ThreadAbortException) | ||
220 | { | ||
221 | } | ||
222 | catch (Exception e) | ||
223 | { | ||
224 | // TODO: Let users in the sim and those entering it and possibly an external watchdog know what has happened | ||
225 | m_log.ErrorFormat( | ||
226 | "[{0}]: Event queue thread terminating with exception. PLEASE REBOOT YOUR SIM - SCRIPT EVENTS WILL NOT WORK UNTIL YOU DO. Exception is {1}", | ||
227 | ScriptEngineName, e); | ||
228 | } | ||
229 | } | ||
230 | |||
231 | public void DoProcessQueue() | ||
232 | { | ||
233 | foreach (ScriptEngine m_ScriptEngine in | ||
234 | new ArrayList(ScriptEngine.ScriptEngines)) | ||
235 | { | ||
236 | lastScriptEngine = m_ScriptEngine; | ||
237 | |||
238 | EventQueueManager.QueueItemStruct QIS = BlankQIS; | ||
239 | bool GotItem = false; | ||
240 | |||
241 | //if (PleaseShutdown) | ||
242 | // return; | ||
243 | |||
244 | if (m_ScriptEngine.m_EventQueueManager == null || | ||
245 | m_ScriptEngine.m_EventQueueManager.eventQueue == null) | ||
246 | continue; | ||
247 | |||
248 | if (m_ScriptEngine.m_EventQueueManager.eventQueue.Count == 0) | ||
249 | { | ||
250 | // Nothing to do? Sleep a bit waiting for something to do | ||
251 | Thread.Sleep(nothingToDoSleepms); | ||
252 | } | ||
253 | else | ||
254 | { | ||
255 | // Something in queue, process | ||
256 | |||
257 | // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME | ||
258 | // OBJECT IS NOT GOOD | ||
259 | lock (m_ScriptEngine.m_EventQueueManager.eventQueue) | ||
260 | { | ||
261 | GotItem = false; | ||
262 | for (int qc = 0; qc < m_ScriptEngine.m_EventQueueManager.eventQueue.Count; qc++) | ||
263 | { | ||
264 | // Get queue item | ||
265 | QIS = m_ScriptEngine.m_EventQueueManager.eventQueue.Dequeue(); | ||
266 | |||
267 | // Check if object is being processed by | ||
268 | // someone else | ||
269 | if (m_ScriptEngine.m_EventQueueManager.TryLock( | ||
270 | QIS.localID) == false) | ||
271 | { | ||
272 | // Object is already being processed, requeue it | ||
273 | m_ScriptEngine.m_EventQueueManager. | ||
274 | eventQueue.Enqueue(QIS); | ||
275 | } | ||
276 | else | ||
277 | { | ||
278 | // We have lock on an object and can process it | ||
279 | GotItem = true; | ||
280 | break; | ||
281 | } | ||
282 | } | ||
283 | } | ||
284 | |||
285 | if (GotItem == true) | ||
286 | { | ||
287 | // Execute function | ||
288 | try | ||
289 | { | ||
290 | // Only pipe event if land supports it. | ||
291 | if (m_ScriptEngine.World.PipeEventsForScript( | ||
292 | QIS.localID)) | ||
293 | { | ||
294 | lastLocalID = QIS.localID; | ||
295 | lastItemID = QIS.itemID; | ||
296 | LastExecutionStarted = DateTime.Now.Ticks; | ||
297 | KillCurrentScript = false; | ||
298 | InExecution = true; | ||
299 | m_ScriptEngine.m_ScriptManager.ExecuteEvent( | ||
300 | QIS.localID, | ||
301 | QIS.itemID, | ||
302 | QIS.functionName, | ||
303 | QIS.llDetectParams, | ||
304 | QIS.param); | ||
305 | |||
306 | InExecution = false; | ||
307 | } | ||
308 | } | ||
309 | catch (TargetInvocationException tie) | ||
310 | { | ||
311 | Exception e = tie.InnerException; | ||
312 | |||
313 | if (e is SelfDeleteException) // Forward it | ||
314 | throw e; | ||
315 | |||
316 | InExecution = false; | ||
317 | string text = FormatException(tie, QIS.LineMap); | ||
318 | |||
319 | // DISPLAY ERROR INWORLD | ||
320 | |||
321 | // if (e.InnerException != null) | ||
322 | // { | ||
323 | // // Send inner exception | ||
324 | // string line = " (unknown line)"; | ||
325 | // Regex rx = new Regex(@"SecondLife\.Script\..+[\s:](?<line>\d+)\.?\r?$", RegexOptions.Compiled); | ||
326 | // if (rx.Match(e.InnerException.ToString()).Success) | ||
327 | // line = " (line " + rx.Match(e.InnerException.ToString()).Result("${line}") + ")"; | ||
328 | // text += e.InnerException.Message.ToString() + line; | ||
329 | // } | ||
330 | // else | ||
331 | // { | ||
332 | // text += "\r\n"; | ||
333 | // // Send normal | ||
334 | // text += e.Message.ToString(); | ||
335 | // } | ||
336 | // if (KillCurrentScript) | ||
337 | // text += "\r\nScript will be deactivated!"; | ||
338 | |||
339 | try | ||
340 | { | ||
341 | if (text.Length >= 1100) | ||
342 | text = text.Substring(0, 1099); | ||
343 | IScriptHost m_host = | ||
344 | m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); | ||
345 | m_ScriptEngine.World.SimChat( | ||
346 | Utils.StringToBytes(text), | ||
347 | ChatTypeEnum.DebugChannel, 2147483647, | ||
348 | m_host.AbsolutePosition, | ||
349 | m_host.Name, m_host.UUID, false); | ||
350 | } | ||
351 | catch (Exception) | ||
352 | { | ||
353 | m_log.Error("[" + | ||
354 | ScriptEngineName + "]: " + | ||
355 | "Unable to send text in-world:\r\n" + | ||
356 | text); | ||
357 | } | ||
358 | finally | ||
359 | { | ||
360 | // So we are done sending message in-world | ||
361 | if (KillCurrentScript) | ||
362 | { | ||
363 | m_ScriptEngine.m_EventQueueManager. | ||
364 | m_ScriptEngine.m_ScriptManager. | ||
365 | StopScript( | ||
366 | QIS.localID, QIS.itemID); | ||
367 | } | ||
368 | } | ||
369 | } | ||
370 | catch (Exception) | ||
371 | { | ||
372 | throw; | ||
373 | } | ||
374 | finally | ||
375 | { | ||
376 | InExecution = false; | ||
377 | m_ScriptEngine.m_EventQueueManager.ReleaseLock( | ||
378 | QIS.localID); | ||
379 | } | ||
380 | } | ||
381 | } | ||
382 | } | ||
383 | } | ||
384 | |||
385 | string FormatException(Exception e, Dictionary<KeyValuePair<int,int>, | ||
386 | KeyValuePair<int,int>> LineMap) | ||
387 | { | ||
388 | if (e.InnerException == null) | ||
389 | return e.ToString(); | ||
390 | |||
391 | string message = "Runtime error:\n" + e.InnerException.StackTrace; | ||
392 | string[] lines = message.Split(new char[] {'\n'}); | ||
393 | |||
394 | foreach (string line in lines) | ||
395 | { | ||
396 | if (line.Contains("SecondLife.Script")) | ||
397 | { | ||
398 | int idx = line.IndexOf(':'); | ||
399 | if (idx != -1) | ||
400 | { | ||
401 | string val = line.Substring(idx+1); | ||
402 | int lineNum = 0; | ||
403 | if (int.TryParse(val, out lineNum)) | ||
404 | { | ||
405 | KeyValuePair<int, int> pos = | ||
406 | Compiler.FindErrorPosition( | ||
407 | lineNum, 0, LineMap); | ||
408 | |||
409 | int scriptLine = pos.Key; | ||
410 | int col = pos.Value; | ||
411 | if (scriptLine == 0) | ||
412 | scriptLine++; | ||
413 | if (col == 0) | ||
414 | col++; | ||
415 | message = string.Format("Runtime error:\n" + | ||
416 | "Line ({0}): {1}", scriptLine - 1, | ||
417 | e.InnerException.Message); | ||
418 | |||
419 | return message; | ||
420 | } | ||
421 | } | ||
422 | } | ||
423 | } | ||
424 | |||
425 | return message; | ||
426 | } | ||
427 | } | ||
428 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs deleted file mode 100644 index 7ffdb1a..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/MaintenanceThread.cs +++ /dev/null | |||
@@ -1,241 +0,0 @@ | |||
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.Reflection; | ||
31 | using System.Threading; | ||
32 | using log4net; | ||
33 | using OpenSim.Framework; | ||
34 | |||
35 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
36 | { | ||
37 | /// <summary> | ||
38 | /// This class does maintenance on script engine. | ||
39 | /// </summary> | ||
40 | public class MaintenanceThread | ||
41 | { | ||
42 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
43 | |||
44 | //public ScriptEngine m_ScriptEngine; | ||
45 | private int MaintenanceLoopms; | ||
46 | private int MaintenanceLoopTicks_ScriptLoadUnload; | ||
47 | private int MaintenanceLoopTicks_Other; | ||
48 | |||
49 | |||
50 | public MaintenanceThread() | ||
51 | { | ||
52 | //m_ScriptEngine = _ScriptEngine; | ||
53 | |||
54 | ReadConfig(); | ||
55 | |||
56 | // Start maintenance thread | ||
57 | StartMaintenanceThread(); | ||
58 | } | ||
59 | |||
60 | ~MaintenanceThread() | ||
61 | { | ||
62 | StopMaintenanceThread(); | ||
63 | } | ||
64 | |||
65 | public void ReadConfig() | ||
66 | { | ||
67 | // Bad hack, but we need a m_ScriptEngine :) | ||
68 | lock (ScriptEngine.ScriptEngines) | ||
69 | { | ||
70 | foreach (ScriptEngine m_ScriptEngine in ScriptEngine.ScriptEngines) | ||
71 | { | ||
72 | MaintenanceLoopms = m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopms", 50); | ||
73 | MaintenanceLoopTicks_ScriptLoadUnload = | ||
74 | m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopTicks_ScriptLoadUnload", 1); | ||
75 | MaintenanceLoopTicks_Other = | ||
76 | m_ScriptEngine.ScriptConfigSource.GetInt("MaintenanceLoopTicks_Other", 10); | ||
77 | |||
78 | return; | ||
79 | } | ||
80 | } | ||
81 | } | ||
82 | |||
83 | #region " Maintenance thread " | ||
84 | /// <summary> | ||
85 | /// Maintenance thread. Enforcing max execution time for example. | ||
86 | /// </summary> | ||
87 | public Thread MaintenanceThreadThread; | ||
88 | |||
89 | /// <summary> | ||
90 | /// Starts maintenance thread | ||
91 | /// </summary> | ||
92 | private void StartMaintenanceThread() | ||
93 | { | ||
94 | if (MaintenanceThreadThread == null) | ||
95 | { | ||
96 | MaintenanceThreadThread = new Thread(MaintenanceLoop); | ||
97 | MaintenanceThreadThread.Name = "ScriptMaintenanceThread"; | ||
98 | MaintenanceThreadThread.IsBackground = true; | ||
99 | MaintenanceThreadThread.Start(); | ||
100 | } | ||
101 | } | ||
102 | |||
103 | /// <summary> | ||
104 | /// Stops maintenance thread | ||
105 | /// </summary> | ||
106 | private void StopMaintenanceThread() | ||
107 | { | ||
108 | #if DEBUG | ||
109 | //m_log.Debug("[" + m_ScriptEngine.ScriptEngineName + "]: StopMaintenanceThread() called"); | ||
110 | #endif | ||
111 | //PleaseShutdown = true; | ||
112 | Thread.Sleep(100); | ||
113 | try | ||
114 | { | ||
115 | if (MaintenanceThreadThread != null && MaintenanceThreadThread.IsAlive) | ||
116 | { | ||
117 | MaintenanceThreadThread.Abort(); | ||
118 | } | ||
119 | } | ||
120 | catch (Exception) | ||
121 | { | ||
122 | //m_log.Error("[" + m_ScriptEngine.ScriptEngineName + "]: Exception stopping maintenence thread: " + ex.ToString()); | ||
123 | } | ||
124 | } | ||
125 | |||
126 | // private ScriptEngine lastScriptEngine; // Keep track of what ScriptEngine instance we are at so we can give exception | ||
127 | /// <summary> | ||
128 | /// A thread should run in this loop and check all running scripts | ||
129 | /// </summary> | ||
130 | public void MaintenanceLoop() | ||
131 | { | ||
132 | //if (m_ScriptEngine.m_EventQueueManager.maxFunctionExecutionTimens < MaintenanceLoopms) | ||
133 | // m_log.Warn("[" + m_ScriptEngine.ScriptEngineName + "]: " + | ||
134 | // "Configuration error: MaxEventExecutionTimeMs is less than MaintenanceLoopms. The Maintenance Loop will only check scripts once per run."); | ||
135 | |||
136 | long Last_maxFunctionExecutionTimens = 0; // DateTime.Now.Ticks; | ||
137 | long Last_ReReadConfigFilens = DateTime.Now.Ticks; | ||
138 | int MaintenanceLoopTicks_ScriptLoadUnload_Count = 0; | ||
139 | int MaintenanceLoopTicks_Other_Count = 0; | ||
140 | bool MaintenanceLoopTicks_ScriptLoadUnload_ResetCount = false; | ||
141 | bool MaintenanceLoopTicks_Other_ResetCount = false; | ||
142 | |||
143 | while (true) | ||
144 | { | ||
145 | try | ||
146 | { | ||
147 | while (true) | ||
148 | { | ||
149 | Thread.Sleep(MaintenanceLoopms); // Sleep before next pass | ||
150 | |||
151 | // Reset counters? | ||
152 | if (MaintenanceLoopTicks_ScriptLoadUnload_ResetCount) | ||
153 | { | ||
154 | MaintenanceLoopTicks_ScriptLoadUnload_ResetCount = false; | ||
155 | MaintenanceLoopTicks_ScriptLoadUnload_Count = 0; | ||
156 | } | ||
157 | if (MaintenanceLoopTicks_Other_ResetCount) | ||
158 | { | ||
159 | MaintenanceLoopTicks_Other_ResetCount = false; | ||
160 | MaintenanceLoopTicks_Other_Count = 0; | ||
161 | } | ||
162 | |||
163 | // Increase our counters | ||
164 | MaintenanceLoopTicks_ScriptLoadUnload_Count++; | ||
165 | MaintenanceLoopTicks_Other_Count++; | ||
166 | |||
167 | |||
168 | //lock (ScriptEngine.ScriptEngines) | ||
169 | //{ | ||
170 | foreach (ScriptEngine m_ScriptEngine in new ArrayList(ScriptEngine.ScriptEngines)) | ||
171 | { | ||
172 | // lastScriptEngine = m_ScriptEngine; | ||
173 | // Re-reading config every x seconds | ||
174 | if (MaintenanceLoopTicks_Other_Count >= MaintenanceLoopTicks_Other) | ||
175 | { | ||
176 | MaintenanceLoopTicks_Other_ResetCount = true; | ||
177 | if (m_ScriptEngine.RefreshConfigFilens > 0) | ||
178 | { | ||
179 | // Check if its time to re-read config | ||
180 | if (DateTime.Now.Ticks - Last_ReReadConfigFilens > | ||
181 | m_ScriptEngine.RefreshConfigFilens) | ||
182 | { | ||
183 | //m_log.Debug("Time passed: " + (DateTime.Now.Ticks - Last_ReReadConfigFilens) + ">" + m_ScriptEngine.RefreshConfigFilens); | ||
184 | // Its time to re-read config file | ||
185 | m_ScriptEngine.ReadConfig(); | ||
186 | Last_ReReadConfigFilens = DateTime.Now.Ticks; // Reset time | ||
187 | } | ||
188 | |||
189 | |||
190 | // Adjust number of running script threads if not correct | ||
191 | if (m_ScriptEngine.m_EventQueueManager != null) | ||
192 | m_ScriptEngine.m_EventQueueManager.AdjustNumberOfScriptThreads(); | ||
193 | |||
194 | // Check if any script has exceeded its max execution time | ||
195 | if (EventQueueManager.EnforceMaxExecutionTime) | ||
196 | { | ||
197 | // We are enforcing execution time | ||
198 | if (DateTime.Now.Ticks - Last_maxFunctionExecutionTimens > | ||
199 | EventQueueManager.maxFunctionExecutionTimens) | ||
200 | { | ||
201 | // Its time to check again | ||
202 | m_ScriptEngine.m_EventQueueManager.CheckScriptMaxExecTime(); // Do check | ||
203 | Last_maxFunctionExecutionTimens = DateTime.Now.Ticks; // Reset time | ||
204 | } | ||
205 | } | ||
206 | } | ||
207 | } | ||
208 | if (MaintenanceLoopTicks_ScriptLoadUnload_Count >= MaintenanceLoopTicks_ScriptLoadUnload) | ||
209 | { | ||
210 | MaintenanceLoopTicks_ScriptLoadUnload_ResetCount = true; | ||
211 | // LOAD / UNLOAD SCRIPTS | ||
212 | if (m_ScriptEngine.m_ScriptManager != null) | ||
213 | m_ScriptEngine.m_ScriptManager.DoScriptLoadUnload(); | ||
214 | } | ||
215 | } | ||
216 | //} | ||
217 | } | ||
218 | } | ||
219 | catch(ThreadAbortException) | ||
220 | { | ||
221 | m_log.Error("Thread aborted in MaintenanceLoopThread. If this is during shutdown, please ignore"); | ||
222 | } | ||
223 | catch (Exception ex) | ||
224 | { | ||
225 | m_log.ErrorFormat("Exception in MaintenanceLoopThread. Thread will recover after 5 sec throttle. Exception: {0}", ex.ToString()); | ||
226 | } | ||
227 | } | ||
228 | } | ||
229 | #endregion | ||
230 | |||
231 | ///// <summary> | ||
232 | ///// If set to true then threads and stuff should try to make a graceful exit | ||
233 | ///// </summary> | ||
234 | //public bool PleaseShutdown | ||
235 | //{ | ||
236 | // get { return _PleaseShutdown; } | ||
237 | // set { _PleaseShutdown = value; } | ||
238 | //} | ||
239 | //private bool _PleaseShutdown = false; | ||
240 | } | ||
241 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs deleted file mode 100644 index 4c4c5e7..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Properties/AssemblyInfo.cs +++ /dev/null | |||
@@ -1,65 +0,0 @@ | |||
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.Reflection; | ||
29 | using System.Runtime.InteropServices; | ||
30 | |||
31 | // General information about an assembly is controlled through the following | ||
32 | // set of attributes. Change these attribute values to modify the information | ||
33 | // associated with an assembly. | ||
34 | |||
35 | [assembly : AssemblyTitle("OpenSim.Region.ScriptEngine.DotNetEngine")] | ||
36 | [assembly : AssemblyDescription("")] | ||
37 | [assembly : AssemblyConfiguration("")] | ||
38 | [assembly : AssemblyCompany("http://opensimulator.org")] | ||
39 | [assembly : AssemblyProduct("OpenSim.Region.ScriptEngine.DotNetEngine")] | ||
40 | [assembly : AssemblyCopyright("Copyright (c) OpenSimulator.org Developers 2007-2009")] | ||
41 | [assembly : AssemblyTrademark("")] | ||
42 | [assembly : AssemblyCulture("")] | ||
43 | |||
44 | // Setting ComVisible to false makes the types in this assembly not visible | ||
45 | // to COM components. If you need to access a type in this assembly from | ||
46 | // COM, set the ComVisible attribute to true on that type. | ||
47 | |||
48 | [assembly : ComVisible(false)] | ||
49 | |||
50 | // The following GUID is for the ID of the typelib if this project is exposed to COM | ||
51 | |||
52 | [assembly : Guid("2842257e-6fde-4460-9368-4cde57fa9cc4")] | ||
53 | |||
54 | // Version information for an assembly consists of the following four values: | ||
55 | // | ||
56 | // Major Version | ||
57 | // Minor Version | ||
58 | // Build Number | ||
59 | // Revision | ||
60 | // | ||
61 | // You can specify all the values or you can default the Revision and Build Numbers | ||
62 | // by using the '*' as shown below: | ||
63 | |||
64 | [assembly : AssemblyVersion("0.6.5.*")] | ||
65 | [assembly : AssemblyFileVersion("0.6.5.0")] | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Resources/DotNetEngine.addin.xml b/OpenSim/Region/ScriptEngine/DotNetEngine/Resources/DotNetEngine.addin.xml deleted file mode 100644 index 78a8dca..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Resources/DotNetEngine.addin.xml +++ /dev/null | |||
@@ -1,13 +0,0 @@ | |||
1 | <Addin id="OpenSim.Region.ScriptEngine.DotNetEngine" version="0.2"> | ||
2 | <Runtime> | ||
3 | <Import assembly="OpenSim.Region.ScriptEngine.DotNetEngine.dll"/> | ||
4 | </Runtime> | ||
5 | |||
6 | <Dependencies> | ||
7 | <Addin id="OpenSim" version="0.5" /> | ||
8 | </Dependencies> | ||
9 | |||
10 | <Extension path = "/OpenSim/RegionModules"> | ||
11 | <RegionModule id="DotNetEngine" type="OpenSim.Region.ScriptEngine.DotNetEngine.ScriptEngine" /> | ||
12 | </Extension> | ||
13 | </Addin> | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs deleted file mode 100644 index 9806218..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs +++ /dev/null | |||
@@ -1,485 +0,0 @@ | |||
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.Generic; | ||
30 | using System.Reflection; | ||
31 | using log4net; | ||
32 | using Nini.Config; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Region.CoreModules.Framework.EventQueue; | ||
35 | using OpenSim.Region.Framework.Interfaces; | ||
36 | using OpenSim.Region.Framework.Scenes; | ||
37 | using OpenSim.Region.ScriptEngine.Interfaces; | ||
38 | using OpenMetaverse; | ||
39 | using OpenMetaverse.StructuredData; | ||
40 | using OpenSim.Region.ScriptEngine.Shared; | ||
41 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||
42 | |||
43 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
44 | { | ||
45 | [Serializable] | ||
46 | public class ScriptEngine : INonSharedRegionModule, IScriptEngine, IScriptModule | ||
47 | { | ||
48 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
49 | |||
50 | public static List<ScriptEngine> ScriptEngines = | ||
51 | new List<ScriptEngine>(); | ||
52 | |||
53 | private Scene m_Scene; | ||
54 | public Scene World | ||
55 | { | ||
56 | get { return m_Scene; } | ||
57 | } | ||
58 | |||
59 | // Handles and queues incoming events from OpenSim | ||
60 | public EventManager m_EventManager; | ||
61 | |||
62 | // Executes events, handles script threads | ||
63 | public EventQueueManager m_EventQueueManager; | ||
64 | |||
65 | // Load, unload and execute scripts | ||
66 | public ScriptManager m_ScriptManager; | ||
67 | |||
68 | // Handles loading/unloading of scripts into AppDomains | ||
69 | public AppDomainManager m_AppDomainManager; | ||
70 | |||
71 | // Thread that does different kinds of maintenance, | ||
72 | // for example refreshing config and killing scripts | ||
73 | // that has been running too long | ||
74 | public static MaintenanceThread m_MaintenanceThread; | ||
75 | |||
76 | private IConfigSource m_ConfigSource; | ||
77 | public IConfig ScriptConfigSource; | ||
78 | private bool m_enabled = false; | ||
79 | |||
80 | public IConfig Config | ||
81 | { | ||
82 | get { return ScriptConfigSource; } | ||
83 | } | ||
84 | |||
85 | public IConfigSource ConfigSource | ||
86 | { | ||
87 | get { return m_ConfigSource; } | ||
88 | } | ||
89 | |||
90 | // How many seconds between re-reading config-file. | ||
91 | // 0 = never. ScriptEngine will try to adjust to new config changes. | ||
92 | public int RefreshConfigFileSeconds { | ||
93 | get { return (int)(RefreshConfigFilens / 10000000); } | ||
94 | set { RefreshConfigFilens = value * 10000000; } | ||
95 | } | ||
96 | |||
97 | public long RefreshConfigFilens; | ||
98 | |||
99 | public string ScriptEngineName | ||
100 | { | ||
101 | get { return "ScriptEngine.DotNetEngine"; } | ||
102 | } | ||
103 | |||
104 | public IScriptModule ScriptModule | ||
105 | { | ||
106 | get { return this; } | ||
107 | } | ||
108 | |||
109 | public event ScriptRemoved OnScriptRemoved; | ||
110 | public event ObjectRemoved OnObjectRemoved; | ||
111 | |||
112 | public ScriptEngine() | ||
113 | { | ||
114 | // For logging, just need any instance, doesn't matter | ||
115 | Common.mySE = this; | ||
116 | |||
117 | lock (ScriptEngines) | ||
118 | { | ||
119 | // Keep a list of ScriptEngines for shared threads | ||
120 | // to process all instances | ||
121 | ScriptEngines.Add(this); | ||
122 | } | ||
123 | } | ||
124 | |||
125 | public void Initialise(IConfigSource config) | ||
126 | { | ||
127 | m_ConfigSource = config; | ||
128 | } | ||
129 | |||
130 | public void AddRegion(Scene Sceneworld) | ||
131 | { | ||
132 | // Make sure we have config | ||
133 | if (ConfigSource.Configs[ScriptEngineName] == null) | ||
134 | ConfigSource.AddConfig(ScriptEngineName); | ||
135 | |||
136 | ScriptConfigSource = ConfigSource.Configs[ScriptEngineName]; | ||
137 | |||
138 | m_enabled = ScriptConfigSource.GetBoolean("Enabled", true); | ||
139 | if (!m_enabled) | ||
140 | return; | ||
141 | |||
142 | m_log.Info("[" + ScriptEngineName + "]: ScriptEngine initializing"); | ||
143 | |||
144 | m_Scene = Sceneworld; | ||
145 | |||
146 | // Create all objects we'll be using | ||
147 | m_EventQueueManager = new EventQueueManager(this); | ||
148 | m_EventManager = new EventManager(this, true); | ||
149 | |||
150 | // We need to start it | ||
151 | m_ScriptManager = new ScriptManager(this); | ||
152 | m_ScriptManager.Setup(); | ||
153 | m_AppDomainManager = new AppDomainManager(this); | ||
154 | if (m_MaintenanceThread == null) | ||
155 | m_MaintenanceThread = new MaintenanceThread(); | ||
156 | |||
157 | m_log.Info("[" + ScriptEngineName + "]: Reading configuration "+ | ||
158 | "from config section \"" + ScriptEngineName + "\""); | ||
159 | |||
160 | ReadConfig(); | ||
161 | |||
162 | m_Scene.StackModuleInterface<IScriptModule>(this); | ||
163 | } | ||
164 | |||
165 | public void RemoveRegion(Scene scene) | ||
166 | { | ||
167 | } | ||
168 | |||
169 | public void RegionLoaded(Scene scene) | ||
170 | { | ||
171 | if (!m_enabled) | ||
172 | return; | ||
173 | |||
174 | m_EventManager.HookUpEvents(); | ||
175 | |||
176 | m_Scene.EventManager.OnScriptReset += OnScriptReset; | ||
177 | m_Scene.EventManager.OnGetScriptRunning += OnGetScriptRunning; | ||
178 | m_Scene.EventManager.OnStartScript += OnStartScript; | ||
179 | m_Scene.EventManager.OnStopScript += OnStopScript; | ||
180 | |||
181 | m_ScriptManager.Start(); | ||
182 | } | ||
183 | |||
184 | public void Shutdown() | ||
185 | { | ||
186 | // We are shutting down | ||
187 | lock (ScriptEngines) | ||
188 | { | ||
189 | ScriptEngines.Remove(this); | ||
190 | } | ||
191 | } | ||
192 | |||
193 | public void ReadConfig() | ||
194 | { | ||
195 | RefreshConfigFileSeconds = ScriptConfigSource.GetInt("RefreshConfig", 0); | ||
196 | |||
197 | if (m_EventQueueManager != null) m_EventQueueManager.ReadConfig(); | ||
198 | if (m_EventManager != null) m_EventManager.ReadConfig(); | ||
199 | if (m_ScriptManager != null) m_ScriptManager.ReadConfig(); | ||
200 | if (m_AppDomainManager != null) m_AppDomainManager.ReadConfig(); | ||
201 | if (m_MaintenanceThread != null) m_MaintenanceThread.ReadConfig(); | ||
202 | } | ||
203 | |||
204 | #region IRegionModule | ||
205 | |||
206 | public void Close() | ||
207 | { | ||
208 | } | ||
209 | |||
210 | public Type ReplaceableInterface | ||
211 | { | ||
212 | get { return null; } | ||
213 | } | ||
214 | |||
215 | public string Name | ||
216 | { | ||
217 | get { return "Common." + ScriptEngineName; } | ||
218 | } | ||
219 | |||
220 | public bool IsSharedModule | ||
221 | { | ||
222 | get { return false; } | ||
223 | } | ||
224 | |||
225 | public bool PostObjectEvent(uint localID, EventParams p) | ||
226 | { | ||
227 | return m_EventQueueManager.AddToObjectQueue(localID, p.EventName, | ||
228 | p.DetectParams, p.Params); | ||
229 | } | ||
230 | |||
231 | public bool PostScriptEvent(UUID itemID, EventParams p) | ||
232 | { | ||
233 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
234 | return m_EventQueueManager.AddToScriptQueue(localID, itemID, | ||
235 | p.EventName, p.DetectParams, p.Params); | ||
236 | } | ||
237 | |||
238 | public bool PostScriptEvent(UUID itemID, string name, Object[] p) | ||
239 | { | ||
240 | Object[] lsl_p = new Object[p.Length]; | ||
241 | for (int i = 0; i < p.Length ; i++) | ||
242 | { | ||
243 | if (p[i] is int) | ||
244 | lsl_p[i] = new LSL_Types.LSLInteger((int)p[i]); | ||
245 | else if (p[i] is string) | ||
246 | lsl_p[i] = new LSL_Types.LSLString((string)p[i]); | ||
247 | else if (p[i] is Vector3) | ||
248 | lsl_p[i] = new LSL_Types.Vector3(((Vector3)p[i]).X, ((Vector3)p[i]).Y, ((Vector3)p[i]).Z); | ||
249 | else if (p[i] is Quaternion) | ||
250 | lsl_p[i] = new LSL_Types.Quaternion(((Quaternion)p[i]).X, ((Quaternion)p[i]).Y, ((Quaternion)p[i]).Z, ((Quaternion)p[i]).W); | ||
251 | else if (p[i] is float) | ||
252 | lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]); | ||
253 | else | ||
254 | lsl_p[i] = p[i]; | ||
255 | } | ||
256 | |||
257 | return PostScriptEvent(itemID, new EventParams(name, lsl_p, new DetectParams[0])); | ||
258 | } | ||
259 | |||
260 | public bool PostObjectEvent(UUID itemID, string name, Object[] p) | ||
261 | { | ||
262 | SceneObjectPart part = m_Scene.GetSceneObjectPart(itemID); | ||
263 | if (part == null) | ||
264 | return false; | ||
265 | |||
266 | Object[] lsl_p = new Object[p.Length]; | ||
267 | for (int i = 0; i < p.Length ; i++) | ||
268 | { | ||
269 | if (p[i] is int) | ||
270 | lsl_p[i] = new LSL_Types.LSLInteger((int)p[i]); | ||
271 | else if (p[i] is string) | ||
272 | lsl_p[i] = new LSL_Types.LSLString((string)p[i]); | ||
273 | else if (p[i] is Vector3) | ||
274 | lsl_p[i] = new LSL_Types.Vector3(((Vector3)p[i]).X, ((Vector3)p[i]).Y, ((Vector3)p[i]).Z); | ||
275 | else if (p[i] is Quaternion) | ||
276 | lsl_p[i] = new LSL_Types.Quaternion(((Quaternion)p[i]).X, ((Quaternion)p[i]).Y, ((Quaternion)p[i]).Z, ((Quaternion)p[i]).W); | ||
277 | else if (p[i] is float) | ||
278 | lsl_p[i] = new LSL_Types.LSLFloat((float)p[i]); | ||
279 | else | ||
280 | lsl_p[i] = p[i]; | ||
281 | } | ||
282 | |||
283 | return PostObjectEvent(part.LocalId, new EventParams(name, lsl_p, new DetectParams[0])); | ||
284 | } | ||
285 | |||
286 | public DetectParams GetDetectParams(UUID itemID, int number) | ||
287 | { | ||
288 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
289 | if (localID == 0) | ||
290 | return null; | ||
291 | |||
292 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
293 | |||
294 | if (id == null) | ||
295 | return null; | ||
296 | |||
297 | DetectParams[] det = m_ScriptManager.GetDetectParams(id); | ||
298 | |||
299 | if (number < 0 || number >= det.Length) | ||
300 | return null; | ||
301 | |||
302 | return det[number]; | ||
303 | } | ||
304 | |||
305 | public int GetStartParameter(UUID itemID) | ||
306 | { | ||
307 | return m_ScriptManager.GetStartParameter(itemID); | ||
308 | } | ||
309 | |||
310 | public void SetMinEventDelay(UUID itemID, double delay) | ||
311 | { | ||
312 | // TODO in DotNet, done in XEngine | ||
313 | throw new NotImplementedException(); | ||
314 | } | ||
315 | |||
316 | #endregion | ||
317 | |||
318 | public void SetState(UUID itemID, string state) | ||
319 | { | ||
320 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
321 | if (localID == 0) | ||
322 | return; | ||
323 | |||
324 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
325 | |||
326 | if (id == null) | ||
327 | return; | ||
328 | |||
329 | string currentState = id.State; | ||
330 | |||
331 | if (currentState != state) | ||
332 | { | ||
333 | try | ||
334 | { | ||
335 | m_EventManager.state_exit(localID); | ||
336 | |||
337 | } | ||
338 | catch (AppDomainUnloadedException) | ||
339 | { | ||
340 | m_log.Error("[SCRIPT]: state change called when "+ | ||
341 | "script was unloaded. Nothing to worry about, "+ | ||
342 | "but noting the occurance"); | ||
343 | } | ||
344 | |||
345 | id.State = state; | ||
346 | |||
347 | try | ||
348 | { | ||
349 | int eventFlags = m_ScriptManager.GetStateEventFlags(localID, | ||
350 | itemID); | ||
351 | |||
352 | SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); | ||
353 | if (part != null) | ||
354 | part.SetScriptEvents(itemID, eventFlags); | ||
355 | |||
356 | m_EventManager.state_entry(localID); | ||
357 | } | ||
358 | catch (AppDomainUnloadedException) | ||
359 | { | ||
360 | m_log.Error("[SCRIPT]: state change called when "+ | ||
361 | "script was unloaded. Nothing to worry about, but "+ | ||
362 | "noting the occurance"); | ||
363 | } | ||
364 | } | ||
365 | } | ||
366 | |||
367 | public bool GetScriptState(UUID itemID) | ||
368 | { | ||
369 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
370 | if (localID == 0) | ||
371 | return false; | ||
372 | |||
373 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
374 | if (id == null) | ||
375 | return false; | ||
376 | |||
377 | return id.Running; | ||
378 | } | ||
379 | |||
380 | public void SetScriptState(UUID itemID, bool state) | ||
381 | { | ||
382 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
383 | if (localID == 0) | ||
384 | return; | ||
385 | |||
386 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
387 | if (id == null) | ||
388 | return; | ||
389 | |||
390 | if (!id.Disabled) | ||
391 | id.Running = state; | ||
392 | } | ||
393 | |||
394 | public void ApiResetScript(UUID itemID) | ||
395 | { | ||
396 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
397 | if (localID == 0) | ||
398 | return; | ||
399 | |||
400 | m_ScriptManager.ResetScript(localID, itemID); | ||
401 | } | ||
402 | |||
403 | public void ResetScript(UUID itemID) | ||
404 | { | ||
405 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
406 | if (localID == 0) | ||
407 | return; | ||
408 | |||
409 | m_ScriptManager.ResetScript(localID, itemID); | ||
410 | } | ||
411 | |||
412 | public void OnScriptReset(uint localID, UUID itemID) | ||
413 | { | ||
414 | ResetScript(itemID); | ||
415 | } | ||
416 | |||
417 | public void OnStartScript(uint localID, UUID itemID) | ||
418 | { | ||
419 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
420 | if (id == null) | ||
421 | return; | ||
422 | |||
423 | if (!id.Disabled) | ||
424 | id.Running = true; | ||
425 | } | ||
426 | |||
427 | public void OnStopScript(uint localID, UUID itemID) | ||
428 | { | ||
429 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
430 | if (id == null) | ||
431 | return; | ||
432 | |||
433 | id.Running = false; | ||
434 | } | ||
435 | |||
436 | public void OnGetScriptRunning(IClientAPI controllingClient, | ||
437 | UUID objectID, UUID itemID) | ||
438 | { | ||
439 | uint localID = m_ScriptManager.GetLocalID(itemID); | ||
440 | if (localID == 0) | ||
441 | return; | ||
442 | |||
443 | InstanceData id = m_ScriptManager.GetScript(localID, itemID); | ||
444 | if (id == null) | ||
445 | return; | ||
446 | |||
447 | IEventQueue eq = World.RequestModuleInterface<IEventQueue>(); | ||
448 | if (eq == null) | ||
449 | { | ||
450 | controllingClient.SendScriptRunningReply(objectID, itemID, | ||
451 | id.Running); | ||
452 | } | ||
453 | else | ||
454 | { | ||
455 | eq.Enqueue(EventQueueHelper.ScriptRunningReplyEvent(objectID, itemID, id.Running, true), | ||
456 | controllingClient.AgentId); | ||
457 | } | ||
458 | } | ||
459 | |||
460 | public IScriptApi GetApi(UUID itemID, string name) | ||
461 | { | ||
462 | return m_ScriptManager.GetApi(itemID, name); | ||
463 | } | ||
464 | |||
465 | public IScriptWorkItem QueueEventHandler(Object o) | ||
466 | { | ||
467 | return null; | ||
468 | } | ||
469 | |||
470 | public string GetAssemblyName(UUID itemID) | ||
471 | { | ||
472 | return ""; | ||
473 | } | ||
474 | |||
475 | public string GetXMLState(UUID itemID) | ||
476 | { | ||
477 | return ""; | ||
478 | } | ||
479 | |||
480 | public bool CanBeDeleted(UUID itemID) | ||
481 | { | ||
482 | return true; | ||
483 | } | ||
484 | } | ||
485 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs deleted file mode 100644 index 6ac209e..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs +++ /dev/null | |||
@@ -1,703 +0,0 @@ | |||
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.Reflection; | ||
30 | using System.Globalization; | ||
31 | using System.Runtime.Remoting; | ||
32 | using System.Runtime.Remoting.Lifetime; | ||
33 | using log4net; | ||
34 | using OpenMetaverse; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Region.Framework.Scenes; | ||
37 | using OpenSim.Region.ScriptEngine.Interfaces; | ||
38 | using OpenSim.Region.ScriptEngine.Shared; | ||
39 | using OpenSim.Region.ScriptEngine.Shared.Api; | ||
40 | using System.Collections.Generic; | ||
41 | using System.IO; | ||
42 | using System.Runtime.Serialization.Formatters.Binary; | ||
43 | using System.Threading; | ||
44 | using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; | ||
45 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||
46 | using OpenSim.Region.ScriptEngine.Shared.CodeTools; | ||
47 | |||
48 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
49 | { | ||
50 | public class InstanceData | ||
51 | { | ||
52 | public IScript Script; | ||
53 | public string State; | ||
54 | public bool Running; | ||
55 | public bool Disabled; | ||
56 | public string Source; | ||
57 | public int StartParam; | ||
58 | public AppDomain AppDomain; | ||
59 | public Dictionary<string, IScriptApi> Apis; | ||
60 | public Dictionary<KeyValuePair<int,int>, KeyValuePair<int,int>> | ||
61 | LineMap; | ||
62 | // public ISponsor ScriptSponsor; | ||
63 | } | ||
64 | |||
65 | public class ScriptManager | ||
66 | { | ||
67 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
68 | |||
69 | #region Declares | ||
70 | |||
71 | private Thread scriptLoadUnloadThread; | ||
72 | private static Thread staticScriptLoadUnloadThread = null; | ||
73 | private Queue<LUStruct> LUQueue = new Queue<LUStruct>(); | ||
74 | private static bool PrivateThread; | ||
75 | private int LoadUnloadMaxQueueSize; | ||
76 | private Object scriptLock = new Object(); | ||
77 | private bool m_started = false; | ||
78 | private Dictionary<InstanceData, DetectParams[]> detparms = | ||
79 | new Dictionary<InstanceData, DetectParams[]>(); | ||
80 | |||
81 | // Load/Unload structure | ||
82 | private struct LUStruct | ||
83 | { | ||
84 | public uint localID; | ||
85 | public UUID itemID; | ||
86 | public string script; | ||
87 | public LUType Action; | ||
88 | public int startParam; | ||
89 | public bool postOnRez; | ||
90 | } | ||
91 | |||
92 | private enum LUType | ||
93 | { | ||
94 | Unknown = 0, | ||
95 | Load = 1, | ||
96 | Unload = 2 | ||
97 | } | ||
98 | |||
99 | public Dictionary<uint, Dictionary<UUID, InstanceData>> Scripts = | ||
100 | new Dictionary<uint, Dictionary<UUID, InstanceData>>(); | ||
101 | |||
102 | private Compiler LSLCompiler; | ||
103 | |||
104 | public Scene World | ||
105 | { | ||
106 | get { return m_scriptEngine.World; } | ||
107 | } | ||
108 | |||
109 | #endregion | ||
110 | |||
111 | public void Initialize() | ||
112 | { | ||
113 | // Create our compiler | ||
114 | LSLCompiler = new Compiler(m_scriptEngine); | ||
115 | } | ||
116 | |||
117 | public void _StartScript(uint localID, UUID itemID, string Script, | ||
118 | int startParam, bool postOnRez) | ||
119 | { | ||
120 | m_log.DebugFormat( | ||
121 | "[{0}]: ScriptManager StartScript: localID: {1}, itemID: {2}", | ||
122 | m_scriptEngine.ScriptEngineName, localID, itemID); | ||
123 | |||
124 | // We will initialize and start the script. | ||
125 | // It will be up to the script itself to hook up the correct events. | ||
126 | string CompiledScriptFile = String.Empty; | ||
127 | |||
128 | SceneObjectPart m_host = World.GetSceneObjectPart(localID); | ||
129 | |||
130 | if (null == m_host) | ||
131 | { | ||
132 | m_log.ErrorFormat( | ||
133 | "[{0}]: Could not find scene object part corresponding "+ | ||
134 | "to localID {1} to start script", | ||
135 | m_scriptEngine.ScriptEngineName, localID); | ||
136 | |||
137 | return; | ||
138 | } | ||
139 | |||
140 | UUID assetID = UUID.Zero; | ||
141 | TaskInventoryItem taskInventoryItem = new TaskInventoryItem(); | ||
142 | if (m_host.TaskInventory.TryGetValue(itemID, out taskInventoryItem)) | ||
143 | assetID = taskInventoryItem.AssetID; | ||
144 | |||
145 | ScenePresence presence = | ||
146 | World.GetScenePresence(taskInventoryItem.OwnerID); | ||
147 | |||
148 | CultureInfo USCulture = new CultureInfo("en-US"); | ||
149 | Thread.CurrentThread.CurrentCulture = USCulture; | ||
150 | |||
151 | try | ||
152 | { | ||
153 | // Compile (We assume LSL) | ||
154 | CompiledScriptFile = | ||
155 | (string)LSLCompiler.PerformScriptCompile(Script, | ||
156 | assetID.ToString(), taskInventoryItem.OwnerID); | ||
157 | |||
158 | if (presence != null && (!postOnRez)) | ||
159 | presence.ControllingClient.SendAgentAlertMessage( | ||
160 | "Compile successful", false); | ||
161 | |||
162 | m_log.InfoFormat("[SCRIPT]: Compiled assetID {0}: {1}", | ||
163 | assetID, CompiledScriptFile); | ||
164 | |||
165 | InstanceData id = new InstanceData(); | ||
166 | |||
167 | IScript CompiledScript; | ||
168 | CompiledScript = | ||
169 | m_scriptEngine.m_AppDomainManager.LoadScript( | ||
170 | CompiledScriptFile, out id.AppDomain); | ||
171 | //Register the sponsor | ||
172 | // ISponsor scriptSponsor = new ScriptSponsor(); | ||
173 | // ILease lease = (ILease)RemotingServices.GetLifetimeService(CompiledScript as MarshalByRefObject); | ||
174 | // lease.Register(scriptSponsor); | ||
175 | // id.ScriptSponsor = scriptSponsor; | ||
176 | |||
177 | id.LineMap = LSLCompiler.LineMap(); | ||
178 | id.Script = CompiledScript; | ||
179 | id.Source = Script; | ||
180 | id.StartParam = startParam; | ||
181 | id.State = "default"; | ||
182 | id.Running = true; | ||
183 | id.Disabled = false; | ||
184 | |||
185 | // Add it to our script memstruct | ||
186 | m_scriptEngine.m_ScriptManager.SetScript(localID, itemID, id); | ||
187 | |||
188 | id.Apis = new Dictionary<string, IScriptApi>(); | ||
189 | |||
190 | ApiManager am = new ApiManager(); | ||
191 | |||
192 | foreach (string api in am.GetApis()) | ||
193 | { | ||
194 | id.Apis[api] = am.CreateApi(api); | ||
195 | id.Apis[api].Initialize(m_scriptEngine, m_host, | ||
196 | localID, itemID); | ||
197 | } | ||
198 | |||
199 | foreach (KeyValuePair<string,IScriptApi> kv in id.Apis) | ||
200 | { | ||
201 | CompiledScript.InitApi(kv.Key, kv.Value); | ||
202 | } | ||
203 | |||
204 | // Fire the first start-event | ||
205 | int eventFlags = | ||
206 | m_scriptEngine.m_ScriptManager.GetStateEventFlags( | ||
207 | localID, itemID); | ||
208 | |||
209 | m_host.SetScriptEvents(itemID, eventFlags); | ||
210 | |||
211 | m_scriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
212 | localID, itemID, "state_entry", new DetectParams[0], | ||
213 | new object[] { }); | ||
214 | |||
215 | if (postOnRez) | ||
216 | { | ||
217 | m_scriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
218 | localID, itemID, "on_rez", new DetectParams[0], | ||
219 | new object[] { new LSL_Types.LSLInteger(startParam) }); | ||
220 | } | ||
221 | |||
222 | string[] warnings = LSLCompiler.GetWarnings(); | ||
223 | |||
224 | if (warnings != null && warnings.Length != 0) | ||
225 | { | ||
226 | if (presence != null && (!postOnRez)) | ||
227 | presence.ControllingClient.SendAgentAlertMessage( | ||
228 | "Script saved with warnings, check debug window!", | ||
229 | false); | ||
230 | |||
231 | foreach (string warning in warnings) | ||
232 | { | ||
233 | try | ||
234 | { | ||
235 | // DISPLAY WARNING INWORLD | ||
236 | string text = "Warning:\n" + warning; | ||
237 | if (text.Length > 1100) | ||
238 | text = text.Substring(0, 1099); | ||
239 | |||
240 | World.SimChat(Utils.StringToBytes(text), | ||
241 | ChatTypeEnum.DebugChannel, 2147483647, | ||
242 | m_host.AbsolutePosition, m_host.Name, m_host.UUID, | ||
243 | false); | ||
244 | } | ||
245 | catch (Exception e2) // LEGIT: User Scripting | ||
246 | { | ||
247 | m_log.Error("[" + | ||
248 | m_scriptEngine.ScriptEngineName + | ||
249 | "]: Error displaying warning in-world: " + | ||
250 | e2.ToString()); | ||
251 | m_log.Error("[" + | ||
252 | m_scriptEngine.ScriptEngineName + "]: " + | ||
253 | "Warning:\r\n" + | ||
254 | warning); | ||
255 | } | ||
256 | } | ||
257 | } | ||
258 | } | ||
259 | catch (Exception e) // LEGIT: User Scripting | ||
260 | { | ||
261 | if (presence != null && (!postOnRez)) | ||
262 | presence.ControllingClient.SendAgentAlertMessage( | ||
263 | "Script saved with errors, check debug window!", | ||
264 | false); | ||
265 | try | ||
266 | { | ||
267 | // DISPLAY ERROR INWORLD | ||
268 | string text = "Error compiling script:\n" + | ||
269 | e.Message.ToString(); | ||
270 | if (text.Length > 1100) | ||
271 | text = text.Substring(0, 1099); | ||
272 | |||
273 | World.SimChat(Utils.StringToBytes(text), | ||
274 | ChatTypeEnum.DebugChannel, 2147483647, | ||
275 | m_host.AbsolutePosition, m_host.Name, m_host.UUID, | ||
276 | false); | ||
277 | } | ||
278 | catch (Exception e2) // LEGIT: User Scripting | ||
279 | { | ||
280 | m_log.Error("[" + | ||
281 | m_scriptEngine.ScriptEngineName + | ||
282 | "]: Error displaying error in-world: " + | ||
283 | e2.ToString()); | ||
284 | m_log.Error("[" + | ||
285 | m_scriptEngine.ScriptEngineName + "]: " + | ||
286 | "Errormessage: Error compiling script:\r\n" + | ||
287 | e2.Message.ToString()); | ||
288 | } | ||
289 | } | ||
290 | } | ||
291 | |||
292 | public void _StopScript(uint localID, UUID itemID) | ||
293 | { | ||
294 | InstanceData id = GetScript(localID, itemID); | ||
295 | if (id == null) | ||
296 | return; | ||
297 | |||
298 | m_log.DebugFormat("[{0}]: Unloading script", | ||
299 | m_scriptEngine.ScriptEngineName); | ||
300 | |||
301 | // Stop long command on script | ||
302 | AsyncCommandManager.RemoveScript(m_scriptEngine, localID, itemID); | ||
303 | |||
304 | try | ||
305 | { | ||
306 | // Get AppDomain | ||
307 | // Tell script not to accept new requests | ||
308 | id.Running = false; | ||
309 | id.Disabled = true; | ||
310 | AppDomain ad = id.AppDomain; | ||
311 | |||
312 | // Remove from internal structure | ||
313 | RemoveScript(localID, itemID); | ||
314 | |||
315 | // Tell AppDomain that we have stopped script | ||
316 | m_scriptEngine.m_AppDomainManager.StopScript(ad); | ||
317 | } | ||
318 | catch (Exception e) // LEGIT: User Scripting | ||
319 | { | ||
320 | m_log.Error("[" + | ||
321 | m_scriptEngine.ScriptEngineName + | ||
322 | "]: Exception stopping script localID: " + | ||
323 | localID + " LLUID: " + itemID.ToString() + | ||
324 | ": " + e.ToString()); | ||
325 | } | ||
326 | } | ||
327 | |||
328 | public void ReadConfig() | ||
329 | { | ||
330 | // TODO: Requires sharing of all ScriptManagers to single thread | ||
331 | PrivateThread = true; | ||
332 | LoadUnloadMaxQueueSize = m_scriptEngine.ScriptConfigSource.GetInt( | ||
333 | "LoadUnloadMaxQueueSize", 100); | ||
334 | } | ||
335 | |||
336 | #region Object init/shutdown | ||
337 | |||
338 | public ScriptEngine m_scriptEngine; | ||
339 | |||
340 | public ScriptManager(ScriptEngine scriptEngine) | ||
341 | { | ||
342 | m_scriptEngine = scriptEngine; | ||
343 | } | ||
344 | |||
345 | public void Setup() | ||
346 | { | ||
347 | ReadConfig(); | ||
348 | Initialize(); | ||
349 | } | ||
350 | |||
351 | public void Start() | ||
352 | { | ||
353 | m_started = true; | ||
354 | |||
355 | |||
356 | AppDomain.CurrentDomain.AssemblyResolve += | ||
357 | new ResolveEventHandler(CurrentDomain_AssemblyResolve); | ||
358 | |||
359 | // | ||
360 | // CREATE THREAD | ||
361 | // Private or shared | ||
362 | // | ||
363 | if (PrivateThread) | ||
364 | { | ||
365 | // Assign one thread per region | ||
366 | //scriptLoadUnloadThread = StartScriptLoadUnloadThread(); | ||
367 | } | ||
368 | else | ||
369 | { | ||
370 | // Shared thread - make sure one exist, then assign it to the private | ||
371 | if (staticScriptLoadUnloadThread == null) | ||
372 | { | ||
373 | //staticScriptLoadUnloadThread = | ||
374 | // StartScriptLoadUnloadThread(); | ||
375 | } | ||
376 | scriptLoadUnloadThread = staticScriptLoadUnloadThread; | ||
377 | } | ||
378 | } | ||
379 | |||
380 | ~ScriptManager() | ||
381 | { | ||
382 | // Abort load/unload thread | ||
383 | try | ||
384 | { | ||
385 | if (scriptLoadUnloadThread != null && | ||
386 | scriptLoadUnloadThread.IsAlive == true) | ||
387 | { | ||
388 | scriptLoadUnloadThread.Abort(); | ||
389 | //scriptLoadUnloadThread.Join(); | ||
390 | } | ||
391 | } | ||
392 | catch | ||
393 | { | ||
394 | } | ||
395 | } | ||
396 | |||
397 | #endregion | ||
398 | |||
399 | #region Load / Unload scripts (Thread loop) | ||
400 | |||
401 | public void DoScriptLoadUnload() | ||
402 | { | ||
403 | if (!m_started) | ||
404 | return; | ||
405 | |||
406 | lock (LUQueue) | ||
407 | { | ||
408 | if (LUQueue.Count > 0) | ||
409 | { | ||
410 | LUStruct item = LUQueue.Dequeue(); | ||
411 | |||
412 | if (item.Action == LUType.Unload) | ||
413 | { | ||
414 | _StopScript(item.localID, item.itemID); | ||
415 | RemoveScript(item.localID, item.itemID); | ||
416 | } | ||
417 | else if (item.Action == LUType.Load) | ||
418 | { | ||
419 | m_log.DebugFormat("[{0}]: Loading script", | ||
420 | m_scriptEngine.ScriptEngineName); | ||
421 | _StartScript(item.localID, item.itemID, item.script, | ||
422 | item.startParam, item.postOnRez); | ||
423 | } | ||
424 | } | ||
425 | } | ||
426 | } | ||
427 | |||
428 | #endregion | ||
429 | |||
430 | #region Helper functions | ||
431 | |||
432 | private static Assembly CurrentDomain_AssemblyResolve( | ||
433 | object sender, ResolveEventArgs args) | ||
434 | { | ||
435 | return Assembly.GetExecutingAssembly().FullName == args.Name ? | ||
436 | Assembly.GetExecutingAssembly() : null; | ||
437 | } | ||
438 | |||
439 | #endregion | ||
440 | |||
441 | #region Start/Stop/Reset script | ||
442 | |||
443 | /// <summary> | ||
444 | /// Fetches, loads and hooks up a script to an objects events | ||
445 | /// </summary> | ||
446 | /// <param name="itemID"></param> | ||
447 | /// <param name="localID"></param> | ||
448 | public void StartScript(uint localID, UUID itemID, string Script, int startParam, bool postOnRez) | ||
449 | { | ||
450 | lock (LUQueue) | ||
451 | { | ||
452 | if ((LUQueue.Count >= LoadUnloadMaxQueueSize) && m_started) | ||
453 | { | ||
454 | m_log.Error("[" + | ||
455 | m_scriptEngine.ScriptEngineName + | ||
456 | "]: ERROR: Load/unload queue item count is at " + | ||
457 | LUQueue.Count + | ||
458 | ". Config variable \"LoadUnloadMaxQueueSize\" "+ | ||
459 | "is set to " + LoadUnloadMaxQueueSize + | ||
460 | ", so ignoring new script."); | ||
461 | |||
462 | return; | ||
463 | } | ||
464 | |||
465 | LUStruct ls = new LUStruct(); | ||
466 | ls.localID = localID; | ||
467 | ls.itemID = itemID; | ||
468 | ls.script = Script; | ||
469 | ls.Action = LUType.Load; | ||
470 | ls.startParam = startParam; | ||
471 | ls.postOnRez = postOnRez; | ||
472 | LUQueue.Enqueue(ls); | ||
473 | } | ||
474 | } | ||
475 | |||
476 | /// <summary> | ||
477 | /// Disables and unloads a script | ||
478 | /// </summary> | ||
479 | /// <param name="localID"></param> | ||
480 | /// <param name="itemID"></param> | ||
481 | public void StopScript(uint localID, UUID itemID) | ||
482 | { | ||
483 | LUStruct ls = new LUStruct(); | ||
484 | ls.localID = localID; | ||
485 | ls.itemID = itemID; | ||
486 | ls.Action = LUType.Unload; | ||
487 | ls.startParam = 0; | ||
488 | ls.postOnRez = false; | ||
489 | lock (LUQueue) | ||
490 | { | ||
491 | LUQueue.Enqueue(ls); | ||
492 | } | ||
493 | } | ||
494 | |||
495 | #endregion | ||
496 | |||
497 | #region Perform event execution in script | ||
498 | |||
499 | // Execute a LL-event-function in Script | ||
500 | internal void ExecuteEvent(uint localID, UUID itemID, | ||
501 | string FunctionName, DetectParams[] qParams, object[] args) | ||
502 | { | ||
503 | int ExeStage=0; // ;^) Ewe Loon, for debuging | ||
504 | InstanceData id=null; | ||
505 | try // ;^) Ewe Loon,fix | ||
506 | { // ;^) Ewe Loon,fix | ||
507 | ExeStage = 1; // ;^) Ewe Loon, for debuging | ||
508 | id = GetScript(localID, itemID); | ||
509 | if (id == null) | ||
510 | return; | ||
511 | ExeStage = 2; // ;^) Ewe Loon, for debuging | ||
512 | if (qParams.Length>0) // ;^) Ewe Loon,fix | ||
513 | detparms[id] = qParams; | ||
514 | ExeStage = 3; // ;^) Ewe Loon, for debuging | ||
515 | if (id.Running) | ||
516 | id.Script.ExecuteEvent(id.State, FunctionName, args); | ||
517 | ExeStage = 4; // ;^) Ewe Loon, for debuging | ||
518 | if (qParams.Length>0) // ;^) Ewe Loon,fix | ||
519 | detparms.Remove(id); | ||
520 | ExeStage = 5; // ;^) Ewe Loon, for debuging | ||
521 | } | ||
522 | catch (Exception e) // ;^) Ewe Loon, From here down tis fix | ||
523 | { | ||
524 | if ((ExeStage == 3)&&(qParams.Length>0)) | ||
525 | detparms.Remove(id); | ||
526 | SceneObjectPart ob = m_scriptEngine.World.GetSceneObjectPart(localID); | ||
527 | m_log.InfoFormat("[Script Error] ,{0},{1},@{2},{3},{4},{5}", ob.Name , FunctionName, ExeStage, e.Message, qParams.Length, detparms.Count); | ||
528 | if (ExeStage != 2) throw e; | ||
529 | } | ||
530 | } | ||
531 | |||
532 | public uint GetLocalID(UUID itemID) | ||
533 | { | ||
534 | foreach (KeyValuePair<uint, Dictionary<UUID, InstanceData> > k | ||
535 | in Scripts) | ||
536 | { | ||
537 | if (k.Value.ContainsKey(itemID)) | ||
538 | return k.Key; | ||
539 | } | ||
540 | return 0; | ||
541 | } | ||
542 | |||
543 | public int GetStateEventFlags(uint localID, UUID itemID) | ||
544 | { | ||
545 | try | ||
546 | { | ||
547 | InstanceData id = GetScript(localID, itemID); | ||
548 | if (id == null) | ||
549 | { | ||
550 | return 0; | ||
551 | } | ||
552 | int evflags = id.Script.GetStateEventFlags(id.State); | ||
553 | |||
554 | return (int)evflags; | ||
555 | } | ||
556 | catch (Exception) | ||
557 | { | ||
558 | } | ||
559 | |||
560 | return 0; | ||
561 | } | ||
562 | |||
563 | #endregion | ||
564 | |||
565 | #region Internal functions to keep track of script | ||
566 | |||
567 | public List<UUID> GetScriptKeys(uint localID) | ||
568 | { | ||
569 | if (Scripts.ContainsKey(localID) == false) | ||
570 | return new List<UUID>(); | ||
571 | |||
572 | Dictionary<UUID, InstanceData> Obj; | ||
573 | Scripts.TryGetValue(localID, out Obj); | ||
574 | |||
575 | return new List<UUID>(Obj.Keys); | ||
576 | } | ||
577 | |||
578 | public InstanceData GetScript(uint localID, UUID itemID) | ||
579 | { | ||
580 | lock (scriptLock) | ||
581 | { | ||
582 | InstanceData id = null; | ||
583 | |||
584 | if (Scripts.ContainsKey(localID) == false) | ||
585 | return null; | ||
586 | |||
587 | Dictionary<UUID, InstanceData> Obj; | ||
588 | Scripts.TryGetValue(localID, out Obj); | ||
589 | if (Obj==null) return null; | ||
590 | if (Obj.ContainsKey(itemID) == false) | ||
591 | return null; | ||
592 | |||
593 | // Get script | ||
594 | Obj.TryGetValue(itemID, out id); | ||
595 | return id; | ||
596 | } | ||
597 | } | ||
598 | |||
599 | public void SetScript(uint localID, UUID itemID, InstanceData id) | ||
600 | { | ||
601 | lock (scriptLock) | ||
602 | { | ||
603 | // Create object if it doesn't exist | ||
604 | if (Scripts.ContainsKey(localID) == false) | ||
605 | { | ||
606 | Scripts.Add(localID, new Dictionary<UUID, InstanceData>()); | ||
607 | } | ||
608 | |||
609 | // Delete script if it exists | ||
610 | Dictionary<UUID, InstanceData> Obj; | ||
611 | Scripts.TryGetValue(localID, out Obj); | ||
612 | if (Obj.ContainsKey(itemID) == true) | ||
613 | Obj.Remove(itemID); | ||
614 | |||
615 | // Add to object | ||
616 | Obj.Add(itemID, id); | ||
617 | } | ||
618 | } | ||
619 | |||
620 | public void RemoveScript(uint localID, UUID itemID) | ||
621 | { | ||
622 | if (localID == 0) | ||
623 | localID = GetLocalID(itemID); | ||
624 | |||
625 | // Don't have that object? | ||
626 | if (Scripts.ContainsKey(localID) == false) | ||
627 | return; | ||
628 | |||
629 | // Delete script if it exists | ||
630 | Dictionary<UUID, InstanceData> Obj; | ||
631 | Scripts.TryGetValue(localID, out Obj); | ||
632 | if (Obj.ContainsKey(itemID) == true) | ||
633 | Obj.Remove(itemID); | ||
634 | } | ||
635 | |||
636 | #endregion | ||
637 | |||
638 | public void ResetScript(uint localID, UUID itemID) | ||
639 | { | ||
640 | InstanceData id = GetScript(localID, itemID); | ||
641 | string script = id.Source; | ||
642 | StopScript(localID, itemID); | ||
643 | SceneObjectPart part = World.GetSceneObjectPart(localID); | ||
644 | part.Inventory.GetInventoryItem(itemID).PermsMask = 0; | ||
645 | part.Inventory.GetInventoryItem(itemID).PermsGranter = UUID.Zero; | ||
646 | StartScript(localID, itemID, script, id.StartParam, false); | ||
647 | } | ||
648 | |||
649 | #region Script serialization/deserialization | ||
650 | |||
651 | public void GetSerializedScript(uint localID, UUID itemID) | ||
652 | { | ||
653 | // Serialize the script and return it | ||
654 | // Should not be a problem | ||
655 | FileStream fs = File.Create("SERIALIZED_SCRIPT_" + itemID); | ||
656 | BinaryFormatter b = new BinaryFormatter(); | ||
657 | b.Serialize(fs, GetScript(localID, itemID)); | ||
658 | fs.Close(); | ||
659 | } | ||
660 | |||
661 | public void PutSerializedScript(uint localID, UUID itemID) | ||
662 | { | ||
663 | // Deserialize the script and inject it into an AppDomain | ||
664 | |||
665 | // How to inject into an AppDomain? | ||
666 | } | ||
667 | |||
668 | #endregion | ||
669 | |||
670 | public DetectParams[] GetDetectParams(InstanceData id) | ||
671 | { | ||
672 | if (detparms.ContainsKey(id)) | ||
673 | return detparms[id]; | ||
674 | |||
675 | return null; | ||
676 | } | ||
677 | |||
678 | public int GetStartParameter(UUID itemID) | ||
679 | { | ||
680 | uint localID = GetLocalID(itemID); | ||
681 | InstanceData id = GetScript(localID, itemID); | ||
682 | |||
683 | if (id == null) | ||
684 | return 0; | ||
685 | |||
686 | return id.StartParam; | ||
687 | } | ||
688 | |||
689 | public IScriptApi GetApi(UUID itemID, string name) | ||
690 | { | ||
691 | uint localID = GetLocalID(itemID); | ||
692 | |||
693 | InstanceData id = GetScript(localID, itemID); | ||
694 | if (id == null) | ||
695 | return null; | ||
696 | |||
697 | if (id.Apis.ContainsKey(name)) | ||
698 | return id.Apis[name]; | ||
699 | |||
700 | return null; | ||
701 | } | ||
702 | } | ||
703 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs index 1607d34..9d97cb2 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/AsyncCommandManager.cs | |||
@@ -137,11 +137,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
137 | if (cmdHandlerThread == null) | 137 | if (cmdHandlerThread == null) |
138 | { | 138 | { |
139 | // Start the thread that will be doing the work | 139 | // Start the thread that will be doing the work |
140 | cmdHandlerThread = new Thread(CmdHandlerThreadLoop); | 140 | cmdHandlerThread = Watchdog.StartThread(CmdHandlerThreadLoop, "AsyncLSLCmdHandlerThread", ThreadPriority.Normal, true); |
141 | cmdHandlerThread.Name = "AsyncLSLCmdHandlerThread"; | ||
142 | cmdHandlerThread.Priority = ThreadPriority.BelowNormal; | ||
143 | cmdHandlerThread.IsBackground = true; | ||
144 | cmdHandlerThread.Start(); | ||
145 | } | 141 | } |
146 | } | 142 | } |
147 | 143 | ||
@@ -185,6 +181,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
185 | Thread.Sleep(cmdHandlerThreadCycleSleepms); | 181 | Thread.Sleep(cmdHandlerThreadCycleSleepms); |
186 | 182 | ||
187 | DoOneCmdHandlerPass(); | 183 | DoOneCmdHandlerPass(); |
184 | |||
185 | Watchdog.UpdateThread(); | ||
188 | } | 186 | } |
189 | } | 187 | } |
190 | catch | 188 | catch |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 1dc20ff..0f01c36 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -1267,12 +1267,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1267 | protected void SetScale(SceneObjectPart part, LSL_Vector scale) | 1267 | protected void SetScale(SceneObjectPart part, LSL_Vector scale) |
1268 | { | 1268 | { |
1269 | // TODO: this needs to trigger a persistance save as well | 1269 | // TODO: this needs to trigger a persistance save as well |
1270 | |||
1271 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) | 1270 | if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) |
1272 | return; | 1271 | return; |
1273 | 1272 | if (scale.x < 0.01) | |
1274 | if (scale.x < 0.01 || scale.y < 0.01 || scale.z < 0.01) | 1273 | scale.x = 0.01; |
1275 | return; | 1274 | if (scale.y < 0.01) |
1275 | scale.y = 0.01; | ||
1276 | if (scale.z < 0.01) | ||
1277 | scale.z = 0.01; | ||
1276 | 1278 | ||
1277 | if (part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical) | 1279 | if (part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical) |
1278 | { | 1280 | { |
@@ -1283,12 +1285,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
1283 | if (scale.z > World.m_maxPhys) | 1285 | if (scale.z > World.m_maxPhys) |
1284 | scale.z = World.m_maxPhys; | 1286 | scale.z = World.m_maxPhys; |
1285 | } | 1287 | } |
1288 | |||
1286 | if (scale.x > World.m_maxNonphys) | 1289 | if (scale.x > World.m_maxNonphys) |
1287 | scale.x = World.m_maxNonphys; | 1290 | scale.x = World.m_maxNonphys; |
1288 | if (scale.y > World.m_maxNonphys) | 1291 | if (scale.y > World.m_maxNonphys) |
1289 | scale.y = World.m_maxNonphys; | 1292 | scale.y = World.m_maxNonphys; |
1290 | if (scale.z > World.m_maxNonphys) | 1293 | if (scale.z > World.m_maxNonphys) |
1291 | scale.z = World.m_maxNonphys; | 1294 | scale.z = World.m_maxNonphys; |
1295 | |||
1292 | Vector3 tmp = part.Scale; | 1296 | Vector3 tmp = part.Scale; |
1293 | tmp.X = (float)scale.x; | 1297 | tmp.X = (float)scale.x; |
1294 | tmp.Y = (float)scale.y; | 1298 | tmp.Y = (float)scale.y; |
@@ -2043,7 +2047,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2043 | if (local != 0) | 2047 | if (local != 0) |
2044 | force *= llGetRot(); | 2048 | force *= llGetRot(); |
2045 | 2049 | ||
2046 | m_host.ParentGroup.RootPart.SetForce(new PhysicsVector((float)force.x, (float)force.y, (float)force.z)); | 2050 | m_host.ParentGroup.RootPart.SetForce(new Vector3((float)force.x, (float)force.y, (float)force.z)); |
2047 | } | 2051 | } |
2048 | } | 2052 | } |
2049 | } | 2053 | } |
@@ -2058,7 +2062,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2058 | { | 2062 | { |
2059 | if (!m_host.ParentGroup.IsDeleted) | 2063 | if (!m_host.ParentGroup.IsDeleted) |
2060 | { | 2064 | { |
2061 | PhysicsVector tmpForce = m_host.ParentGroup.RootPart.GetForce(); | 2065 | Vector3 tmpForce = m_host.ParentGroup.RootPart.GetForce(); |
2062 | force.x = tmpForce.X; | 2066 | force.x = tmpForce.X; |
2063 | force.y = tmpForce.Y; | 2067 | force.y = tmpForce.Y; |
2064 | force.z = tmpForce.Z; | 2068 | force.z = tmpForce.Z; |
@@ -4180,7 +4184,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4180 | { | 4184 | { |
4181 | applied_linear_impulse *= m_host.GetWorldRotation(); | 4185 | applied_linear_impulse *= m_host.GetWorldRotation(); |
4182 | } | 4186 | } |
4183 | pusheeav.PhysicsActor.AddForce(new PhysicsVector(applied_linear_impulse.X, applied_linear_impulse.Y, applied_linear_impulse.Z), true); | 4187 | pusheeav.PhysicsActor.AddForce(applied_linear_impulse, true); |
4184 | } | 4188 | } |
4185 | } | 4189 | } |
4186 | } | 4190 | } |
@@ -6088,7 +6092,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
6088 | if (!m_host.ParentGroup.IsDeleted) | 6092 | if (!m_host.ParentGroup.IsDeleted) |
6089 | { | 6093 | { |
6090 | m_host.ParentGroup.RootPart.SetVehicleVectorParam(param, | 6094 | m_host.ParentGroup.RootPart.SetVehicleVectorParam(param, |
6091 | new PhysicsVector((float)vec.x, (float)vec.y, (float)vec.z)); | 6095 | new Vector3((float)vec.x, (float)vec.y, (float)vec.z)); |
6092 | } | 6096 | } |
6093 | } | 6097 | } |
6094 | } | 6098 | } |
@@ -7227,13 +7231,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
7227 | public LSL_Integer llGetNumberOfPrims() | 7231 | public LSL_Integer llGetNumberOfPrims() |
7228 | { | 7232 | { |
7229 | m_host.AddScriptLPS(1); | 7233 | m_host.AddScriptLPS(1); |
7230 | List<ScenePresence> presences = World.GetScenePresences(); | 7234 | ScenePresence[] presences = World.GetScenePresences(); |
7231 | if (presences.Count == 0) | 7235 | if (presences.Length == 0) |
7232 | return 0; | 7236 | return 0; |
7233 | 7237 | ||
7234 | int avatarCount = 0; | 7238 | int avatarCount = 0; |
7235 | foreach (ScenePresence presence in presences) | 7239 | for (int i = 0; i < presences.Length; i++) |
7236 | { | 7240 | { |
7241 | ScenePresence presence = presences[i]; | ||
7242 | |||
7237 | if (!presence.IsChildAgent && presence.ParentID != 0) | 7243 | if (!presence.IsChildAgent && presence.ParentID != 0) |
7238 | { | 7244 | { |
7239 | if (m_host.ParentGroup.HasChildPrim(presence.ParentID)) | 7245 | if (m_host.ParentGroup.HasChildPrim(presence.ParentID)) |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs index a09c8db..b75a2e4 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs | |||
@@ -404,7 +404,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
404 | 404 | ||
405 | private List<SensedEntity> doAgentSensor(SenseRepeatClass ts) | 405 | private List<SensedEntity> doAgentSensor(SenseRepeatClass ts) |
406 | { | 406 | { |
407 | List<ScenePresence> Presences; | 407 | List<ScenePresence> presences; |
408 | List<SensedEntity> sensedEntities = new List<SensedEntity>(); | 408 | List<SensedEntity> sensedEntities = new List<SensedEntity>(); |
409 | 409 | ||
410 | // If this is an avatar sense by key try to get them directly | 410 | // If this is an avatar sense by key try to get them directly |
@@ -414,16 +414,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
414 | ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID); | 414 | ScenePresence p = m_CmdManager.m_ScriptEngine.World.GetScenePresence(ts.keyID); |
415 | if (p == null) | 415 | if (p == null) |
416 | return sensedEntities; | 416 | return sensedEntities; |
417 | Presences = new List<ScenePresence>(); | 417 | presences = new List<ScenePresence>(); |
418 | Presences.Add(p); | 418 | presences.Add(p); |
419 | } | 419 | } |
420 | else | 420 | else |
421 | { | 421 | { |
422 | Presences = m_CmdManager.m_ScriptEngine.World.GetScenePresences(); | 422 | presences = new List<ScenePresence>(m_CmdManager.m_ScriptEngine.World.GetScenePresences()); |
423 | } | 423 | } |
424 | 424 | ||
425 | // If nobody about quit fast | 425 | // If nobody about quit fast |
426 | if (Presences.Count == 0) | 426 | if (presences.Count == 0) |
427 | return sensedEntities; | 427 | return sensedEntities; |
428 | 428 | ||
429 | SceneObjectPart SensePoint = ts.host; | 429 | SceneObjectPart SensePoint = ts.host; |
@@ -440,8 +440,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
440 | Vector3 toRegionPos; | 440 | Vector3 toRegionPos; |
441 | double dis; | 441 | double dis; |
442 | 442 | ||
443 | foreach (ScenePresence presence in Presences) | 443 | for (int i = 0; i < presences.Count; i++) |
444 | { | 444 | { |
445 | ScenePresence presence = presences[i]; | ||
445 | bool keep = true; | 446 | bool keep = true; |
446 | 447 | ||
447 | if (presence.IsDeleted) | 448 | if (presence.IsDeleted) |
@@ -515,16 +516,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins | |||
515 | { | 516 | { |
516 | List<Object> data = new List<Object>(); | 517 | List<Object> data = new List<Object>(); |
517 | 518 | ||
518 | foreach (SenseRepeatClass ts in SenseRepeaters) | 519 | lock (SenseRepeatListLock) |
519 | { | 520 | { |
520 | if (ts.itemID == itemID) | 521 | foreach (SenseRepeatClass ts in SenseRepeaters) |
521 | { | 522 | { |
522 | data.Add(ts.interval); | 523 | if (ts.itemID == itemID) |
523 | data.Add(ts.name); | 524 | { |
524 | data.Add(ts.keyID); | 525 | data.Add(ts.interval); |
525 | data.Add(ts.type); | 526 | data.Add(ts.name); |
526 | data.Add(ts.range); | 527 | data.Add(ts.keyID); |
527 | data.Add(ts.arc); | 528 | data.Add(ts.type); |
529 | data.Add(ts.range); | ||
530 | data.Add(ts.arc); | ||
531 | } | ||
528 | } | 532 | } |
529 | } | 533 | } |
530 | return data.ToArray(); | 534 | return data.ToArray(); |
diff --git a/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs b/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs index d7c39a3..704b74f 100644 --- a/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs +++ b/OpenSim/Region/UserStatistics/ActiveConnectionsAJAX.cs | |||
@@ -68,11 +68,11 @@ namespace OpenSim.Region.UserStatistics | |||
68 | HTMLUtil.OL_O(ref output, ""); | 68 | HTMLUtil.OL_O(ref output, ""); |
69 | foreach (Scene scene in all_scenes) | 69 | foreach (Scene scene in all_scenes) |
70 | { | 70 | { |
71 | List<ScenePresence> avatarInScene = scene.GetScenePresences(); | 71 | ScenePresence[] avatarInScene = scene.GetScenePresences(); |
72 | 72 | ||
73 | HTMLUtil.LI_O(ref output, ""); | 73 | HTMLUtil.LI_O(ref output, String.Empty); |
74 | output.Append(scene.RegionInfo.RegionName); | 74 | output.Append(scene.RegionInfo.RegionName); |
75 | HTMLUtil.OL_O(ref output, ""); | 75 | HTMLUtil.OL_O(ref output, String.Empty); |
76 | foreach (ScenePresence av in avatarInScene) | 76 | foreach (ScenePresence av in avatarInScene) |
77 | { | 77 | { |
78 | Dictionary<string,string> queues = new Dictionary<string, string>(); | 78 | Dictionary<string,string> queues = new Dictionary<string, string>(); |
@@ -81,7 +81,7 @@ namespace OpenSim.Region.UserStatistics | |||
81 | IStatsCollector isClient = (IStatsCollector) av.ControllingClient; | 81 | IStatsCollector isClient = (IStatsCollector) av.ControllingClient; |
82 | queues = decodeQueueReport(isClient.Report()); | 82 | queues = decodeQueueReport(isClient.Report()); |
83 | } | 83 | } |
84 | HTMLUtil.LI_O(ref output, ""); | 84 | HTMLUtil.LI_O(ref output, String.Empty); |
85 | output.Append(av.Name); | 85 | output.Append(av.Name); |
86 | output.Append(" "); | 86 | output.Append(" "); |
87 | output.Append((av.IsChildAgent ? "Child" : "Root")); | 87 | output.Append((av.IsChildAgent ? "Child" : "Root")); |
@@ -96,12 +96,12 @@ namespace OpenSim.Region.UserStatistics | |||
96 | (int) av.AbsolutePosition.Z)); | 96 | (int) av.AbsolutePosition.Z)); |
97 | } | 97 | } |
98 | Dictionary<string, int> throttles = DecodeClientThrottles(av.ControllingClient.GetThrottlesPacked(1)); | 98 | Dictionary<string, int> throttles = DecodeClientThrottles(av.ControllingClient.GetThrottlesPacked(1)); |
99 | 99 | ||
100 | HTMLUtil.UL_O(ref output, ""); | 100 | HTMLUtil.UL_O(ref output, String.Empty); |
101 | 101 | ||
102 | foreach (string throttlename in throttles.Keys) | 102 | foreach (string throttlename in throttles.Keys) |
103 | { | 103 | { |
104 | HTMLUtil.LI_O(ref output, ""); | 104 | HTMLUtil.LI_O(ref output, String.Empty); |
105 | output.Append(throttlename); | 105 | output.Append(throttlename); |
106 | output.Append(":"); | 106 | output.Append(":"); |
107 | output.Append(throttles[throttlename].ToString()); | 107 | output.Append(throttles[throttlename].ToString()); |