diff options
Diffstat (limited to 'OpenSim/Region')
66 files changed, 1645 insertions, 1355 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index f580e5a..fad250b 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -2801,6 +2801,48 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2801 | SendAgentGroupDataUpdate(AgentId,GroupMembership); | 2801 | SendAgentGroupDataUpdate(AgentId,GroupMembership); |
2802 | } | 2802 | } |
2803 | 2803 | ||
2804 | public void SendSelectedPartsProprieties(List<ISceneEntity> parts) | ||
2805 | { | ||
2806 | // udp part | ||
2807 | ObjectPropertiesPacket packet = | ||
2808 | (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties); | ||
2809 | ObjectPropertiesPacket.ObjectDataBlock[] ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[parts.Count]; | ||
2810 | |||
2811 | int i = 0; | ||
2812 | foreach(SceneObjectPart sop in parts) | ||
2813 | ObjectData[i++] = CreateObjectPropertiesBlock(sop); | ||
2814 | |||
2815 | packet.ObjectData = ObjectData; | ||
2816 | packet.Header.Zerocoded = true; | ||
2817 | // udp send splits this mega packets correctly | ||
2818 | // mb later will avoid that to reduce gc stress | ||
2819 | OutPacket(packet, ThrottleOutPacketType.Task, true); | ||
2820 | |||
2821 | // caps physics part | ||
2822 | IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>(); | ||
2823 | if(eq == null) | ||
2824 | return; | ||
2825 | |||
2826 | OSDArray array = new OSDArray(); | ||
2827 | foreach(SceneObjectPart sop in parts) | ||
2828 | { | ||
2829 | OSDMap physinfo = new OSDMap(6); | ||
2830 | physinfo["LocalID"] = sop.LocalId; | ||
2831 | physinfo["Density"] = sop.Density; | ||
2832 | physinfo["Friction"] = sop.Friction; | ||
2833 | physinfo["GravityMultiplier"] = sop.GravityModifier; | ||
2834 | physinfo["Restitution"] = sop.Restitution; | ||
2835 | physinfo["PhysicsShapeType"] = (int)sop.PhysicsShapeType; | ||
2836 | array.Add(physinfo); | ||
2837 | } | ||
2838 | |||
2839 | OSDMap llsdBody = new OSDMap(1); | ||
2840 | llsdBody.Add("ObjectData", array); | ||
2841 | |||
2842 | eq.Enqueue(BuildEvent("ObjectPhysicsProperties", llsdBody),AgentId); | ||
2843 | } | ||
2844 | |||
2845 | |||
2804 | public void SendPartPhysicsProprieties(ISceneEntity entity) | 2846 | public void SendPartPhysicsProprieties(ISceneEntity entity) |
2805 | { | 2847 | { |
2806 | SceneObjectPart part = (SceneObjectPart)entity; | 2848 | SceneObjectPart part = (SceneObjectPart)entity; |
@@ -2882,18 +2924,24 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
2882 | 2924 | ||
2883 | public void SendAsset(AssetRequestToClient req) | 2925 | public void SendAsset(AssetRequestToClient req) |
2884 | { | 2926 | { |
2927 | if (req.AssetInf == null) | ||
2928 | { | ||
2929 | m_log.ErrorFormat("{0} Cannot send asset {1} ({2}), asset is null", | ||
2930 | LogHeader); | ||
2931 | return; | ||
2932 | } | ||
2933 | |||
2885 | if (req.AssetInf.Data == null) | 2934 | if (req.AssetInf.Data == null) |
2886 | { | 2935 | { |
2887 | m_log.ErrorFormat("{0} Cannot send asset {1} ({2}), asset data is null", | 2936 | m_log.ErrorFormat("{0} Cannot send asset {1} ({2}), asset data is null", |
2888 | LogHeader, req.AssetInf.ID, req.AssetInf.Metadata.ContentType); | 2937 | LogHeader, req.AssetInf.ID, req.AssetInf.Metadata.ContentType); |
2889 | return; | 2938 | return; |
2890 | } | 2939 | } |
2940 | |||
2891 | int WearableOut = 0; | 2941 | int WearableOut = 0; |
2892 | bool isWearable = false; | 2942 | bool isWearable = false; |
2893 | 2943 | ||
2894 | if (req.AssetInf != null) | 2944 | isWearable = ((AssetType) req.AssetInf.Type == |
2895 | isWearable = | ||
2896 | ((AssetType) req.AssetInf.Type == | ||
2897 | AssetType.Bodypart || (AssetType) req.AssetInf.Type == AssetType.Clothing); | 2945 | AssetType.Bodypart || (AssetType) req.AssetInf.Type == AssetType.Clothing); |
2898 | 2946 | ||
2899 | 2947 | ||
@@ -3013,7 +3061,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3013 | reply.Data.ParcelID = parcelID; | 3061 | reply.Data.ParcelID = parcelID; |
3014 | reply.Data.OwnerID = land.OwnerID; | 3062 | reply.Data.OwnerID = land.OwnerID; |
3015 | reply.Data.Name = Utils.StringToBytes(land.Name); | 3063 | reply.Data.Name = Utils.StringToBytes(land.Name); |
3016 | if (land != null && land.Description != null && land.Description != String.Empty) | 3064 | if (land.Description != null && land.Description != String.Empty) |
3017 | reply.Data.Desc = Utils.StringToBytes(land.Description.Substring(0, land.Description.Length > 254 ? 254: land.Description.Length)); | 3065 | reply.Data.Desc = Utils.StringToBytes(land.Description.Substring(0, land.Description.Length > 254 ? 254: land.Description.Length)); |
3018 | else | 3066 | else |
3019 | reply.Data.Desc = new Byte[0]; | 3067 | reply.Data.Desc = new Byte[0]; |
@@ -4221,46 +4269,42 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4221 | 4269 | ||
4222 | if (!canUseImproved && !canUseCompressed) | 4270 | if (!canUseImproved && !canUseCompressed) |
4223 | { | 4271 | { |
4272 | ObjectUpdatePacket.ObjectDataBlock ablock; | ||
4224 | if (update.Entity is ScenePresence) | 4273 | if (update.Entity is ScenePresence) |
4225 | { | 4274 | ablock = CreateAvatarUpdateBlock((ScenePresence)update.Entity); |
4226 | ObjectUpdatePacket.ObjectDataBlock ablock = | ||
4227 | CreateAvatarUpdateBlock((ScenePresence)update.Entity); | ||
4228 | objectUpdateBlocks.Value.Add(ablock); | ||
4229 | maxUpdatesBytes -= ablock.Length; | ||
4230 | } | ||
4231 | else | 4275 | else |
4232 | { | 4276 | ablock = CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId); |
4233 | ObjectUpdatePacket.ObjectDataBlock ablock = | 4277 | objectUpdateBlocks.Value.Add(ablock); |
4234 | CreatePrimUpdateBlock((SceneObjectPart)update.Entity, this.m_agentId); | 4278 | objectUpdates.Value.Add(update); |
4235 | objectUpdateBlocks.Value.Add(ablock); | 4279 | maxUpdatesBytes -= ablock.Length; |
4236 | maxUpdatesBytes -= ablock.Length; | 4280 | |
4237 | } | ||
4238 | } | 4281 | } |
4239 | else if (!canUseImproved) | 4282 | else if (!canUseImproved) |
4240 | { | 4283 | { |
4241 | ObjectUpdateCompressedPacket.ObjectDataBlock ablock = | 4284 | ObjectUpdateCompressedPacket.ObjectDataBlock ablock = |
4242 | CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags); | 4285 | CreateCompressedUpdateBlock((SceneObjectPart)update.Entity, updateFlags); |
4243 | compressedUpdateBlocks.Value.Add(ablock); | 4286 | compressedUpdateBlocks.Value.Add(ablock); |
4287 | compressedUpdates.Value.Add(update); | ||
4244 | maxUpdatesBytes -= ablock.Length; | 4288 | maxUpdatesBytes -= ablock.Length; |
4245 | } | 4289 | } |
4246 | else | 4290 | else |
4247 | { | 4291 | { |
4292 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock ablock; | ||
4248 | if (update.Entity is ScenePresence) | 4293 | if (update.Entity is ScenePresence) |
4249 | { | 4294 | { |
4250 | // ALL presence updates go into a special list | 4295 | // ALL presence updates go into a special list |
4251 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock ablock = | 4296 | ablock = CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); |
4252 | CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); | ||
4253 | terseAgentUpdateBlocks.Value.Add(ablock); | 4297 | terseAgentUpdateBlocks.Value.Add(ablock); |
4254 | maxUpdatesBytes -= ablock.Length; | 4298 | terseAgentUpdates.Value.Add(update); |
4255 | } | 4299 | } |
4256 | else | 4300 | else |
4257 | { | 4301 | { |
4258 | // Everything else goes here | 4302 | // Everything else goes here |
4259 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock ablock = | 4303 | ablock = CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); |
4260 | CreateImprovedTerseBlock(update.Entity, updateFlags.HasFlag(PrimUpdateFlags.Textures)); | ||
4261 | terseUpdateBlocks.Value.Add(ablock); | 4304 | terseUpdateBlocks.Value.Add(ablock); |
4262 | maxUpdatesBytes -= ablock.Length; | 4305 | terseUpdates.Value.Add(update); |
4263 | } | 4306 | } |
4307 | maxUpdatesBytes -= ablock.Length; | ||
4264 | } | 4308 | } |
4265 | 4309 | ||
4266 | #endregion Block Construction | 4310 | #endregion Block Construction |
@@ -4290,7 +4334,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4290 | for (int i = 0; i < blocks.Count; i++) | 4334 | for (int i = 0; i < blocks.Count; i++) |
4291 | packet.ObjectData[i] = blocks[i]; | 4335 | packet.ObjectData[i] = blocks[i]; |
4292 | 4336 | ||
4293 | OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseUpdates.Value, oPacket); }); | 4337 | OutPacket(packet, ThrottleOutPacketType.Unknown, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(terseAgentUpdates.Value, oPacket); }); |
4294 | } | 4338 | } |
4295 | 4339 | ||
4296 | if (objectUpdateBlocks.IsValueCreated) | 4340 | if (objectUpdateBlocks.IsValueCreated) |
@@ -4305,7 +4349,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4305 | for (int i = 0; i < blocks.Count; i++) | 4349 | for (int i = 0; i < blocks.Count; i++) |
4306 | packet.ObjectData[i] = blocks[i]; | 4350 | packet.ObjectData[i] = blocks[i]; |
4307 | 4351 | ||
4308 | OutPacket(packet, ThrottleOutPacketType.Task, true); | 4352 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(objectUpdates.Value, oPacket); }); |
4309 | } | 4353 | } |
4310 | 4354 | ||
4311 | if (compressedUpdateBlocks.IsValueCreated) | 4355 | if (compressedUpdateBlocks.IsValueCreated) |
@@ -4320,7 +4364,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4320 | for (int i = 0; i < blocks.Count; i++) | 4364 | for (int i = 0; i < blocks.Count; i++) |
4321 | packet.ObjectData[i] = blocks[i]; | 4365 | packet.ObjectData[i] = blocks[i]; |
4322 | 4366 | ||
4323 | OutPacket(packet, ThrottleOutPacketType.Task, true); | 4367 | OutPacket(packet, ThrottleOutPacketType.Task, true, delegate(OutgoingPacket oPacket) { ResendPrimUpdates(compressedUpdates.Value, oPacket); }); |
4324 | } | 4368 | } |
4325 | 4369 | ||
4326 | if (terseUpdateBlocks.IsValueCreated) | 4370 | if (terseUpdateBlocks.IsValueCreated) |
@@ -5444,22 +5488,21 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
5444 | Quaternion rotation; | 5488 | Quaternion rotation; |
5445 | byte[] textureEntry; | 5489 | byte[] textureEntry; |
5446 | 5490 | ||
5447 | if (entity is ScenePresence) | 5491 | if (avatar) |
5448 | { | 5492 | { |
5449 | ScenePresence presence = (ScenePresence)entity; | 5493 | ScenePresence presence = (ScenePresence)entity; |
5450 | 5494 | ||
5451 | position = presence.OffsetPosition; | 5495 | position = presence.OffsetPosition; |
5496 | velocity = presence.Velocity; | ||
5497 | acceleration = Vector3.Zero; | ||
5452 | rotation = presence.Rotation; | 5498 | rotation = presence.Rotation; |
5453 | angularVelocity = presence.AngularVelocity; | 5499 | angularVelocity = presence.AngularVelocity; |
5454 | rotation = presence.Rotation; | ||
5455 | 5500 | ||
5456 | // m_log.DebugFormat( | 5501 | // m_log.DebugFormat( |
5457 | // "[LLCLIENTVIEW]: Sending terse update to {0} with position {1} in {2}", Name, presence.OffsetPosition, m_scene.Name); | 5502 | // "[LLCLIENTVIEW]: Sending terse update to {0} with position {1} in {2}", Name, presence.OffsetPosition, m_scene.Name); |
5458 | 5503 | ||
5459 | attachPoint = presence.State; | 5504 | attachPoint = presence.State; |
5460 | collisionPlane = presence.CollisionPlane; | 5505 | collisionPlane = presence.CollisionPlane; |
5461 | velocity = presence.Velocity; | ||
5462 | acceleration = Vector3.Zero; | ||
5463 | 5506 | ||
5464 | if (sendTexture) | 5507 | if (sendTexture) |
5465 | { | 5508 | { |
@@ -7710,20 +7753,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7710 | return true; | 7753 | return true; |
7711 | } | 7754 | } |
7712 | #endregion | 7755 | #endregion |
7713 | 7756 | List<uint> thisSelection = new List<uint>(); | |
7714 | ObjectSelect handlerObjectSelect = null; | 7757 | ObjectSelect handlerObjectSelect = null; |
7715 | uint objID; | 7758 | uint objID; |
7716 | for (int i = 0; i < incomingselect.ObjectData.Length; i++) | 7759 | handlerObjectSelect = OnObjectSelect; |
7760 | if (handlerObjectSelect != null) | ||
7717 | { | 7761 | { |
7718 | objID = incomingselect.ObjectData[i].ObjectLocalID; | 7762 | for (int i = 0; i < incomingselect.ObjectData.Length; i++) |
7719 | if (!SelectedObjects.Contains(objID)) | ||
7720 | SelectedObjects.Add(objID); | ||
7721 | |||
7722 | handlerObjectSelect = OnObjectSelect; | ||
7723 | if (handlerObjectSelect != null) | ||
7724 | { | 7763 | { |
7725 | handlerObjectSelect(objID, this); | 7764 | objID = incomingselect.ObjectData[i].ObjectLocalID; |
7765 | thisSelection.Add(objID); | ||
7726 | } | 7766 | } |
7767 | |||
7768 | handlerObjectSelect(thisSelection, this); | ||
7727 | } | 7769 | } |
7728 | return true; | 7770 | return true; |
7729 | } | 7771 | } |
@@ -7746,8 +7788,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7746 | for (int i = 0; i < incomingdeselect.ObjectData.Length; i++) | 7788 | for (int i = 0; i < incomingdeselect.ObjectData.Length; i++) |
7747 | { | 7789 | { |
7748 | objID = incomingdeselect.ObjectData[i].ObjectLocalID; | 7790 | objID = incomingdeselect.ObjectData[i].ObjectLocalID; |
7749 | if (SelectedObjects.Contains(objID)) | ||
7750 | SelectedObjects.Remove(objID); | ||
7751 | 7791 | ||
7752 | handlerObjectDeselect = OnObjectDeselect; | 7792 | handlerObjectDeselect = OnObjectDeselect; |
7753 | if (handlerObjectDeselect != null) | 7793 | if (handlerObjectDeselect != null) |
@@ -7969,6 +8009,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
7969 | touchArgs.Add(arg); | 8009 | touchArgs.Add(arg); |
7970 | } | 8010 | } |
7971 | } | 8011 | } |
8012 | |||
7972 | handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial, | 8013 | handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial, |
7973 | grabUpdate.ObjectData.GrabPosition, this, touchArgs); | 8014 | grabUpdate.ObjectData.GrabPosition, this, touchArgs); |
7974 | } | 8015 | } |
@@ -12409,72 +12450,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
12409 | /// <param name="simclient"></param> | 12450 | /// <param name="simclient"></param> |
12410 | /// <param name="packet"></param> | 12451 | /// <param name="packet"></param> |
12411 | /// <returns></returns> | 12452 | /// <returns></returns> |
12412 | // TODO: Convert old handler to use new method | ||
12413 | /* | ||
12414 | protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet) | ||
12415 | { | ||
12416 | AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet; | ||
12417 | AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse); | ||
12418 | |||
12419 | if (cachedtex.AgentData.SessionID != SessionId) | ||
12420 | return false; | ||
12421 | |||
12422 | |||
12423 | |||
12424 | // TODO: don't create new blocks if recycling an old packet | ||
12425 | cachedresp.AgentData.AgentID = AgentId; | ||
12426 | cachedresp.AgentData.SessionID = m_sessionId; | ||
12427 | cachedresp.AgentData.SerialNum = m_cachedTextureSerial; | ||
12428 | m_cachedTextureSerial++; | ||
12429 | cachedresp.WearableData = | ||
12430 | new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length]; | ||
12431 | |||
12432 | int maxWearablesLoop = cachedtex.WearableData.Length; | ||
12433 | if (maxWearablesLoop > AvatarWearable.MAX_WEARABLES) | ||
12434 | maxWearablesLoop = AvatarWearable.MAX_WEARABLES; | ||
12435 | |||
12436 | // Find the cached baked textures for this user, if they're available | ||
12437 | |||
12438 | IAssetService cache = m_scene.AssetService; | ||
12439 | IBakedTextureModule bakedTextureModule = m_scene.RequestModuleInterface<IBakedTextureModule>(); | ||
12440 | |||
12441 | WearableCacheItem[] cacheItems = null; | ||
12442 | |||
12443 | if (bakedTextureModule != null && cache != null) | ||
12444 | { | ||
12445 | ScenePresence p = m_scene.GetScenePresence(AgentId); | ||
12446 | if (p.Appearance != null) | ||
12447 | { | ||
12448 | if (p.Appearance.WearableCacheItems == null || p.Appearance.WearableCacheItemsDirty) | ||
12449 | { | ||
12450 | try | ||
12451 | { | ||
12452 | cacheItems = bakedTextureModule.Get(AgentId); | ||
12453 | p.Appearance.WearableCacheItems = cacheItems; | ||
12454 | p.Appearance.WearableCacheItemsDirty = false; | ||
12455 | } | ||
12456 | catch (Exception) | ||
12457 | { | ||
12458 | cacheItems = null; | ||
12459 | } | ||
12460 | |||
12461 | } | ||
12462 | else if (p.Appearance.WearableCacheItems != null) | ||
12463 | { | ||
12464 | cacheItems = p.Appearance.WearableCacheItems; | ||
12465 | } | ||
12466 | } | ||
12467 | } | ||
12468 | |||
12469 | CachedTextureRequest handlerCachedTextureRequest = OnCachedTextureRequest; | ||
12470 | if (handlerCachedTextureRequest != null) | ||
12471 | { | ||
12472 | handlerCachedTextureRequest(simclient,cachedtex.AgentData.SerialNum,requestArgs); | ||
12473 | } | ||
12474 | |||
12475 | return true; | ||
12476 | } | ||
12477 | */ | ||
12478 | 12453 | ||
12479 | protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet) | 12454 | protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet) |
12480 | { | 12455 | { |
diff --git a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs index 41ce860..1391013 100644 --- a/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs +++ b/OpenSim/Region/CoreModules/Agent/Xfer/XferModule.cs | |||
@@ -124,20 +124,26 @@ namespace OpenSim.Region.CoreModules.Agent.Xfer | |||
124 | double now = Util.GetTimeStampMS(); | 124 | double now = Util.GetTimeStampMS(); |
125 | if(now - lastTimeTick > 1750.0) | 125 | if(now - lastTimeTick > 1750.0) |
126 | { | 126 | { |
127 | inTimeTick = true; | ||
128 | |||
129 | //don't overload busy heartbeat | ||
130 | WorkManager.RunInThread( | ||
131 | delegate | ||
132 | { | ||
133 | transfersTimeTick(now); | ||
134 | expireFiles(now); | ||
135 | 127 | ||
128 | if(Transfers.Count == 0 && NewFiles.Count == 0) | ||
136 | lastTimeTick = now; | 129 | lastTimeTick = now; |
137 | inTimeTick = false; | 130 | else |
138 | }, | 131 | { |
139 | null, | 132 | inTimeTick = true; |
140 | "XferTimeTick"); | 133 | |
134 | //don't overload busy heartbeat | ||
135 | WorkManager.RunInThreadPool( | ||
136 | delegate | ||
137 | { | ||
138 | transfersTimeTick(now); | ||
139 | expireFiles(now); | ||
140 | |||
141 | lastTimeTick = now; | ||
142 | inTimeTick = false; | ||
143 | }, | ||
144 | null, | ||
145 | "XferTimeTick"); | ||
146 | } | ||
141 | } | 147 | } |
142 | } | 148 | } |
143 | Monitor.Exit(timeTickLock); | 149 | Monitor.Exit(timeTickLock); |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 8f03a0a..d5c81ce 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -594,8 +594,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
594 | group.ResumeScripts(); | 594 | group.ResumeScripts(); |
595 | } | 595 | } |
596 | 596 | ||
597 | else | ||
597 | // Do this last so that event listeners have access to all the effects of the attachment | 598 | // Do this last so that event listeners have access to all the effects of the attachment |
598 | m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID); | 599 | // this can't be done when creating scripts: |
600 | // scripts do internal enqueue of attach event | ||
601 | // and not all scripts are loaded at this point | ||
602 | m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID); | ||
599 | } | 603 | } |
600 | 604 | ||
601 | return true; | 605 | return true; |
@@ -1053,7 +1057,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
1053 | if (fireDetachEvent) | 1057 | if (fireDetachEvent) |
1054 | { | 1058 | { |
1055 | m_scene.EventManager.TriggerOnAttach(grp.LocalId, grp.FromItemID, UUID.Zero); | 1059 | m_scene.EventManager.TriggerOnAttach(grp.LocalId, grp.FromItemID, UUID.Zero); |
1056 | |||
1057 | // Allow detach event time to do some work before stopping the script | 1060 | // Allow detach event time to do some work before stopping the script |
1058 | Thread.Sleep(2); | 1061 | Thread.Sleep(2); |
1059 | } | 1062 | } |
@@ -1115,13 +1118,15 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
1115 | 1118 | ||
1116 | SceneObjectGroup objatt; | 1119 | SceneObjectGroup objatt; |
1117 | 1120 | ||
1121 | UUID rezGroupID = sp.ControllingClient.ActiveGroupId; | ||
1122 | |||
1118 | if (itemID != UUID.Zero) | 1123 | if (itemID != UUID.Zero) |
1119 | objatt = m_invAccessModule.RezObject(sp.ControllingClient, | 1124 | objatt = m_invAccessModule.RezObject(sp.ControllingClient, |
1120 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | 1125 | itemID, rezGroupID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, |
1121 | false, false, sp.UUID, true); | 1126 | false, false, sp.UUID, true); |
1122 | else | 1127 | else |
1123 | objatt = m_invAccessModule.RezObject(sp.ControllingClient, | 1128 | objatt = m_invAccessModule.RezObject(sp.ControllingClient, |
1124 | null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | 1129 | null, rezGroupID, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, |
1125 | false, false, sp.UUID, true); | 1130 | false, false, sp.UUID, true); |
1126 | 1131 | ||
1127 | if (objatt == null) | 1132 | if (objatt == null) |
@@ -1318,7 +1323,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
1318 | AttachmentPt &= 0x7f; | 1323 | AttachmentPt &= 0x7f; |
1319 | 1324 | ||
1320 | // Calls attach with a Zero position | 1325 | // Calls attach with a Zero position |
1321 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false, true, append)) | 1326 | SceneObjectGroup group = part.ParentGroup; |
1327 | if (AttachObject(sp, group , AttachmentPt, false, true, append)) | ||
1322 | { | 1328 | { |
1323 | if (DebugLevel > 0) | 1329 | if (DebugLevel > 0) |
1324 | m_log.Debug( | 1330 | m_log.Debug( |
@@ -1377,7 +1383,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
1377 | if (sp != null) | 1383 | if (sp != null) |
1378 | DetachSingleAttachmentToGround(sp, soLocalId); | 1384 | DetachSingleAttachmentToGround(sp, soLocalId); |
1379 | } | 1385 | } |
1380 | |||
1381 | #endregion | 1386 | #endregion |
1382 | } | 1387 | } |
1383 | } | 1388 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index a83342c..16f1952 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs | |||
@@ -55,6 +55,7 @@ using OpenSim.Tests.Common; | |||
55 | 55 | ||
56 | namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | 56 | namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests |
57 | { | 57 | { |
58 | /* | ||
58 | /// <summary> | 59 | /// <summary> |
59 | /// Attachment tests | 60 | /// Attachment tests |
60 | /// </summary> | 61 | /// </summary> |
@@ -804,7 +805,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
804 | Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); | 805 | Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); |
805 | } | 806 | } |
806 | 807 | ||
807 | /* | 808 | |
808 | [Test] | 809 | [Test] |
809 | public void TestSameSimulatorNeighbouringRegionsTeleportV1() | 810 | public void TestSameSimulatorNeighbouringRegionsTeleportV1() |
810 | { | 811 | { |
@@ -844,7 +845,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
844 | sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); | 845 | sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); |
845 | 846 | ||
846 | // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour | 847 | // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour |
847 | lscm.ServiceVersion = 0.1f; | 848 | //lscm.ServiceVersion = 0.1f; |
848 | 849 | ||
849 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1); | 850 | UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1); |
850 | 851 | ||
@@ -912,7 +913,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
912 | // Check events | 913 | // Check events |
913 | Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); | 914 | Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); |
914 | } | 915 | } |
915 | */ | 916 | |
916 | 917 | ||
917 | [Test] | 918 | [Test] |
918 | public void TestSameSimulatorNeighbouringRegionsTeleportV2() | 919 | public void TestSameSimulatorNeighbouringRegionsTeleportV2() |
@@ -1025,4 +1026,5 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
1025 | Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); | 1026 | Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); |
1026 | } | 1027 | } |
1027 | } | 1028 | } |
1029 | */ | ||
1028 | } | 1030 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs index 6c2cf0a..46da5a9 100644 --- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs | |||
@@ -324,15 +324,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer | |||
324 | if (destinationFolderID != UUID.Zero) | 324 | if (destinationFolderID != UUID.Zero) |
325 | { | 325 | { |
326 | InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId); | 326 | InventoryFolderBase destinationFolder = new InventoryFolderBase(destinationFolderID, client.AgentId); |
327 | if (destinationFolder == null) | ||
328 | { | ||
329 | m_log.WarnFormat( | ||
330 | "[INVENTORY TRANSFER]: TaskInventoryAccepted message from {0} in {1} specified folder {2} which does not exist", | ||
331 | client.Name, scene.Name, destinationFolderID); | ||
332 | |||
333 | return; | ||
334 | } | ||
335 | |||
336 | IInventoryService invService = scene.InventoryService; | 327 | IInventoryService invService = scene.InventoryService; |
337 | 328 | ||
338 | UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip | 329 | UUID inventoryID = new UUID(im.imSessionID); // The inventory item/folder, back from it's trip |
diff --git a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs index 145f3db..61835f9 100644 --- a/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/UserProfiles/UserProfileModule.cs | |||
@@ -31,6 +31,7 @@ using System.Text; | |||
31 | using System.Collections; | 31 | using System.Collections; |
32 | using System.Collections.Generic; | 32 | using System.Collections.Generic; |
33 | using System.Globalization; | 33 | using System.Globalization; |
34 | using System.Linq; | ||
34 | using System.Net; | 35 | using System.Net; |
35 | using System.Net.Sockets; | 36 | using System.Net.Sockets; |
36 | using System.Reflection; | 37 | using System.Reflection; |
@@ -458,36 +459,43 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
458 | int queryclassifiedPrice, IClientAPI remoteClient) | 459 | int queryclassifiedPrice, IClientAPI remoteClient) |
459 | { | 460 | { |
460 | Scene s = (Scene)remoteClient.Scene; | 461 | Scene s = (Scene)remoteClient.Scene; |
461 | IMoneyModule money = s.RequestModuleInterface<IMoneyModule>(); | ||
462 | |||
463 | if (money != null) | ||
464 | { | ||
465 | if (!money.AmountCovered(remoteClient.AgentId, queryclassifiedPrice)) | ||
466 | { | ||
467 | remoteClient.SendAgentAlertMessage("You do not have enough money to create requested classified.", false); | ||
468 | return; | ||
469 | } | ||
470 | money.ApplyCharge(remoteClient.AgentId, queryclassifiedPrice, MoneyTransactionType.ClassifiedCharge); | ||
471 | } | ||
472 | |||
473 | UserClassifiedAdd ad = new UserClassifiedAdd(); | ||
474 | |||
475 | Vector3 pos = remoteClient.SceneAgent.AbsolutePosition; | 462 | Vector3 pos = remoteClient.SceneAgent.AbsolutePosition; |
476 | ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y); | 463 | ILandObject land = s.LandChannel.GetLandObject(pos.X, pos.Y); |
477 | ScenePresence p = FindPresence(remoteClient.AgentId); | 464 | UUID creatorId = remoteClient.AgentId; |
478 | 465 | ScenePresence p = FindPresence(creatorId); | |
466 | |||
479 | string serverURI = string.Empty; | 467 | string serverURI = string.Empty; |
480 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); | 468 | GetUserProfileServerURI(remoteClient.AgentId, out serverURI); |
481 | 469 | ||
482 | if (land == null) | 470 | OSDMap parameters = new OSDMap {{"creatorId", OSD.FromUUID(creatorId)}}; |
471 | OSD Params = (OSD)parameters; | ||
472 | if (!rpc.JsonRpcRequest(ref Params, "avatarclassifiedsrequest", serverURI, UUID.Random().ToString())) | ||
483 | { | 473 | { |
484 | ad.ParcelName = string.Empty; | 474 | remoteClient.SendAgentAlertMessage("Error fetching classifieds", false); |
475 | return; | ||
485 | } | 476 | } |
486 | else | 477 | parameters = (OSDMap)Params; |
478 | OSDArray list = (OSDArray)parameters["result"]; | ||
479 | bool exists = list.Cast<OSDMap>().Where(map => map.ContainsKey("classifieduuid")) | ||
480 | .Any(map => map["classifieduuid"].AsUUID().Equals(queryclassifiedID)); | ||
481 | |||
482 | if (!exists) | ||
487 | { | 483 | { |
488 | ad.ParcelName = land.LandData.Name; | 484 | IMoneyModule money = s.RequestModuleInterface<IMoneyModule>(); |
485 | if (money != null) | ||
486 | { | ||
487 | if (!money.AmountCovered(remoteClient.AgentId, queryclassifiedPrice)) | ||
488 | { | ||
489 | remoteClient.SendAgentAlertMessage("You do not have enough money to create this classified.", false); | ||
490 | return; | ||
491 | } | ||
492 | money.ApplyCharge(remoteClient.AgentId, queryclassifiedPrice, MoneyTransactionType.ClassifiedCharge); | ||
493 | } | ||
489 | } | 494 | } |
490 | 495 | ||
496 | UserClassifiedAdd ad = new UserClassifiedAdd(); | ||
497 | |||
498 | ad.ParcelName = land == null ? string.Empty : land.LandData.Name; | ||
491 | ad.CreatorId = remoteClient.AgentId; | 499 | ad.CreatorId = remoteClient.AgentId; |
492 | ad.ClassifiedId = queryclassifiedID; | 500 | ad.ClassifiedId = queryclassifiedID; |
493 | ad.Category = Convert.ToInt32(queryCategory); | 501 | ad.Category = Convert.ToInt32(queryCategory); |
@@ -507,9 +515,7 @@ namespace OpenSim.Region.CoreModules.Avatar.UserProfiles | |||
507 | 515 | ||
508 | if(!rpc.JsonRpcRequest(ref Ad, "classified_update", serverURI, UUID.Random().ToString())) | 516 | if(!rpc.JsonRpcRequest(ref Ad, "classified_update", serverURI, UUID.Random().ToString())) |
509 | { | 517 | { |
510 | remoteClient.SendAgentAlertMessage( | 518 | remoteClient.SendAgentAlertMessage("Error updating classified", false); |
511 | "Error updating classified", false); | ||
512 | return; | ||
513 | } | 519 | } |
514 | } | 520 | } |
515 | 521 | ||
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs index 58f3dde..71a0e52 100644 --- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs +++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs | |||
@@ -478,9 +478,17 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer | |||
478 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); | 478 | m_entityTransferStateMachine.UpdateInTransit(sp.UUID, AgentTransferState.Transferring); |
479 | 479 | ||
480 | sp.ControllingClient.SendTeleportStart(teleportFlags); | 480 | sp.ControllingClient.SendTeleportStart(teleportFlags); |
481 | lookAt.Z = 0f; | ||
482 | |||
483 | if(Math.Abs(lookAt.X) < 0.01f && Math.Abs(lookAt.Y) < 0.01f) | ||
484 | { | ||
485 | lookAt.X = 1.0f; | ||
486 | lookAt.Y = 0; | ||
487 | } | ||
481 | 488 | ||
482 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); | 489 | sp.ControllingClient.SendLocalTeleport(position, lookAt, teleportFlags); |
483 | sp.TeleportFlags = (Constants.TeleportFlags)teleportFlags; | 490 | sp.TeleportFlags = (Constants.TeleportFlags)teleportFlags; |
491 | sp.RotateToLookAt(lookAt); | ||
484 | sp.Velocity = Vector3.Zero; | 492 | sp.Velocity = Vector3.Zero; |
485 | sp.Teleport(position); | 493 | sp.Teleport(position); |
486 | 494 | ||
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 00e2670..fa7803f 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -261,64 +261,60 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
261 | { | 261 | { |
262 | InventoryItemBase item = m_Scene.InventoryService.GetItem(remoteClient.AgentId, itemID); | 262 | InventoryItemBase item = m_Scene.InventoryService.GetItem(remoteClient.AgentId, itemID); |
263 | 263 | ||
264 | if (item == null) | ||
265 | { | ||
266 | m_log.ErrorFormat( | ||
267 | "[INVENTORY ACCESS MODULE]: Could not find item {0} for caps inventory update", itemID); | ||
268 | return UUID.Zero; | ||
269 | } | ||
270 | |||
264 | if (item.Owner != remoteClient.AgentId) | 271 | if (item.Owner != remoteClient.AgentId) |
265 | return UUID.Zero; | 272 | return UUID.Zero; |
266 | 273 | ||
267 | if (item != null) | 274 | if ((InventoryType)item.InvType == InventoryType.Notecard) |
268 | { | 275 | { |
269 | if ((InventoryType)item.InvType == InventoryType.Notecard) | 276 | if (!m_Scene.Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId)) |
270 | { | 277 | { |
271 | if (!m_Scene.Permissions.CanEditNotecard(itemID, UUID.Zero, remoteClient.AgentId)) | 278 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false); |
272 | { | 279 | return UUID.Zero; |
273 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit notecard", false); | ||
274 | return UUID.Zero; | ||
275 | } | ||
276 | |||
277 | remoteClient.SendAlertMessage("Notecard saved"); | ||
278 | } | 280 | } |
279 | else if ((InventoryType)item.InvType == InventoryType.LSL) | ||
280 | { | ||
281 | if (!m_Scene.Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId)) | ||
282 | { | ||
283 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); | ||
284 | return UUID.Zero; | ||
285 | } | ||
286 | 281 | ||
287 | remoteClient.SendAlertMessage("Script saved"); | 282 | remoteClient.SendAlertMessage("Notecard saved"); |
288 | } | 283 | } |
289 | else if ((CustomInventoryType)item.InvType == CustomInventoryType.AnimationSet) | 284 | else if ((InventoryType)item.InvType == InventoryType.LSL) |
285 | { | ||
286 | if (!m_Scene.Permissions.CanEditScript(itemID, UUID.Zero, remoteClient.AgentId)) | ||
290 | { | 287 | { |
291 | AnimationSet animSet = new AnimationSet(data); | 288 | remoteClient.SendAgentAlertMessage("Insufficient permissions to edit script", false); |
292 | if (!animSet.Validate(x => { | 289 | return UUID.Zero; |
290 | } | ||
291 | |||
292 | remoteClient.SendAlertMessage("Script saved"); | ||
293 | } | ||
294 | else if ((CustomInventoryType)item.InvType == CustomInventoryType.AnimationSet) | ||
295 | { | ||
296 | AnimationSet animSet = new AnimationSet(data); | ||
297 | if (!animSet.Validate(x => { | ||
293 | int perms = m_Scene.InventoryService.GetAssetPermissions(remoteClient.AgentId, x); | 298 | int perms = m_Scene.InventoryService.GetAssetPermissions(remoteClient.AgentId, x); |
294 | int required = (int)(PermissionMask.Transfer | PermissionMask.Copy); | 299 | int required = (int)(PermissionMask.Transfer | PermissionMask.Copy); |
295 | if ((perms & required) != required) | 300 | if ((perms & required) != required) |
296 | return false; | 301 | return false; |
297 | return true; | 302 | return true; |
298 | })) | 303 | })) |
299 | { | 304 | { |
300 | data = animSet.ToBytes(); | 305 | data = animSet.ToBytes(); |
301 | } | ||
302 | } | 306 | } |
307 | } | ||
303 | 308 | ||
304 | AssetBase asset = | 309 | AssetBase asset = |
305 | CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data, remoteClient.AgentId.ToString()); | 310 | CreateAsset(item.Name, item.Description, (sbyte)item.AssetType, data, remoteClient.AgentId.ToString()); |
306 | item.AssetID = asset.FullID; | 311 | item.AssetID = asset.FullID; |
307 | m_Scene.AssetService.Store(asset); | 312 | m_Scene.AssetService.Store(asset); |
308 | |||
309 | m_Scene.InventoryService.UpdateItem(item); | ||
310 | 313 | ||
311 | // remoteClient.SendInventoryItemCreateUpdate(item); | 314 | m_Scene.InventoryService.UpdateItem(item); |
312 | return (asset.FullID); | ||
313 | } | ||
314 | else | ||
315 | { | ||
316 | m_log.ErrorFormat( | ||
317 | "[INVENTORY ACCESS MODULE]: Could not find item {0} for caps inventory update", | ||
318 | itemID); | ||
319 | } | ||
320 | 315 | ||
321 | return UUID.Zero; | 316 | // remoteClient.SendInventoryItemCreateUpdate(item); |
317 | return (asset.FullID); | ||
322 | } | 318 | } |
323 | 319 | ||
324 | public virtual bool UpdateInventoryItemAsset(UUID ownerID, InventoryItemBase item, AssetBase asset) | 320 | public virtual bool UpdateInventoryItemAsset(UUID ownerID, InventoryItemBase item, AssetBase asset) |
diff --git a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs index a686a4d..665d7f7 100644 --- a/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/DynamicTexture/DynamicTextureModule.cs | |||
@@ -553,37 +553,44 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture | |||
553 | ManagedImage managedImage; | 553 | ManagedImage managedImage; |
554 | Image image; | 554 | Image image; |
555 | 555 | ||
556 | if (OpenJPEG.DecodeToImage(frontImage, out managedImage, out image)) | 556 | if (!OpenJPEG.DecodeToImage(frontImage, out managedImage, out image) || image == null) |
557 | return null; | ||
558 | |||
559 | Bitmap image1 = new Bitmap(image); | ||
560 | image.Dispose(); | ||
561 | |||
562 | if (!OpenJPEG.DecodeToImage(backImage, out managedImage, out image) || image == null) | ||
557 | { | 563 | { |
558 | Bitmap image1 = new Bitmap(image); | 564 | image1.Dispose(); |
565 | return null; | ||
566 | } | ||
559 | 567 | ||
560 | if (OpenJPEG.DecodeToImage(backImage, out managedImage, out image)) | 568 | Bitmap image2 = new Bitmap(image); |
561 | { | 569 | image.Dispose(); |
562 | Bitmap image2 = new Bitmap(image); | ||
563 | 570 | ||
564 | if (setNewAlpha) | 571 | if (setNewAlpha) |
565 | SetAlpha(ref image1, newAlpha); | 572 | SetAlpha(ref image1, newAlpha); |
566 | 573 | ||
567 | Bitmap joint = MergeBitMaps(image1, image2); | 574 | using(Bitmap joint = MergeBitMaps(image1, image2)) |
575 | { | ||
576 | image1.Dispose(); | ||
577 | image2.Dispose(); | ||
568 | 578 | ||
569 | byte[] result = new byte[0]; | 579 | byte[] result = new byte[0]; |
570 | 580 | ||
571 | try | 581 | try |
572 | { | 582 | { |
573 | result = OpenJPEG.EncodeFromImage(joint, true); | 583 | result = OpenJPEG.EncodeFromImage(joint, true); |
574 | } | 584 | } |
575 | catch (Exception e) | 585 | catch (Exception e) |
576 | { | 586 | { |
577 | m_log.ErrorFormat( | 587 | m_log.ErrorFormat( |
578 | "[DYNAMICTEXTUREMODULE]: OpenJpeg Encode Failed. Exception {0}{1}", | 588 | "[DYNAMICTEXTUREMODULE]: OpenJpeg Encode Failed. Exception {0}{1}", |
579 | e.Message, e.StackTrace); | 589 | e.Message, e.StackTrace); |
580 | } | ||
581 | |||
582 | return result; | ||
583 | } | 590 | } |
584 | } | ||
585 | 591 | ||
586 | return null; | 592 | return result; |
593 | } | ||
587 | } | 594 | } |
588 | 595 | ||
589 | public Bitmap MergeBitMaps(Bitmap front, Bitmap back) | 596 | public Bitmap MergeBitMaps(Bitmap front, Bitmap back) |
@@ -592,12 +599,12 @@ namespace OpenSim.Region.CoreModules.Scripting.DynamicTexture | |||
592 | Graphics jG; | 599 | Graphics jG; |
593 | 600 | ||
594 | joint = new Bitmap(back.Width, back.Height, PixelFormat.Format32bppArgb); | 601 | joint = new Bitmap(back.Width, back.Height, PixelFormat.Format32bppArgb); |
595 | jG = Graphics.FromImage(joint); | 602 | using(jG = Graphics.FromImage(joint)) |
596 | 603 | { | |
597 | jG.DrawImage(back, 0, 0, back.Width, back.Height); | 604 | jG.DrawImage(back, 0, 0, back.Width, back.Height); |
598 | jG.DrawImage(front, 0, 0, back.Width, back.Height); | 605 | jG.DrawImage(front, 0, 0, back.Width, back.Height); |
599 | 606 | return joint; | |
600 | return joint; | 607 | } |
601 | } | 608 | } |
602 | 609 | ||
603 | private void SetAlpha(ref Bitmap b, byte alpha) | 610 | private void SetAlpha(ref Bitmap b, byte alpha) |
diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 68ca2ad..483c25f 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs | |||
@@ -559,9 +559,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm | |||
559 | return coll[0].GetHandle(); | 559 | return coll[0].GetHandle(); |
560 | } | 560 | } |
561 | 561 | ||
562 | if (m_curlisteners < m_maxlisteners) | 562 | lock (m_listeners) |
563 | { | 563 | { |
564 | lock (m_listeners) | 564 | if (m_curlisteners < m_maxlisteners) |
565 | { | 565 | { |
566 | int newHandle = GetNewHandle(itemID); | 566 | int newHandle = GetNewHandle(itemID); |
567 | 567 | ||
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs index 2fd21be..b632146 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsIn/Land/LandServiceInConnectorModule.cs | |||
@@ -126,13 +126,27 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsIn.Land | |||
126 | 126 | ||
127 | public LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) | 127 | public LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) |
128 | { | 128 | { |
129 | m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {1}", | 129 | // m_log.DebugFormat("[LAND IN CONNECTOR]: GetLandData for {0}. Count = {1}", |
130 | regionHandle, m_Scenes.Count); | 130 | // regionHandle, m_Scenes.Count); |
131 | |||
132 | uint rx = 0, ry = 0; | ||
133 | Util.RegionHandleToWorldLoc(regionHandle, out rx, out ry); | ||
134 | |||
131 | foreach (Scene s in m_Scenes) | 135 | foreach (Scene s in m_Scenes) |
132 | { | 136 | { |
133 | if (s.RegionInfo.RegionHandle == regionHandle) | 137 | uint t = s.RegionInfo.WorldLocX; |
138 | if( rx < t) | ||
139 | continue; | ||
140 | t += s.RegionInfo.RegionSizeX; | ||
141 | if( rx >= t) | ||
142 | continue; | ||
143 | t = s.RegionInfo.WorldLocY; | ||
144 | if( ry < t) | ||
145 | continue; | ||
146 | t += s.RegionInfo.RegionSizeY; | ||
147 | if( ry < t) | ||
134 | { | 148 | { |
135 | m_log.Debug("[LAND IN CONNECTOR]: Found region to GetLandData from"); | 149 | // m_log.Debug("[LAND IN CONNECTOR]: Found region to GetLandData from"); |
136 | regionAccess = s.RegionInfo.AccessLevel; | 150 | regionAccess = s.RegionInfo.AccessLevel; |
137 | return s.GetLandData(x, y); | 151 | return s.GetLandData(x, y); |
138 | } | 152 | } |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs index ade6381..9eb41f9 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Asset/HGAssetBroker.cs | |||
@@ -367,12 +367,14 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Asset | |||
367 | if (String.IsNullOrEmpty(id)) | 367 | if (String.IsNullOrEmpty(id)) |
368 | return string.Empty; | 368 | return string.Empty; |
369 | 369 | ||
370 | asset.ID = id; | 370 | if(asset.ID != id) |
371 | 371 | { | |
372 | if (isHG && m_Cache != null) | 372 | asset.ID = id; |
373 | m_Cache.Cache(asset); | 373 | if (m_Cache != null) |
374 | m_Cache.Cache(asset); | ||
375 | } | ||
374 | 376 | ||
375 | return id; | 377 | return id; |
376 | } | 378 | } |
377 | 379 | ||
378 | public bool UpdateContent(string id, byte[] data) | 380 | public bool UpdateContent(string id, byte[] data) |
diff --git a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs index 5329933..9e251aa 100644 --- a/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs +++ b/OpenSim/Region/CoreModules/ServiceConnectorsOut/Land/LocalLandServiceConnector.cs | |||
@@ -121,12 +121,25 @@ namespace OpenSim.Region.CoreModules.ServiceConnectorsOut.Land | |||
121 | public LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) | 121 | public LandData GetLandData(UUID scopeID, ulong regionHandle, uint x, uint y, out byte regionAccess) |
122 | { | 122 | { |
123 | regionAccess = 2; | 123 | regionAccess = 2; |
124 | m_log.DebugFormat("[LAND CONNECTOR]: request for land data in {0} at {1}, {2}", | 124 | // m_log.DebugFormat("[LAND CONNECTOR]: request for land data in {0} at {1}, {2}", |
125 | regionHandle, x, y); | 125 | // regionHandle, x, y); |
126 | |||
127 | uint rx = 0, ry = 0; | ||
128 | Util.RegionHandleToWorldLoc(regionHandle, out rx, out ry); | ||
126 | 129 | ||
127 | foreach (Scene s in m_Scenes) | 130 | foreach (Scene s in m_Scenes) |
128 | { | 131 | { |
129 | if (s.RegionInfo.RegionHandle == regionHandle) | 132 | uint t = s.RegionInfo.WorldLocX; |
133 | if( rx < t) | ||
134 | continue; | ||
135 | t += s.RegionInfo.RegionSizeX; | ||
136 | if( rx >= t) | ||
137 | continue; | ||
138 | t = s.RegionInfo.WorldLocY; | ||
139 | if( ry < t) | ||
140 | continue; | ||
141 | t += s.RegionInfo.RegionSizeY; | ||
142 | if( ry < t) | ||
130 | { | 143 | { |
131 | LandData land = s.GetLandData(x, y); | 144 | LandData land = s.GetLandData(x, y); |
132 | regionAccess = s.RegionInfo.AccessLevel; | 145 | regionAccess = s.RegionInfo.AccessLevel; |
diff --git a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs index 839072e..2d590fc 100644 --- a/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs +++ b/OpenSim/Region/CoreModules/World/Archiver/ArchiveReadRequest.cs | |||
@@ -1193,6 +1193,8 @@ namespace OpenSim.Region.CoreModules.World.Archiver | |||
1193 | } | 1193 | } |
1194 | 1194 | ||
1195 | ControlFileLoaded = true; | 1195 | ControlFileLoaded = true; |
1196 | if(xtr != null) | ||
1197 | xtr.Close(); | ||
1196 | 1198 | ||
1197 | return dearchivedScenes; | 1199 | return dearchivedScenes; |
1198 | } | 1200 | } |
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs index 56d41a8..425562f 100644 --- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs | |||
@@ -1229,15 +1229,24 @@ namespace OpenSim.Region.CoreModules.World.Estate | |||
1229 | } | 1229 | } |
1230 | terr.SaveToFile(Util.dataDir() + "/terrain.raw"); | 1230 | terr.SaveToFile(Util.dataDir() + "/terrain.raw"); |
1231 | 1231 | ||
1232 | FileStream input = new FileStream(Util.dataDir() + "/terrain.raw", FileMode.Open); | 1232 | byte[] bdata; |
1233 | byte[] bdata = new byte[input.Length]; | 1233 | using(FileStream input = new FileStream(Util.dataDir() + "/terrain.raw",FileMode.Open)) |
1234 | input.Read(bdata, 0, (int)input.Length); | 1234 | { |
1235 | bdata = new byte[input.Length]; | ||
1236 | input.Read(bdata, 0, (int)input.Length); | ||
1237 | } | ||
1238 | if(bdata == null || bdata.Length == 0) | ||
1239 | { | ||
1240 | remote_client.SendAlertMessage("Terrain error"); | ||
1241 | return; | ||
1242 | } | ||
1243 | |||
1235 | remote_client.SendAlertMessage("Terrain file written, starting download..."); | 1244 | remote_client.SendAlertMessage("Terrain file written, starting download..."); |
1236 | Scene.XferManager.AddNewFile("terrain.raw", bdata); | 1245 | string xfername = (UUID.Random()).ToString(); |
1246 | Scene.XferManager.AddNewFile(xfername, bdata); | ||
1237 | 1247 | ||
1238 | m_log.DebugFormat("[CLIENT]: Sending terrain for region {0} to {1}", Scene.Name, remote_client.Name); | 1248 | m_log.DebugFormat("[CLIENT]: Sending terrain for region {0} to {1}", Scene.Name, remote_client.Name); |
1239 | 1249 | remote_client.SendInitiateDownload(xfername, clientFileName); | |
1240 | remote_client.SendInitiateDownload("terrain.raw", clientFileName); | ||
1241 | } | 1250 | } |
1242 | } | 1251 | } |
1243 | 1252 | ||
diff --git a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs index 5155804..1f2b7c4 100644 --- a/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs +++ b/OpenSim/Region/CoreModules/World/LegacyMap/MapImageModule.cs | |||
@@ -382,7 +382,7 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
382 | 382 | ||
383 | Vector3 pos = part.GetWorldPosition(); | 383 | Vector3 pos = part.GetWorldPosition(); |
384 | 384 | ||
385 | // skip prim outside of retion | 385 | // skip prim outside of region |
386 | if (!m_scene.PositionIsInCurrentRegion(pos)) | 386 | if (!m_scene.PositionIsInCurrentRegion(pos)) |
387 | continue; | 387 | continue; |
388 | 388 | ||
@@ -406,12 +406,13 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
406 | { | 406 | { |
407 | // Translate scale by rotation so scale is represented properly when object is rotated | 407 | // Translate scale by rotation so scale is represented properly when object is rotated |
408 | Vector3 lscale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z); | 408 | Vector3 lscale = new Vector3(part.Shape.Scale.X, part.Shape.Scale.Y, part.Shape.Scale.Z); |
409 | lscale *= 0.5f; | ||
410 | |||
409 | Vector3 scale = new Vector3(); | 411 | Vector3 scale = new Vector3(); |
410 | Vector3 tScale = new Vector3(); | 412 | Vector3 tScale = new Vector3(); |
411 | Vector3 axPos = new Vector3(pos.X, pos.Y, pos.Z); | 413 | Vector3 axPos = new Vector3(pos.X, pos.Y, pos.Z); |
412 | 414 | ||
413 | Quaternion llrot = part.GetWorldRotation(); | 415 | Quaternion rot = part.GetWorldRotation(); |
414 | Quaternion rot = new Quaternion(llrot.W, llrot.X, llrot.Y, llrot.Z); | ||
415 | scale = lscale * rot; | 416 | scale = lscale * rot; |
416 | 417 | ||
417 | // negative scales don't work in this situation | 418 | // negative scales don't work in this situation |
@@ -470,7 +471,6 @@ namespace OpenSim.Region.CoreModules.World.LegacyMap | |||
470 | 471 | ||
471 | tScale = new Vector3(lscale.X, -lscale.Y, -lscale.Z); | 472 | tScale = new Vector3(lscale.X, -lscale.Y, -lscale.Z); |
472 | scale = ((tScale * rot)); | 473 | scale = ((tScale * rot)); |
473 | |||
474 | vertexes[2] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z))); | 474 | vertexes[2] = (new Vector3((pos.X + scale.X), (pos.Y + scale.Y), (pos.Z + scale.Z))); |
475 | 475 | ||
476 | //vertexes[2].x = pos.X + vertexes[2].x; | 476 | //vertexes[2].x = pos.X + vertexes[2].x; |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs index fb57c82..ec2d085 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/BMP.cs | |||
@@ -47,9 +47,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
47 | /// <param name="map">The terrain channel being saved</param> | 47 | /// <param name="map">The terrain channel being saved</param> |
48 | public override void SaveFile(string filename, ITerrainChannel map) | 48 | public override void SaveFile(string filename, ITerrainChannel map) |
49 | { | 49 | { |
50 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 50 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
51 | 51 | colours.Save(filename,ImageFormat.Bmp); | |
52 | colours.Save(filename, ImageFormat.Bmp); | ||
53 | } | 52 | } |
54 | 53 | ||
55 | /// <summary> | 54 | /// <summary> |
@@ -59,9 +58,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
59 | /// <param name="map">The terrain channel being saved</param> | 58 | /// <param name="map">The terrain channel being saved</param> |
60 | public override void SaveStream(Stream stream, ITerrainChannel map) | 59 | public override void SaveStream(Stream stream, ITerrainChannel map) |
61 | { | 60 | { |
62 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 61 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
63 | 62 | colours.Save(stream,ImageFormat.Bmp); | |
64 | colours.Save(stream, ImageFormat.Png); | ||
65 | } | 63 | } |
66 | 64 | ||
67 | /// <summary> | 65 | /// <summary> |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs index 79cc50b..3843708 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GIF.cs | |||
@@ -36,9 +36,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
36 | { | 36 | { |
37 | public override void SaveFile(string filename, ITerrainChannel map) | 37 | public override void SaveFile(string filename, ITerrainChannel map) |
38 | { | 38 | { |
39 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 39 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
40 | 40 | colours.Save(filename,ImageFormat.Gif); | |
41 | colours.Save(filename, ImageFormat.Gif); | ||
42 | } | 41 | } |
43 | 42 | ||
44 | /// <summary> | 43 | /// <summary> |
@@ -48,9 +47,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
48 | /// <param name="map">The terrain channel being saved</param> | 47 | /// <param name="map">The terrain channel being saved</param> |
49 | public override void SaveStream(Stream stream, ITerrainChannel map) | 48 | public override void SaveStream(Stream stream, ITerrainChannel map) |
50 | { | 49 | { |
51 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 50 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
52 | 51 | colours.Save(stream,ImageFormat.Gif); | |
53 | colours.Save(stream, ImageFormat.Gif); | ||
54 | } | 52 | } |
55 | 53 | ||
56 | public override string ToString() | 54 | public override string ToString() |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs index e8c719a..1e67f72 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/GenericSystemDrawing.cs | |||
@@ -59,7 +59,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
59 | /// <returns>A terrain channel generated from the image.</returns> | 59 | /// <returns>A terrain channel generated from the image.</returns> |
60 | public virtual ITerrainChannel LoadFile(string filename) | 60 | public virtual ITerrainChannel LoadFile(string filename) |
61 | { | 61 | { |
62 | using (Bitmap b = new Bitmap(filename)) | 62 | using(Bitmap b = new Bitmap(filename)) |
63 | return LoadBitmap(b); | 63 | return LoadBitmap(b); |
64 | } | 64 | } |
65 | 65 | ||
@@ -111,9 +111,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
111 | /// <param name="map">The terrain channel being saved</param> | 111 | /// <param name="map">The terrain channel being saved</param> |
112 | public virtual void SaveFile(string filename, ITerrainChannel map) | 112 | public virtual void SaveFile(string filename, ITerrainChannel map) |
113 | { | 113 | { |
114 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 114 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
115 | 115 | colours.Save(filename,ImageFormat.Png); | |
116 | colours.Save(filename, ImageFormat.Png); | ||
117 | } | 116 | } |
118 | 117 | ||
119 | /// <summary> | 118 | /// <summary> |
@@ -123,9 +122,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
123 | /// <param name="map">The terrain channel being saved</param> | 122 | /// <param name="map">The terrain channel being saved</param> |
124 | public virtual void SaveStream(Stream stream, ITerrainChannel map) | 123 | public virtual void SaveStream(Stream stream, ITerrainChannel map) |
125 | { | 124 | { |
126 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 125 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
127 | 126 | colours.Save(stream,ImageFormat.Png); | |
128 | colours.Save(stream, ImageFormat.Png); | ||
129 | } | 127 | } |
130 | 128 | ||
131 | public virtual void SaveFile(ITerrainChannel m_channel, string filename, | 129 | public virtual void SaveFile(ITerrainChannel m_channel, string filename, |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs index 9cc767a..36c2bbf 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/JPEG.cs | |||
@@ -59,9 +59,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
59 | 59 | ||
60 | public void SaveFile(string filename, ITerrainChannel map) | 60 | public void SaveFile(string filename, ITerrainChannel map) |
61 | { | 61 | { |
62 | Bitmap colours = CreateBitmapFromMap(map); | 62 | using(Bitmap colours = CreateBitmapFromMap(map)) |
63 | 63 | colours.Save(filename,ImageFormat.Jpeg); | |
64 | colours.Save(filename, ImageFormat.Jpeg); | ||
65 | } | 64 | } |
66 | 65 | ||
67 | /// <summary> | 66 | /// <summary> |
@@ -71,9 +70,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
71 | /// <param name="map">The terrain channel being saved</param> | 70 | /// <param name="map">The terrain channel being saved</param> |
72 | public void SaveStream(Stream stream, ITerrainChannel map) | 71 | public void SaveStream(Stream stream, ITerrainChannel map) |
73 | { | 72 | { |
74 | Bitmap colours = CreateBitmapFromMap(map); | 73 | using(Bitmap colours = CreateBitmapFromMap(map)) |
75 | 74 | colours.Save(stream,ImageFormat.Jpeg); | |
76 | colours.Save(stream, ImageFormat.Jpeg); | ||
77 | } | 75 | } |
78 | 76 | ||
79 | public virtual void SaveFile(ITerrainChannel m_channel, string filename, | 77 | public virtual void SaveFile(ITerrainChannel m_channel, string filename, |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs index c5c12ae..8ea8e9d 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/PNG.cs | |||
@@ -36,9 +36,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
36 | { | 36 | { |
37 | public override void SaveFile(string filename, ITerrainChannel map) | 37 | public override void SaveFile(string filename, ITerrainChannel map) |
38 | { | 38 | { |
39 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 39 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
40 | 40 | colours.Save(filename,ImageFormat.Png); | |
41 | colours.Save(filename, ImageFormat.Png); | ||
42 | } | 41 | } |
43 | 42 | ||
44 | /// <summary> | 43 | /// <summary> |
@@ -48,9 +47,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
48 | /// <param name="map">The terrain channel being saved</param> | 47 | /// <param name="map">The terrain channel being saved</param> |
49 | public override void SaveStream(Stream stream, ITerrainChannel map) | 48 | public override void SaveStream(Stream stream, ITerrainChannel map) |
50 | { | 49 | { |
51 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 50 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
52 | 51 | colours.Save(stream,ImageFormat.Png); | |
53 | colours.Save(stream, ImageFormat.Png); | ||
54 | } | 52 | } |
55 | 53 | ||
56 | public override string ToString() | 54 | public override string ToString() |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs index b416b82..d103a6f 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/FileLoaders/TIFF.cs | |||
@@ -36,9 +36,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
36 | { | 36 | { |
37 | public override void SaveFile(string filename, ITerrainChannel map) | 37 | public override void SaveFile(string filename, ITerrainChannel map) |
38 | { | 38 | { |
39 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 39 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
40 | 40 | colours.Save(filename,ImageFormat.Tiff); | |
41 | colours.Save(filename, ImageFormat.Tiff); | ||
42 | } | 41 | } |
43 | 42 | ||
44 | /// <summary> | 43 | /// <summary> |
@@ -48,9 +47,8 @@ namespace OpenSim.Region.CoreModules.World.Terrain.FileLoaders | |||
48 | /// <param name="map">The terrain channel being saved</param> | 47 | /// <param name="map">The terrain channel being saved</param> |
49 | public override void SaveStream(Stream stream, ITerrainChannel map) | 48 | public override void SaveStream(Stream stream, ITerrainChannel map) |
50 | { | 49 | { |
51 | Bitmap colours = CreateGrayscaleBitmapFromMap(map); | 50 | using(Bitmap colours = CreateGrayscaleBitmapFromMap(map)) |
52 | 51 | colours.Save(stream,ImageFormat.Tiff); | |
53 | colours.Save(stream, ImageFormat.Tiff); | ||
54 | } | 52 | } |
55 | 53 | ||
56 | public override string ToString() | 54 | public override string ToString() |
diff --git a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs index 275aa2a..05d18da 100644 --- a/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs +++ b/OpenSim/Region/CoreModules/World/Terrain/TerrainModule.cs | |||
@@ -963,6 +963,27 @@ namespace OpenSim.Region.CoreModules.World.Terrain | |||
963 | return wasLimited; | 963 | return wasLimited; |
964 | } | 964 | } |
965 | 965 | ||
966 | private bool EnforceEstateLimits(int startX, int startY, int endX, int endY) | ||
967 | { | ||
968 | TerrainData terrData = m_channel.GetTerrainData(); | ||
969 | |||
970 | bool wasLimited = false; | ||
971 | for (int x = startX; x <= endX; x += Constants.TerrainPatchSize) | ||
972 | { | ||
973 | for (int y = startX; y <= endY; y += Constants.TerrainPatchSize) | ||
974 | { | ||
975 | if (terrData.IsTaintedAt(x, y, false /* clearOnTest */)) | ||
976 | { | ||
977 | // If we should respect the estate settings then | ||
978 | // fixup and height deltas that don't respect them. | ||
979 | // Note that LimitChannelChanges() modifies the TerrainChannel with the limited height values. | ||
980 | wasLimited |= LimitChannelChanges(terrData, x, y); | ||
981 | } | ||
982 | } | ||
983 | } | ||
984 | return wasLimited; | ||
985 | } | ||
986 | |||
966 | /// <summary> | 987 | /// <summary> |
967 | /// Checks to see height deltas in the tainted terrain patch at xStart ,yStart | 988 | /// Checks to see height deltas in the tainted terrain patch at xStart ,yStart |
968 | /// are all within the current estate limits | 989 | /// are all within the current estate limits |
@@ -1341,7 +1362,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain | |||
1341 | 1362 | ||
1342 | //block changes outside estate limits | 1363 | //block changes outside estate limits |
1343 | if (!god) | 1364 | if (!god) |
1344 | EnforceEstateLimits(); | 1365 | EnforceEstateLimits(startX, endX, startY, endY); |
1345 | } | 1366 | } |
1346 | } | 1367 | } |
1347 | else | 1368 | else |
@@ -1404,7 +1425,7 @@ namespace OpenSim.Region.CoreModules.World.Terrain | |||
1404 | 1425 | ||
1405 | //block changes outside estate limits | 1426 | //block changes outside estate limits |
1406 | if (!god) | 1427 | if (!god) |
1407 | EnforceEstateLimits(); | 1428 | EnforceEstateLimits(startX, endX, startY, endY); |
1408 | } | 1429 | } |
1409 | } | 1430 | } |
1410 | else | 1431 | else |
diff --git a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs index 443eee1..cb37067 100644 --- a/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs +++ b/OpenSim/Region/CoreModules/World/Warp3DMap/Warp3DImageModule.cs | |||
@@ -35,7 +35,7 @@ using System.Reflection; | |||
35 | using CSJ2K; | 35 | using CSJ2K; |
36 | using Nini.Config; | 36 | using Nini.Config; |
37 | using log4net; | 37 | using log4net; |
38 | using Rednettle.Warp3D; | 38 | using Warp3D; |
39 | using Mono.Addins; | 39 | using Mono.Addins; |
40 | 40 | ||
41 | using OpenSim.Framework; | 41 | using OpenSim.Framework; |
@@ -76,11 +76,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
76 | private bool m_texturePrims = true; // true if should texture the rendered prims | 76 | private bool m_texturePrims = true; // true if should texture the rendered prims |
77 | private float m_texturePrimSize = 48f; // size of prim before we consider texturing it | 77 | private float m_texturePrimSize = 48f; // size of prim before we consider texturing it |
78 | private bool m_renderMeshes = false; // true if to render meshes rather than just bounding boxes | 78 | private bool m_renderMeshes = false; // true if to render meshes rather than just bounding boxes |
79 | private bool m_useAntiAliasing = false; // true if to anti-alias the rendered image | ||
80 | 79 | ||
81 | private bool m_Enabled = false; | 80 | private bool m_Enabled = false; |
82 | 81 | ||
83 | private Bitmap lastImage = null; | 82 | // private Bitmap lastImage = null; |
84 | private DateTime lastImageTime = DateTime.MinValue; | 83 | private DateTime lastImageTime = DateTime.MinValue; |
85 | 84 | ||
86 | #region Region Module interface | 85 | #region Region Module interface |
@@ -107,10 +106,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
107 | = Util.GetConfigVarFromSections<float>(m_config, "TexturePrimSize", configSections, m_texturePrimSize); | 106 | = Util.GetConfigVarFromSections<float>(m_config, "TexturePrimSize", configSections, m_texturePrimSize); |
108 | m_renderMeshes | 107 | m_renderMeshes |
109 | = Util.GetConfigVarFromSections<bool>(m_config, "RenderMeshes", configSections, m_renderMeshes); | 108 | = Util.GetConfigVarFromSections<bool>(m_config, "RenderMeshes", configSections, m_renderMeshes); |
110 | m_useAntiAliasing | 109 | } |
111 | = Util.GetConfigVarFromSections<bool>(m_config, "UseAntiAliasing", configSections, m_useAntiAliasing); | ||
112 | |||
113 | } | ||
114 | 110 | ||
115 | public void AddRegion(Scene scene) | 111 | public void AddRegion(Scene scene) |
116 | { | 112 | { |
@@ -201,21 +197,14 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
201 | int width = viewport.Width; | 197 | int width = viewport.Width; |
202 | int height = viewport.Height; | 198 | int height = viewport.Height; |
203 | 199 | ||
204 | if (m_useAntiAliasing) | ||
205 | { | ||
206 | width *= 2; | ||
207 | height *= 2; | ||
208 | } | ||
209 | |||
210 | WarpRenderer renderer = new WarpRenderer(); | 200 | WarpRenderer renderer = new WarpRenderer(); |
211 | 201 | ||
212 | renderer.CreateScene(width, height); | 202 | if(!renderer.CreateScene(width, height)) |
213 | renderer.Scene.autoCalcNormals = false; | 203 | return new Bitmap(width,height); |
214 | 204 | ||
215 | #region Camera | 205 | #region Camera |
216 | 206 | ||
217 | warp_Vector pos = ConvertVector(viewport.Position); | 207 | warp_Vector pos = ConvertVector(viewport.Position); |
218 | pos.z -= 0.001f; // Works around an issue with the Warp3D camera | ||
219 | warp_Vector lookat = warp_Vector.add(ConvertVector(viewport.Position), ConvertVector(viewport.LookDirection)); | 208 | warp_Vector lookat = warp_Vector.add(ConvertVector(viewport.Position), ConvertVector(viewport.LookDirection)); |
220 | 209 | ||
221 | renderer.Scene.defaultCamera.setPos(pos); | 210 | renderer.Scene.defaultCamera.setPos(pos); |
@@ -223,9 +212,7 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
223 | 212 | ||
224 | if (viewport.Orthographic) | 213 | if (viewport.Orthographic) |
225 | { | 214 | { |
226 | renderer.Scene.defaultCamera.isOrthographic = true; | 215 | renderer.Scene.defaultCamera.setOrthographic(true,viewport.OrthoWindowWidth, viewport.OrthoWindowHeight); |
227 | renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowWidth; | ||
228 | renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowHeight; | ||
229 | } | 216 | } |
230 | else | 217 | else |
231 | { | 218 | { |
@@ -247,24 +234,8 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
247 | renderer.Render(); | 234 | renderer.Render(); |
248 | Bitmap bitmap = renderer.Scene.getImage(); | 235 | Bitmap bitmap = renderer.Scene.getImage(); |
249 | 236 | ||
250 | if (m_useAntiAliasing) | 237 | renderer.Scene.destroy(); |
251 | { | 238 | renderer.Reset(); |
252 | using (Bitmap origBitmap = bitmap) | ||
253 | bitmap = ImageUtils.ResizeImage(origBitmap, viewport.Width, viewport.Height); | ||
254 | } | ||
255 | |||
256 | // XXX: It shouldn't really be necesary to force a GC here as one should occur anyway pretty shortly | ||
257 | // afterwards. It's generally regarded as a bad idea to manually GC. If Warp3D is using lots of memory | ||
258 | // then this may be some issue with the Warp3D code itself, though it's also quite possible that generating | ||
259 | // this map tile simply takes a lot of memory. | ||
260 | foreach (var o in renderer.Scene.objectData.Values) | ||
261 | { | ||
262 | warp_Object obj = (warp_Object)o; | ||
263 | obj.vertexData = null; | ||
264 | obj.triangleData = null; | ||
265 | } | ||
266 | |||
267 | renderer.Scene.removeAllObjects(); | ||
268 | renderer = null; | 239 | renderer = null; |
269 | viewport = null; | 240 | viewport = null; |
270 | 241 | ||
@@ -301,9 +272,9 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
301 | float waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight; | 272 | float waterHeight = (float)m_scene.RegionInfo.RegionSettings.WaterHeight; |
302 | 273 | ||
303 | renderer.AddPlane("Water", m_scene.RegionInfo.RegionSizeX * 0.5f); | 274 | renderer.AddPlane("Water", m_scene.RegionInfo.RegionSizeX * 0.5f); |
304 | renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX / 2 - 0.5f, | 275 | renderer.Scene.sceneobject("Water").setPos(m_scene.RegionInfo.RegionSizeX * 0.5f - 0.5f, |
305 | waterHeight, | 276 | waterHeight, |
306 | m_scene.RegionInfo.RegionSizeY / 2 - 0.5f); | 277 | m_scene.RegionInfo.RegionSizeY * 0.5f - 0.5f); |
307 | 278 | ||
308 | warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR)); | 279 | warp_Material waterColorMaterial = new warp_Material(ConvertColor(WATER_COLOR)); |
309 | waterColorMaterial.setReflectivity(0); // match water color with standard map module thanks lkalif | 280 | waterColorMaterial.setReflectivity(0); // match water color with standard map module thanks lkalif |
@@ -319,53 +290,53 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
319 | { | 290 | { |
320 | ITerrainChannel terrain = m_scene.Heightmap; | 291 | ITerrainChannel terrain = m_scene.Heightmap; |
321 | 292 | ||
293 | float regionsx = m_scene.RegionInfo.RegionSizeX; | ||
294 | float regionsy = m_scene.RegionInfo.RegionSizeY; | ||
295 | |||
322 | // 'diff' is the difference in scale between the real region size and the size of terrain we're buiding | 296 | // 'diff' is the difference in scale between the real region size and the size of terrain we're buiding |
323 | float diff = (float)m_scene.RegionInfo.RegionSizeX / 256f; | 297 | float diff = regionsx / 256f; |
324 | 298 | ||
325 | warp_Object obj = new warp_Object(256 * 256, 255 * 255 * 2); | 299 | int npointsx =(int)(regionsx / diff); |
300 | int npointsy =(int)(regionsy / diff); | ||
301 | |||
302 | float invsx = 1.0f / regionsx; | ||
303 | float invsy = 1.0f / (float)m_scene.RegionInfo.RegionSizeY; | ||
326 | 304 | ||
327 | // Create all the vertices for the terrain | 305 | // Create all the vertices for the terrain |
328 | for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) | 306 | warp_Object obj = new warp_Object(); |
307 | for (float y = 0; y < regionsy; y += diff) | ||
329 | { | 308 | { |
330 | for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) | 309 | for (float x = 0; x < regionsx; x += diff) |
331 | { | 310 | { |
332 | warp_Vector pos = ConvertVector(x, y, (float)terrain[(int)x, (int)y]); | 311 | warp_Vector pos = ConvertVector(x , y , (float)terrain[(int)x, (int)y]); |
333 | obj.addVertex(new warp_Vertex(pos, | 312 | obj.addVertex(new warp_Vertex(pos, x * invsx, 1.0f - y * invsy)); |
334 | x / (float)m_scene.RegionInfo.RegionSizeX, | ||
335 | (((float)m_scene.RegionInfo.RegionSizeY) - y) / m_scene.RegionInfo.RegionSizeY)); | ||
336 | } | 313 | } |
337 | } | 314 | } |
338 | 315 | ||
339 | // Now that we have all the vertices, make another pass and create | 316 | // Now that we have all the vertices, make another pass and |
340 | // the normals for each of the surface triangles and | 317 | // create the list of triangle indices. |
341 | // create the list of triangle indices. | 318 | float invdiff = 1.0f / diff; |
342 | for (float y = 0; y < m_scene.RegionInfo.RegionSizeY; y += diff) | 319 | int limx = npointsx - 1; |
320 | int limy = npointsy - 1; | ||
321 | for (float y = 0; y < regionsy; y += diff) | ||
343 | { | 322 | { |
344 | for (float x = 0; x < m_scene.RegionInfo.RegionSizeX; x += diff) | 323 | for (float x = 0; x < regionsx; x += diff) |
345 | { | 324 | { |
346 | float newX = x / diff; | 325 | float newX = x * invdiff; |
347 | float newY = y / diff; | 326 | float newY = y * invdiff; |
348 | if (newX < 255 && newY < 255) | 327 | if (newX < limx && newY < limy) |
349 | { | 328 | { |
350 | int v = (int)newY * 256 + (int)newX; | 329 | int v = (int)newY * npointsx + (int)newX; |
351 | |||
352 | // Normal for a triangle made up of three adjacent vertices | ||
353 | Vector3 v1 = new Vector3(newX, newY, (float)terrain[(int)x, (int)y]); | ||
354 | Vector3 v2 = new Vector3(newX + 1, newY, (float)terrain[(int)(x + 1), (int)y]); | ||
355 | Vector3 v3 = new Vector3(newX, newY + 1, (float)terrain[(int)x, ((int)(y + 1))]); | ||
356 | warp_Vector norm = ConvertVector(SurfaceNormal(v1, v2, v3)); | ||
357 | norm = norm.reverse(); | ||
358 | obj.vertex(v).n = norm; | ||
359 | 330 | ||
360 | // Make two triangles for each of the squares in the grid of vertices | 331 | // Make two triangles for each of the squares in the grid of vertices |
361 | obj.addTriangle( | 332 | obj.addTriangle( |
362 | v, | 333 | v, |
363 | v + 1, | 334 | v + 1, |
364 | v + 256); | 335 | v + npointsx); |
365 | 336 | ||
366 | obj.addTriangle( | 337 | obj.addTriangle( |
367 | v + 256 + 1, | 338 | v + npointsx + 1, |
368 | v + 256, | 339 | v + npointsx, |
369 | v + 1); | 340 | v + 1); |
370 | } | 341 | } |
371 | } | 342 | } |
@@ -398,14 +369,10 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
398 | Util.RegionHandleToWorldLoc(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); | 369 | Util.RegionHandleToWorldLoc(m_scene.RegionInfo.RegionHandle, out globalX, out globalY); |
399 | 370 | ||
400 | warp_Texture texture; | 371 | warp_Texture texture; |
401 | using ( | 372 | using (Bitmap image = TerrainSplat.Splat( |
402 | Bitmap image | ||
403 | = TerrainSplat.Splat( | ||
404 | terrain, textureIDs, startHeights, heightRanges, | 373 | terrain, textureIDs, startHeights, heightRanges, |
405 | new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) | 374 | new Vector3d(globalX, globalY, 0.0), m_scene.AssetService, textureTerrain)) |
406 | { | ||
407 | texture = new warp_Texture(image); | 375 | texture = new warp_Texture(image); |
408 | } | ||
409 | 376 | ||
410 | warp_Material material = new warp_Material(texture); | 377 | warp_Material material = new warp_Material(texture); |
411 | material.setReflectivity(50); | 378 | material.setReflectivity(50); |
@@ -431,11 +398,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
431 | private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim, | 398 | private void CreatePrim(WarpRenderer renderer, SceneObjectPart prim, |
432 | bool useTextures) | 399 | bool useTextures) |
433 | { | 400 | { |
434 | const float MIN_SIZE = 2f; | 401 | const float MIN_SIZE_SQUARE = 4f; |
435 | 402 | ||
436 | if ((PCode)prim.Shape.PCode != PCode.Prim) | 403 | if ((PCode)prim.Shape.PCode != PCode.Prim) |
437 | return; | 404 | return; |
438 | if (prim.Scale.LengthSquared() < MIN_SIZE * MIN_SIZE) | 405 | float primScaleLenSquared = prim.Scale.LengthSquared(); |
406 | |||
407 | if (primScaleLenSquared < MIN_SIZE_SQUARE) | ||
439 | return; | 408 | return; |
440 | 409 | ||
441 | FacetedMesh renderMesh = null; | 410 | FacetedMesh renderMesh = null; |
@@ -459,13 +428,13 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
459 | else // It's sculptie | 428 | else // It's sculptie |
460 | { | 429 | { |
461 | IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface<IJ2KDecoder>(); | 430 | IJ2KDecoder imgDecoder = m_scene.RequestModuleInterface<IJ2KDecoder>(); |
462 | if (imgDecoder != null) | 431 | if(imgDecoder != null) |
463 | { | 432 | { |
464 | Image sculpt = imgDecoder.DecodeToImage(sculptAsset); | 433 | Image sculpt = imgDecoder.DecodeToImage(sculptAsset); |
465 | if (sculpt != null) | 434 | if(sculpt != null) |
466 | { | 435 | { |
467 | renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim, (Bitmap)sculpt, | 436 | renderMesh = m_primMesher.GenerateFacetedSculptMesh(omvPrim,(Bitmap)sculpt, |
468 | DetailLevel.Medium); | 437 | DetailLevel.Medium); |
469 | sculpt.Dispose(); | 438 | sculpt.Dispose(); |
470 | } | 439 | } |
471 | } | 440 | } |
@@ -483,20 +452,6 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
483 | if (renderMesh == null) | 452 | if (renderMesh == null) |
484 | return; | 453 | return; |
485 | 454 | ||
486 | warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); | ||
487 | warp_Quaternion primRot = ConvertQuaternion(prim.RotationOffset); | ||
488 | |||
489 | warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); | ||
490 | |||
491 | if (prim.ParentID != 0) | ||
492 | { | ||
493 | SceneObjectGroup group = m_scene.SceneGraph.GetGroupByPrim(prim.LocalId); | ||
494 | if (group != null) | ||
495 | m.transform(warp_Matrix.quaternionMatrix(ConvertQuaternion(group.RootPart.RotationOffset))); | ||
496 | } | ||
497 | |||
498 | warp_Vector primScale = ConvertVector(prim.Scale); | ||
499 | |||
500 | string primID = prim.UUID.ToString(); | 455 | string primID = prim.UUID.ToString(); |
501 | 456 | ||
502 | // Create the prim faces | 457 | // Create the prim faces |
@@ -504,27 +459,18 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
504 | for (int i = 0; i < renderMesh.Faces.Count; i++) | 459 | for (int i = 0; i < renderMesh.Faces.Count; i++) |
505 | { | 460 | { |
506 | Face face = renderMesh.Faces[i]; | 461 | Face face = renderMesh.Faces[i]; |
507 | string meshName = primID + "-Face-" + i.ToString(); | 462 | string meshName = primID + i.ToString(); |
508 | 463 | ||
509 | // Avoid adding duplicate meshes to the scene | 464 | // Avoid adding duplicate meshes to the scene |
510 | if (renderer.Scene.objectData.ContainsKey(meshName)) | 465 | if (renderer.Scene.objectData.ContainsKey(meshName)) |
511 | { | ||
512 | continue; | 466 | continue; |
513 | } | ||
514 | |||
515 | warp_Object faceObj = new warp_Object(face.Vertices.Count, face.Indices.Count / 3); | ||
516 | 467 | ||
468 | warp_Object faceObj = new warp_Object(); | ||
517 | for (int j = 0; j < face.Vertices.Count; j++) | 469 | for (int j = 0; j < face.Vertices.Count; j++) |
518 | { | 470 | { |
519 | Vertex v = face.Vertices[j]; | 471 | Vertex v = face.Vertices[j]; |
520 | |||
521 | warp_Vector pos = ConvertVector(v.Position); | 472 | warp_Vector pos = ConvertVector(v.Position); |
522 | warp_Vector norm = ConvertVector(v.Normal); | 473 | warp_Vertex vert = new warp_Vertex(pos, v.TexCoord.X, v.TexCoord.Y); |
523 | |||
524 | if (prim.Shape.SculptTexture == UUID.Zero) | ||
525 | norm = norm.reverse(); | ||
526 | warp_Vertex vert = new warp_Vertex(pos, norm, v.TexCoord.X, v.TexCoord.Y); | ||
527 | |||
528 | faceObj.addVertex(vert); | 474 | faceObj.addVertex(vert); |
529 | } | 475 | } |
530 | 476 | ||
@@ -539,17 +485,19 @@ namespace OpenSim.Region.CoreModules.World.Warp3DMap | |||
539 | Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); | 485 | Primitive.TextureEntryFace teFace = prim.Shape.Textures.GetFace((uint)i); |
540 | Color4 faceColor = GetFaceColor(teFace); | 486 | Color4 faceColor = GetFaceColor(teFace); |
541 | string materialName = String.Empty; | 487 | string materialName = String.Empty; |
542 | if (m_texturePrims && prim.Scale.LengthSquared() > m_texturePrimSize*m_texturePrimSize) | 488 | if (m_texturePrims && primScaleLenSquared > m_texturePrimSize*m_texturePrimSize) |
543 | materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID); | 489 | materialName = GetOrCreateMaterial(renderer, faceColor, teFace.TextureID); |
544 | else | 490 | else |
545 | materialName = GetOrCreateMaterial(renderer, faceColor); | 491 | materialName = GetOrCreateMaterial(renderer, faceColor); |
546 | 492 | ||
493 | warp_Vector primPos = ConvertVector(prim.GetWorldPosition()); | ||
494 | warp_Quaternion primRot = ConvertQuaternion(prim.GetWorldRotation()); | ||
495 | warp_Matrix m = warp_Matrix.quaternionMatrix(primRot); | ||
547 | faceObj.transform(m); | 496 | faceObj.transform(m); |
548 | faceObj.setPos(primPos); | 497 | faceObj.setPos(primPos); |
549 | faceObj.scaleSelf(primScale.x, primScale.y, primScale.z); | 498 | faceObj.scaleSelf(prim.Scale.X, prim.Scale.Z, prim.Scale.Y); |
550 | 499 | ||
551 | renderer.Scene.addObject(meshName, faceObj); | 500 | renderer.Scene.addObject(meshName, faceObj); |
552 | |||
553 | renderer.SetObjectMaterial(meshName, materialName); | 501 | renderer.SetObjectMaterial(meshName, materialName); |
554 | } | 502 | } |
555 | } | 503 | } |
diff --git a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs index 959829c..57ec800 100644 --- a/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs +++ b/OpenSim/Region/CoreModules/World/WorldMap/WorldMapModule.cs | |||
@@ -1428,6 +1428,10 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1428 | 1428 | ||
1429 | mapTexture.Save(exportPath, ImageFormat.Jpeg); | 1429 | mapTexture.Save(exportPath, ImageFormat.Jpeg); |
1430 | 1430 | ||
1431 | g.Dispose(); | ||
1432 | mapTexture.Dispose(); | ||
1433 | sea.Dispose(); | ||
1434 | |||
1431 | m_log.InfoFormat( | 1435 | m_log.InfoFormat( |
1432 | "[WORLD MAP]: Successfully exported world map for {0} to {1}", | 1436 | "[WORLD MAP]: Successfully exported world map for {0} to {1}", |
1433 | m_scene.RegionInfo.RegionName, exportPath); | 1437 | m_scene.RegionInfo.RegionName, exportPath); |
@@ -1613,9 +1617,9 @@ namespace OpenSim.Region.CoreModules.World.WorldMap | |||
1613 | int mb = bx; | 1617 | int mb = bx; |
1614 | if(mb < by) | 1618 | if(mb < by) |
1615 | mb = by; | 1619 | mb = by; |
1616 | if(mb > 2 * Constants.RegionSize && mb > 0) | 1620 | if(mb > Constants.RegionSize && mb > 0) |
1617 | { | 1621 | { |
1618 | float scale = 2.0f * (float)Constants.RegionSize/(float)mb; | 1622 | float scale = (float)Constants.RegionSize/(float)mb; |
1619 | Size newsize = new Size(); | 1623 | Size newsize = new Size(); |
1620 | newsize.Width = (int)(bx * scale); | 1624 | newsize.Width = (int)(bx * scale); |
1621 | newsize.Height = (int)(by * scale); | 1625 | newsize.Height = (int)(by * scale); |
diff --git a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs index d59678b..ca3ebfb 100644 --- a/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs +++ b/OpenSim/Region/Framework/Scenes/Animation/MovementAnimationOverrides.cs | |||
@@ -52,6 +52,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
52 | private static readonly ILog m_log = | 52 | private static readonly ILog m_log = |
53 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 53 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
54 | 54 | ||
55 | private object MAOLock = new object(); | ||
55 | private Dictionary<string, UUID> m_overrides = new Dictionary<string, UUID>(); | 56 | private Dictionary<string, UUID> m_overrides = new Dictionary<string, UUID>(); |
56 | public void SetOverride(string state, UUID animID) | 57 | public void SetOverride(string state, UUID animID) |
57 | { | 58 | { |
@@ -66,13 +67,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
66 | 67 | ||
67 | m_log.DebugFormat("Setting override for {0} to {1}", state, animID); | 68 | m_log.DebugFormat("Setting override for {0} to {1}", state, animID); |
68 | 69 | ||
69 | lock (m_overrides) | 70 | lock (MAOLock) |
70 | m_overrides[state] = animID; | 71 | m_overrides[state] = animID; |
71 | } | 72 | } |
72 | 73 | ||
73 | public UUID GetOverriddenAnimation(string state) | 74 | public UUID GetOverriddenAnimation(string state) |
74 | { | 75 | { |
75 | lock (m_overrides) | 76 | lock (MAOLock) |
76 | { | 77 | { |
77 | if (m_overrides.ContainsKey(state)) | 78 | if (m_overrides.ContainsKey(state)) |
78 | return m_overrides[state]; | 79 | return m_overrides[state]; |
@@ -83,7 +84,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
83 | 84 | ||
84 | public Dictionary<string, UUID> CloneAOPairs() | 85 | public Dictionary<string, UUID> CloneAOPairs() |
85 | { | 86 | { |
86 | lock (m_overrides) | 87 | lock (MAOLock) |
87 | { | 88 | { |
88 | return new Dictionary<string, UUID>(m_overrides); | 89 | return new Dictionary<string, UUID>(m_overrides); |
89 | } | 90 | } |
@@ -91,7 +92,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
91 | 92 | ||
92 | public void CopyAOPairsFrom(Dictionary<string, UUID> src) | 93 | public void CopyAOPairsFrom(Dictionary<string, UUID> src) |
93 | { | 94 | { |
94 | lock (m_overrides) | 95 | lock (MAOLock) |
95 | { | 96 | { |
96 | m_overrides.Clear(); | 97 | m_overrides.Clear(); |
97 | m_overrides = new Dictionary<string, UUID>(src); | 98 | m_overrides = new Dictionary<string, UUID>(src); |
diff --git a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs index 075724e..84817a0 100644 --- a/OpenSim/Region/Framework/Scenes/CollisionSounds.cs +++ b/OpenSim/Region/Framework/Scenes/CollisionSounds.cs | |||
@@ -128,20 +128,29 @@ namespace OpenSim.Region.Framework.Scenes | |||
128 | if (part.CollisionSoundType < 0) | 128 | if (part.CollisionSoundType < 0) |
129 | return; | 129 | return; |
130 | 130 | ||
131 | float volume = 0.0f; | 131 | float volume = part.CollisionSoundVolume; |
132 | bool HaveSound = false; | ||
133 | 132 | ||
134 | UUID soundID = part.CollisionSound; | 133 | UUID soundID = part.CollisionSound; |
135 | 134 | ||
136 | if (part.CollisionSoundType > 0) | 135 | bool HaveSound = false; |
136 | switch (part.CollisionSoundType) | ||
137 | { | 137 | { |
138 | // soundID = part.CollisionSound; | 138 | case 0: // default sounds |
139 | volume = part.CollisionSoundVolume; | 139 | volume = 1.0f; |
140 | if (volume == 0.0f) | 140 | break; |
141 | return; | 141 | case 1: // selected sound |
142 | HaveSound = true; | 142 | if(soundID == part.invalidCollisionSoundUUID) |
143 | return; | ||
144 | HaveSound = true; | ||
145 | break; | ||
146 | case 2: // default sounds with volume set by script | ||
147 | default: | ||
148 | break; | ||
143 | } | 149 | } |
144 | 150 | ||
151 | if (volume == 0.0f) | ||
152 | return; | ||
153 | |||
145 | bool doneownsound = false; | 154 | bool doneownsound = false; |
146 | 155 | ||
147 | int thisMaterial = (int)part.Material; | 156 | int thisMaterial = (int)part.Material; |
@@ -152,7 +161,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
152 | CollisionForSoundInfo colInfo; | 161 | CollisionForSoundInfo colInfo; |
153 | uint id; | 162 | uint id; |
154 | 163 | ||
155 | for(int i = 0; i< collidersinfolist.Count; i++) | 164 | for(int i = 0; i < collidersinfolist.Count; i++) |
156 | { | 165 | { |
157 | colInfo = collidersinfolist[i]; | 166 | colInfo = collidersinfolist[i]; |
158 | 167 | ||
@@ -163,15 +172,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
163 | { | 172 | { |
164 | if (!HaveSound) | 173 | if (!HaveSound) |
165 | { | 174 | { |
166 | volume = Math.Abs(colInfo.relativeVel); | 175 | float vol = Math.Abs(colInfo.relativeVel); |
167 | if (volume < 0.2f) | 176 | if (vol < 0.2f) |
168 | continue; | 177 | continue; |
169 | 178 | ||
170 | volume *= volume * .0625f; // 4m/s == full volume | 179 | vol *= vol * .0625f; // 4m/s == full volume |
171 | if (volume > 1.0f) | 180 | if (vol > 1.0f) |
172 | volume = 1.0f; | 181 | vol = 1.0f; |
173 | 182 | ||
174 | soundID = m_TerrainPart[thisMaterial]; | 183 | soundID = m_TerrainPart[thisMaterial]; |
184 | volume *= vol; | ||
175 | } | 185 | } |
176 | part.SendCollisionSound(soundID, volume, colInfo.position); | 186 | part.SendCollisionSound(soundID, volume, colInfo.position); |
177 | doneownsound = true; | 187 | doneownsound = true; |
@@ -187,7 +197,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
187 | 197 | ||
188 | if (!HaveSound) | 198 | if (!HaveSound) |
189 | { | 199 | { |
190 | if (otherPart.CollisionSoundType > 0) | 200 | if (otherPart.CollisionSoundType == 1) |
191 | { | 201 | { |
192 | soundID = otherPart.CollisionSound; | 202 | soundID = otherPart.CollisionSound; |
193 | volume = otherPart.CollisionSoundVolume; | 203 | volume = otherPart.CollisionSoundVolume; |
@@ -196,19 +206,27 @@ namespace OpenSim.Region.Framework.Scenes | |||
196 | } | 206 | } |
197 | else | 207 | else |
198 | { | 208 | { |
199 | volume = Math.Abs(colInfo.relativeVel); | 209 | if (otherPart.CollisionSoundType == 2) |
200 | if (volume < 0.2f) | 210 | { |
211 | volume = otherPart.CollisionSoundVolume; | ||
212 | if (volume == 0.0f) | ||
213 | continue; | ||
214 | } | ||
215 | |||
216 | float vol = Math.Abs(colInfo.relativeVel); | ||
217 | if (vol < 0.2f) | ||
201 | continue; | 218 | continue; |
202 | 219 | ||
203 | volume *= volume * .0625f; // 4m/s == full volume | 220 | vol *= vol * .0625f; // 4m/s == full volume |
204 | if (volume > 1.0f) | 221 | if (vol > 1.0f) |
205 | volume = 1.0f; | 222 | vol = 1.0f; |
206 | 223 | ||
207 | int otherMaterial = (int)otherPart.Material; | 224 | int otherMaterial = (int)otherPart.Material; |
208 | if (otherMaterial >= MaxMaterials) | 225 | if (otherMaterial >= MaxMaterials) |
209 | otherMaterial = 3; | 226 | otherMaterial = 3; |
210 | 227 | ||
211 | soundID = m_PartPart[thisMatScaled + otherMaterial]; | 228 | soundID = m_PartPart[thisMatScaled + otherMaterial]; |
229 | volume *= vol; | ||
212 | } | 230 | } |
213 | } | 231 | } |
214 | 232 | ||
@@ -261,10 +279,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
261 | { | 279 | { |
262 | if (otherPart.CollisionSoundType < 0) | 280 | if (otherPart.CollisionSoundType < 0) |
263 | continue; | 281 | continue; |
264 | if (otherPart.CollisionSoundType > 0 && otherPart.CollisionSoundVolume > 0f) | 282 | if (otherPart.CollisionSoundType == 1 && otherPart.CollisionSoundVolume > 0f) |
265 | otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, colInfo.position); | 283 | otherPart.SendCollisionSound(otherPart.CollisionSound, otherPart.CollisionSoundVolume, colInfo.position); |
266 | else | 284 | else |
267 | { | 285 | { |
286 | float volmod = 1.0f; | ||
287 | if (otherPart.CollisionSoundType == 2) | ||
288 | { | ||
289 | volmod = otherPart.CollisionSoundVolume; | ||
290 | if(volmod == 0.0) | ||
291 | continue; | ||
292 | } | ||
268 | volume = Math.Abs(colInfo.relativeVel); | 293 | volume = Math.Abs(colInfo.relativeVel); |
269 | // Most noral collisions (running into walls, stairs) | 294 | // Most noral collisions (running into walls, stairs) |
270 | // should never be heard. | 295 | // should never be heard. |
@@ -281,6 +306,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
281 | if (otherMaterial >= MaxMaterials) | 306 | if (otherMaterial >= MaxMaterials) |
282 | otherMaterial = 3; | 307 | otherMaterial = 3; |
283 | 308 | ||
309 | volume *= volmod; | ||
284 | soundID = m_PartPart[thisMatScaled + otherMaterial]; | 310 | soundID = m_PartPart[thisMatScaled + otherMaterial]; |
285 | otherPart.SendCollisionSound(soundID, volume, colInfo.position); | 311 | otherPart.SendCollisionSound(soundID, volume, colInfo.position); |
286 | } | 312 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SOPVehicle.cs b/OpenSim/Region/Framework/Scenes/SOPVehicle.cs index 2b33cf7..897918a 100644 --- a/OpenSim/Region/Framework/Scenes/SOPVehicle.cs +++ b/OpenSim/Region/Framework/Scenes/SOPVehicle.cs | |||
@@ -406,6 +406,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
406 | ph.SetVehicle(vd); | 406 | ph.SetVehicle(vd); |
407 | } | 407 | } |
408 | 408 | ||
409 | public bool CameraDecoupled | ||
410 | { | ||
411 | get | ||
412 | { | ||
413 | if((vd.m_flags & VehicleFlag.CAMERA_DECOUPLED) != 0) | ||
414 | return true; | ||
415 | return false; | ||
416 | } | ||
417 | } | ||
418 | |||
409 | private XmlTextWriter writer; | 419 | private XmlTextWriter writer; |
410 | 420 | ||
411 | private void XWint(string name, int i) | 421 | private void XWint(string name, int i) |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs index c49edd1..4d491d1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs | |||
@@ -164,55 +164,39 @@ namespace OpenSim.Region.Framework.Scenes | |||
164 | /// </summary> | 164 | /// </summary> |
165 | /// <param name="primLocalID"></param> | 165 | /// <param name="primLocalID"></param> |
166 | /// <param name="remoteClient"></param> | 166 | /// <param name="remoteClient"></param> |
167 | public void SelectPrim(uint primLocalID, IClientAPI remoteClient) | 167 | public void SelectPrim(List<uint> primIDs, IClientAPI remoteClient) |
168 | { | 168 | { |
169 | /* | 169 | List<ISceneEntity> needUpdates = new List<ISceneEntity>(); |
170 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | ||
171 | 170 | ||
172 | if (null == part) | 171 | foreach(uint primLocalID in primIDs) |
173 | return; | 172 | { |
174 | 173 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | |
175 | if (part.IsRoot) | ||
176 | { | ||
177 | SceneObjectGroup sog = part.ParentGroup; | ||
178 | sog.SendPropertiesToClient(remoteClient); | ||
179 | |||
180 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | ||
181 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) | ||
182 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) | ||
183 | { | ||
184 | sog.IsSelected = true; | ||
185 | EventManager.TriggerParcelPrimCountTainted(); | ||
186 | } | ||
187 | } | ||
188 | else | ||
189 | { | ||
190 | part.SendPropertiesToClient(remoteClient); | ||
191 | } | ||
192 | */ | ||
193 | SceneObjectPart part = GetSceneObjectPart(primLocalID); | ||
194 | 174 | ||
195 | if (null == part) | 175 | if (part == null) |
196 | return; | 176 | continue; |
197 | 177 | ||
198 | SceneObjectGroup sog = part.ParentGroup; | 178 | SceneObjectGroup sog = part.ParentGroup; |
199 | if (sog == null) | 179 | if (sog == null) |
200 | return; | 180 | continue; |
201 | 181 | ||
202 | part.SendPropertiesToClient(remoteClient); | 182 | needUpdates.Add((ISceneEntity)part); |
203 | 183 | ||
204 | // waste of time because properties do not send prim flags as they should | 184 | // waste of time because properties do not send prim flags as they should |
205 | // if a friend got or lost edit rights after login, a full update is needed | 185 | // if a friend got or lost edit rights after login, a full update is needed |
206 | if(sog.OwnerID != remoteClient.AgentId) | 186 | if(sog.OwnerID != remoteClient.AgentId) |
207 | part.SendFullUpdate(remoteClient); | 187 | part.SendFullUpdate(remoteClient); |
208 | 188 | ||
209 | // A prim is only tainted if it's allowed to be edited by the person clicking it. | 189 | // A prim is only tainted if it's allowed to be edited by the person clicking it. |
210 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) | 190 | if (Permissions.CanEditObject(sog.UUID, remoteClient.AgentId) |
211 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) | 191 | || Permissions.CanMoveObject(sog.UUID, remoteClient.AgentId)) |
212 | { | 192 | { |
213 | part.IsSelected = true; | 193 | part.IsSelected = true; |
214 | EventManager.TriggerParcelPrimCountTainted(); | 194 | EventManager.TriggerParcelPrimCountTainted(); |
195 | } | ||
215 | } | 196 | } |
197 | |||
198 | if(needUpdates.Count > 0) | ||
199 | remoteClient.SendSelectedPartsProprieties(needUpdates); | ||
216 | } | 200 | } |
217 | 201 | ||
218 | /// <summary> | 202 | /// <summary> |
@@ -377,8 +361,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
377 | if (part == null) | 361 | if (part == null) |
378 | return; | 362 | return; |
379 | 363 | ||
380 | SceneObjectGroup obj = part.ParentGroup; | 364 | SceneObjectGroup group = part.ParentGroup; |
365 | if(group == null || group.IsDeleted) | ||
366 | return; | ||
367 | |||
368 | if (Permissions.CanMoveObject(group.UUID, remoteClient.AgentId))// && PermissionsMngr.) | ||
369 | { | ||
370 | group.GrabMovement(objectID, offset, pos, remoteClient); | ||
371 | } | ||
381 | 372 | ||
373 | // This is outside the above permissions condition | ||
374 | // so that if the object is locked the client moving the object | ||
375 | // get's it's position on the simulator even if it was the same as before | ||
376 | // This keeps the moving user's client in sync with the rest of the world. | ||
377 | group.SendGroupTerseUpdate(); | ||
378 | |||
382 | SurfaceTouchEventArgs surfaceArg = null; | 379 | SurfaceTouchEventArgs surfaceArg = null; |
383 | if (surfaceArgs != null && surfaceArgs.Count > 0) | 380 | if (surfaceArgs != null && surfaceArgs.Count > 0) |
384 | surfaceArg = surfaceArgs[0]; | 381 | surfaceArg = surfaceArgs[0]; |
@@ -391,9 +388,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
391 | // or if we're meant to pass on touches anyway. Don't send to root prim | 388 | // or if we're meant to pass on touches anyway. Don't send to root prim |
392 | // if prim touched is the root prim as we just did it | 389 | // if prim touched is the root prim as we just did it |
393 | if (((part.ScriptEvents & scriptEvents.touch) == 0) || | 390 | if (((part.ScriptEvents & scriptEvents.touch) == 0) || |
394 | (part.PassTouches && (part.LocalId != obj.RootPart.LocalId))) | 391 | (part.PassTouches && (part.LocalId != group.RootPart.LocalId))) |
395 | { | 392 | { |
396 | EventManager.TriggerObjectGrabbing(obj.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg); | 393 | EventManager.TriggerObjectGrabbing(group.RootPart.LocalId, part.LocalId, part.OffsetPosition, remoteClient, surfaceArg); |
397 | } | 394 | } |
398 | } | 395 | } |
399 | 396 | ||
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index d5dbcaf..0d6af77 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2780,13 +2780,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2780 | else | 2780 | else |
2781 | group.StopScriptInstances(); | 2781 | group.StopScriptInstances(); |
2782 | 2782 | ||
2783 | List<ScenePresence> avatars = group.GetSittingAvatars(); | ||
2784 | foreach (ScenePresence av in avatars) | ||
2785 | { | ||
2786 | if(av.ParentUUID == UUID.Zero) | ||
2787 | av.StandUp(); | ||
2788 | } | ||
2789 | |||
2790 | SceneObjectPart[] partList = group.Parts; | 2783 | SceneObjectPart[] partList = group.Parts; |
2791 | 2784 | ||
2792 | foreach (SceneObjectPart part in partList) | 2785 | foreach (SceneObjectPart part in partList) |
@@ -3336,7 +3329,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3336 | client.OnObjectRequest += RequestPrim; | 3329 | client.OnObjectRequest += RequestPrim; |
3337 | client.OnObjectSelect += SelectPrim; | 3330 | client.OnObjectSelect += SelectPrim; |
3338 | client.OnObjectDeselect += DeselectPrim; | 3331 | client.OnObjectDeselect += DeselectPrim; |
3339 | client.OnGrabUpdate += m_sceneGraph.MoveObject; | ||
3340 | client.OnSpinStart += m_sceneGraph.SpinStart; | 3332 | client.OnSpinStart += m_sceneGraph.SpinStart; |
3341 | client.OnSpinUpdate += m_sceneGraph.SpinObject; | 3333 | client.OnSpinUpdate += m_sceneGraph.SpinObject; |
3342 | client.OnDeRezObject += DeRezObjects; | 3334 | client.OnDeRezObject += DeRezObjects; |
@@ -3464,7 +3456,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3464 | client.OnObjectRequest -= RequestPrim; | 3456 | client.OnObjectRequest -= RequestPrim; |
3465 | client.OnObjectSelect -= SelectPrim; | 3457 | client.OnObjectSelect -= SelectPrim; |
3466 | client.OnObjectDeselect -= DeselectPrim; | 3458 | client.OnObjectDeselect -= DeselectPrim; |
3467 | client.OnGrabUpdate -= m_sceneGraph.MoveObject; | ||
3468 | client.OnSpinStart -= m_sceneGraph.SpinStart; | 3459 | client.OnSpinStart -= m_sceneGraph.SpinStart; |
3469 | client.OnSpinUpdate -= m_sceneGraph.SpinObject; | 3460 | client.OnSpinUpdate -= m_sceneGraph.SpinObject; |
3470 | client.OnDeRezObject -= DeRezObjects; | 3461 | client.OnDeRezObject -= DeRezObjects; |
@@ -3479,6 +3470,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3479 | client.OnRequestObjectPropertiesFamily -= m_sceneGraph.RequestObjectPropertiesFamily; | 3470 | client.OnRequestObjectPropertiesFamily -= m_sceneGraph.RequestObjectPropertiesFamily; |
3480 | client.OnObjectPermissions -= HandleObjectPermissionsUpdate; | 3471 | client.OnObjectPermissions -= HandleObjectPermissionsUpdate; |
3481 | client.OnGrabObject -= ProcessObjectGrab; | 3472 | client.OnGrabObject -= ProcessObjectGrab; |
3473 | client.OnGrabUpdate -= ProcessObjectGrabUpdate; | ||
3482 | client.OnDeGrabObject -= ProcessObjectDeGrab; | 3474 | client.OnDeGrabObject -= ProcessObjectDeGrab; |
3483 | client.OnUndo -= m_sceneGraph.HandleUndo; | 3475 | client.OnUndo -= m_sceneGraph.HandleUndo; |
3484 | client.OnRedo -= m_sceneGraph.HandleRedo; | 3476 | client.OnRedo -= m_sceneGraph.HandleRedo; |
@@ -5036,7 +5028,7 @@ Label_GroupsDone: | |||
5036 | 5028 | ||
5037 | public LandData GetLandData(uint x, uint y) | 5029 | public LandData GetLandData(uint x, uint y) |
5038 | { | 5030 | { |
5039 | m_log.DebugFormat("[SCENE]: returning land for {0},{1}", x, y); | 5031 | // m_log.DebugFormat("[SCENE]: returning land for {0},{1}", x, y); |
5040 | ILandObject parcel = LandChannel.GetLandObject((int)x, (int)y); | 5032 | ILandObject parcel = LandChannel.GetLandObject((int)x, (int)y); |
5041 | if (parcel == null) | 5033 | if (parcel == null) |
5042 | return null; | 5034 | return null; |
@@ -5439,7 +5431,6 @@ Label_GroupsDone: | |||
5439 | } | 5431 | } |
5440 | } | 5432 | } |
5441 | } | 5433 | } |
5442 | |||
5443 | } | 5434 | } |
5444 | 5435 | ||
5445 | public void DeleteFromStorage(UUID uuid) | 5436 | public void DeleteFromStorage(UUID uuid) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index b65d168..0e5720f 100755 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -1674,7 +1674,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1674 | } | 1674 | } |
1675 | } | 1675 | } |
1676 | } | 1676 | } |
1677 | 1677 | /* moved to scene ProcessObjectGrabUpdate | |
1678 | /// <summary> | 1678 | /// <summary> |
1679 | /// Move the given object | 1679 | /// Move the given object |
1680 | /// </summary> | 1680 | /// </summary> |
@@ -1699,7 +1699,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1699 | group.SendGroupTerseUpdate(); | 1699 | group.SendGroupTerseUpdate(); |
1700 | } | 1700 | } |
1701 | } | 1701 | } |
1702 | 1702 | */ | |
1703 | /// <summary> | 1703 | /// <summary> |
1704 | /// Start spinning the given object | 1704 | /// Start spinning the given object |
1705 | /// </summary> | 1705 | /// </summary> |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index df6a1cf..b7c5b6b 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2078,7 +2078,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2078 | 2078 | ||
2079 | Scene.ForEachScenePresence(delegate(ScenePresence avatar) | 2079 | Scene.ForEachScenePresence(delegate(ScenePresence avatar) |
2080 | { | 2080 | { |
2081 | if (!avatar.IsChildAgent && avatar.ParentID == LocalId) | 2081 | if (!avatar.IsChildAgent && avatar.ParentID == part.LocalId && avatar.ParentUUID == UUID.Zero) |
2082 | avatar.StandUp(); | 2082 | avatar.StandUp(); |
2083 | 2083 | ||
2084 | if (!silent) | 2084 | if (!silent) |
@@ -2092,6 +2092,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
2092 | { | 2092 | { |
2093 | // Send a kill object immediately | 2093 | // Send a kill object immediately |
2094 | avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId }); | 2094 | avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId }); |
2095 | //direct enqueue another delayed kill | ||
2096 | avatar.ControllingClient.SendEntityUpdate(part,PrimUpdateFlags.Kill); | ||
2095 | } | 2097 | } |
2096 | } | 2098 | } |
2097 | } | 2099 | } |
@@ -2110,6 +2112,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2110 | d.AddActiveScripts(count); | 2112 | d.AddActiveScripts(count); |
2111 | } | 2113 | } |
2112 | 2114 | ||
2115 | private const scriptEvents PhysicsNeeedSubsEvents = ( | ||
2116 | scriptEvents.collision | scriptEvents.collision_start | scriptEvents.collision_end | | ||
2117 | scriptEvents.land_collision | scriptEvents.land_collision_start | scriptEvents.land_collision_end); | ||
2118 | |||
2119 | private scriptEvents lastRootPartPhysEvents = 0; | ||
2120 | |||
2113 | public void aggregateScriptEvents() | 2121 | public void aggregateScriptEvents() |
2114 | { | 2122 | { |
2115 | PrimFlags objectflagupdate = (PrimFlags)RootPart.GetEffectiveObjectFlags(); | 2123 | PrimFlags objectflagupdate = (PrimFlags)RootPart.GetEffectiveObjectFlags(); |
@@ -2146,6 +2154,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
2146 | m_scene.RemoveGroupTarget(this); | 2154 | m_scene.RemoveGroupTarget(this); |
2147 | } | 2155 | } |
2148 | 2156 | ||
2157 | scriptEvents rootPartPhysEvents = RootPart.AggregateScriptEvents; | ||
2158 | rootPartPhysEvents &= PhysicsNeeedSubsEvents; | ||
2159 | if (rootPartPhysEvents != lastRootPartPhysEvents) | ||
2160 | { | ||
2161 | lastRootPartPhysEvents = rootPartPhysEvents; | ||
2162 | for (int i = 0; i < parts.Length; i++) | ||
2163 | { | ||
2164 | SceneObjectPart part = parts[i]; | ||
2165 | if (part == null) | ||
2166 | continue; | ||
2167 | part.UpdatePhysicsSubscribedEvents(); | ||
2168 | } | ||
2169 | } | ||
2170 | |||
2149 | ScheduleGroupForFullUpdate(); | 2171 | ScheduleGroupForFullUpdate(); |
2150 | } | 2172 | } |
2151 | 2173 | ||
@@ -2174,7 +2196,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2174 | // Apply physics to the root prim | 2196 | // Apply physics to the root prim |
2175 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, true); | 2197 | m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, true); |
2176 | 2198 | ||
2177 | |||
2178 | for (int i = 0; i < parts.Length; i++) | 2199 | for (int i = 0; i < parts.Length; i++) |
2179 | { | 2200 | { |
2180 | SceneObjectPart part = parts[i]; | 2201 | SceneObjectPart part = parts[i]; |
@@ -2242,10 +2263,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2242 | // any exception propogate upwards. | 2263 | // any exception propogate upwards. |
2243 | try | 2264 | try |
2244 | { | 2265 | { |
2245 | if (!m_scene.ShuttingDown || // if shutting down then there will be nothing to handle the return so leave till next restart | 2266 | // if shutting down then there will be nothing to handle the return so leave till next restart |
2246 | !m_scene.LoginsEnabled || // We're starting up or doing maintenance, don't mess with things | 2267 | if (!m_scene.ShuttingDown && |
2247 | m_scene.LoadingPrims) // Land may not be valid yet | 2268 | m_scene.LoginsEnabled && // We're starting up or doing maintenance, don't mess with things |
2248 | 2269 | !m_scene.LoadingPrims) // Land may not be valid yet | |
2249 | { | 2270 | { |
2250 | ILandObject parcel = m_scene.LandChannel.GetLandObject( | 2271 | ILandObject parcel = m_scene.LandChannel.GetLandObject( |
2251 | m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y); | 2272 | m_rootPart.GroupPosition.X, m_rootPart.GroupPosition.Y); |
@@ -3345,7 +3366,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
3345 | // engine about the delink. Someday, linksets should be made first | 3366 | // engine about the delink. Someday, linksets should be made first |
3346 | // class objects in the physics engine interface). | 3367 | // class objects in the physics engine interface). |
3347 | if (linkPartPa != null) | 3368 | if (linkPartPa != null) |
3369 | { | ||
3348 | m_scene.PhysicsScene.RemovePrim(linkPartPa); | 3370 | m_scene.PhysicsScene.RemovePrim(linkPartPa); |
3371 | linkPart.PhysActor = null; | ||
3372 | } | ||
3349 | 3373 | ||
3350 | // We need to reset the child part's position | 3374 | // We need to reset the child part's position |
3351 | // ready for life as a separate object after being a part of another object | 3375 | // ready for life as a separate object after being a part of another object |
@@ -3397,10 +3421,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
3397 | public virtual void DetachFromBackup() | 3421 | public virtual void DetachFromBackup() |
3398 | { | 3422 | { |
3399 | if (m_scene != null) | 3423 | if (m_scene != null) |
3424 | { | ||
3400 | m_scene.SceneGraph.FireDetachFromBackup(this); | 3425 | m_scene.SceneGraph.FireDetachFromBackup(this); |
3401 | if (Backup && Scene != null) | 3426 | if (Backup) |
3402 | m_scene.EventManager.OnBackup -= ProcessBackup; | 3427 | m_scene.EventManager.OnBackup -= ProcessBackup; |
3403 | 3428 | } | |
3404 | Backup = false; | 3429 | Backup = false; |
3405 | } | 3430 | } |
3406 | 3431 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 01a323e..fcc3463 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -345,6 +345,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
345 | private string m_text = String.Empty; | 345 | private string m_text = String.Empty; |
346 | private string m_touchName = String.Empty; | 346 | private string m_touchName = String.Empty; |
347 | private UndoRedoState m_UndoRedo = null; | 347 | private UndoRedoState m_UndoRedo = null; |
348 | private object m_UndoLock = new object(); | ||
348 | 349 | ||
349 | private bool m_passTouches = false; | 350 | private bool m_passTouches = false; |
350 | private bool m_passCollisions = false; | 351 | private bool m_passCollisions = false; |
@@ -399,13 +400,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
399 | 400 | ||
400 | 401 | ||
401 | // 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound | 402 | // 0 for default collision sounds, -1 for script disabled sound 1 for script defined sound |
402 | private sbyte m_collisionSoundType; | 403 | private sbyte m_collisionSoundType = 0; |
403 | private UUID m_collisionSound; | 404 | private UUID m_collisionSound; |
404 | private float m_collisionSoundVolume; | 405 | private float m_collisionSoundVolume; |
405 | 406 | ||
406 | private int LastColSoundSentTime; | 407 | private int LastColSoundSentTime; |
407 | 408 | ||
408 | |||
409 | private SOPVehicle m_vehicleParams = null; | 409 | private SOPVehicle m_vehicleParams = null; |
410 | 410 | ||
411 | public KeyframeMotion KeyframeMotion | 411 | public KeyframeMotion KeyframeMotion |
@@ -1534,7 +1534,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1534 | else | 1534 | else |
1535 | m_collisionSoundType = 1; | 1535 | m_collisionSoundType = 1; |
1536 | 1536 | ||
1537 | aggregateScriptEvents(); | ||
1538 | } | 1537 | } |
1539 | } | 1538 | } |
1540 | 1539 | ||
@@ -2164,7 +2163,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2164 | UpdatePhysicsSubscribedEvents(); // not sure if appliable here | 2163 | UpdatePhysicsSubscribedEvents(); // not sure if appliable here |
2165 | } | 2164 | } |
2166 | else | 2165 | else |
2166 | { | ||
2167 | PhysActor = null; // just to be sure | 2167 | PhysActor = null; // just to be sure |
2168 | RemFlag(PrimFlags.CameraDecoupled); | ||
2169 | } | ||
2168 | } | 2170 | } |
2169 | } | 2171 | } |
2170 | 2172 | ||
@@ -3539,6 +3541,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
3539 | set | 3541 | set |
3540 | { | 3542 | { |
3541 | m_vehicleParams = value; | 3543 | m_vehicleParams = value; |
3544 | |||
3542 | } | 3545 | } |
3543 | } | 3546 | } |
3544 | 3547 | ||
@@ -3583,7 +3586,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
3583 | 3586 | ||
3584 | m_vehicleParams.ProcessVehicleFlags(param, remove); | 3587 | m_vehicleParams.ProcessVehicleFlags(param, remove); |
3585 | 3588 | ||
3586 | if (_parentID ==0 && PhysActor != null) | 3589 | if (_parentID == 0 && PhysActor != null) |
3587 | { | 3590 | { |
3588 | PhysActor.VehicleFlags(param, remove); | 3591 | PhysActor.VehicleFlags(param, remove); |
3589 | } | 3592 | } |
@@ -3932,11 +3935,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
3932 | 3935 | ||
3933 | public void StoreUndoState(ObjectChangeType change) | 3936 | public void StoreUndoState(ObjectChangeType change) |
3934 | { | 3937 | { |
3935 | if (m_UndoRedo == null) | 3938 | lock (m_UndoLock) |
3936 | m_UndoRedo = new UndoRedoState(5); | ||
3937 | |||
3938 | lock (m_UndoRedo) | ||
3939 | { | 3939 | { |
3940 | if (m_UndoRedo == null) | ||
3941 | m_UndoRedo = new UndoRedoState(5); | ||
3942 | |||
3940 | if (!Undoing && !IgnoreUndoUpdate && ParentGroup != null) // just to read better - undo is in progress, or suspended | 3943 | if (!Undoing && !IgnoreUndoUpdate && ParentGroup != null) // just to read better - undo is in progress, or suspended |
3941 | { | 3944 | { |
3942 | m_UndoRedo.StoreUndo(this, change); | 3945 | m_UndoRedo.StoreUndo(this, change); |
@@ -3959,11 +3962,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
3959 | 3962 | ||
3960 | public void Undo() | 3963 | public void Undo() |
3961 | { | 3964 | { |
3962 | if (m_UndoRedo == null || Undoing || ParentGroup == null) | 3965 | lock (m_UndoLock) |
3963 | return; | ||
3964 | |||
3965 | lock (m_UndoRedo) | ||
3966 | { | 3966 | { |
3967 | if (m_UndoRedo == null || Undoing || ParentGroup == null) | ||
3968 | return; | ||
3969 | |||
3967 | Undoing = true; | 3970 | Undoing = true; |
3968 | m_UndoRedo.Undo(this); | 3971 | m_UndoRedo.Undo(this); |
3969 | Undoing = false; | 3972 | Undoing = false; |
@@ -3972,11 +3975,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
3972 | 3975 | ||
3973 | public void Redo() | 3976 | public void Redo() |
3974 | { | 3977 | { |
3975 | if (m_UndoRedo == null || Undoing || ParentGroup == null) | 3978 | lock (m_UndoLock) |
3976 | return; | ||
3977 | |||
3978 | lock (m_UndoRedo) | ||
3979 | { | 3979 | { |
3980 | if (m_UndoRedo == null || Undoing || ParentGroup == null) | ||
3981 | return; | ||
3982 | |||
3980 | Undoing = true; | 3983 | Undoing = true; |
3981 | m_UndoRedo.Redo(this); | 3984 | m_UndoRedo.Redo(this); |
3982 | Undoing = false; | 3985 | Undoing = false; |
@@ -3985,11 +3988,11 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
3985 | 3988 | ||
3986 | public void ClearUndoState() | 3989 | public void ClearUndoState() |
3987 | { | 3990 | { |
3988 | if (m_UndoRedo == null || Undoing) | 3991 | lock (m_UndoLock) |
3989 | return; | ||
3990 | |||
3991 | lock (m_UndoRedo) | ||
3992 | { | 3992 | { |
3993 | if (m_UndoRedo == null || Undoing) | ||
3994 | return; | ||
3995 | |||
3993 | m_UndoRedo.Clear(); | 3996 | m_UndoRedo.Clear(); |
3994 | } | 3997 | } |
3995 | } | 3998 | } |
@@ -4722,9 +4725,16 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
4722 | if (VolumeDetectActive) // change if not the default only | 4725 | if (VolumeDetectActive) // change if not the default only |
4723 | pa.SetVolumeDetect(1); | 4726 | pa.SetVolumeDetect(1); |
4724 | 4727 | ||
4725 | if (m_vehicleParams != null && LocalId == ParentGroup.RootPart.LocalId) | 4728 | if (m_vehicleParams != null && m_localId == ParentGroup.RootPart.LocalId) |
4729 | { | ||
4726 | m_vehicleParams.SetVehicle(pa); | 4730 | m_vehicleParams.SetVehicle(pa); |
4727 | 4731 | if(isPhysical && !isPhantom && m_vehicleParams.CameraDecoupled) | |
4732 | AddFlag(PrimFlags.CameraDecoupled); | ||
4733 | else | ||
4734 | RemFlag(PrimFlags.CameraDecoupled); | ||
4735 | } | ||
4736 | else | ||
4737 | RemFlag(PrimFlags.CameraDecoupled); | ||
4728 | // we are going to tell rest of code about physics so better have this here | 4738 | // we are going to tell rest of code about physics so better have this here |
4729 | PhysActor = pa; | 4739 | PhysActor = pa; |
4730 | 4740 | ||
@@ -4800,6 +4810,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
4800 | 4810 | ||
4801 | ParentGroup.Scene.EventManager.TriggerObjectRemovedFromPhysicalScene(this); | 4811 | ParentGroup.Scene.EventManager.TriggerObjectRemovedFromPhysicalScene(this); |
4802 | } | 4812 | } |
4813 | RemFlag(PrimFlags.CameraDecoupled); | ||
4803 | PhysActor = null; | 4814 | PhysActor = null; |
4804 | } | 4815 | } |
4805 | 4816 | ||
@@ -5021,7 +5032,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
5021 | } | 5032 | } |
5022 | 5033 | ||
5023 | 5034 | ||
5024 | private void UpdatePhysicsSubscribedEvents() | 5035 | internal void UpdatePhysicsSubscribedEvents() |
5025 | { | 5036 | { |
5026 | PhysicsActor pa = PhysActor; | 5037 | PhysicsActor pa = PhysActor; |
5027 | if (pa == null) | 5038 | if (pa == null) |
@@ -5095,8 +5106,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
5095 | objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop; | 5106 | objectflagupdate |= (uint) PrimFlags.AllowInventoryDrop; |
5096 | } | 5107 | } |
5097 | 5108 | ||
5098 | UpdatePhysicsSubscribedEvents(); | ||
5099 | |||
5100 | LocalFlags = (PrimFlags)objectflagupdate; | 5109 | LocalFlags = (PrimFlags)objectflagupdate; |
5101 | 5110 | ||
5102 | if (ParentGroup != null && ParentGroup.RootPart == this) | 5111 | if (ParentGroup != null && ParentGroup.RootPart == this) |
@@ -5107,6 +5116,7 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
5107 | { | 5116 | { |
5108 | // m_log.DebugFormat( | 5117 | // m_log.DebugFormat( |
5109 | // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); | 5118 | // "[SCENE OBJECT PART]: Scheduling part {0} {1} for full update in aggregateScriptEvents()", Name, LocalId); |
5119 | UpdatePhysicsSubscribedEvents(); | ||
5110 | ScheduleFullUpdate(); | 5120 | ScheduleFullUpdate(); |
5111 | } | 5121 | } |
5112 | } | 5122 | } |
@@ -5408,5 +5418,24 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
5408 | Acceleration = Vector3.Zero; | 5418 | Acceleration = Vector3.Zero; |
5409 | APIDActive = false; | 5419 | APIDActive = false; |
5410 | } | 5420 | } |
5421 | |||
5422 | // handle osVolumeDetect | ||
5423 | public void ScriptSetVolumeDetect(bool makeVolumeDetect) | ||
5424 | { | ||
5425 | if(_parentID == 0) | ||
5426 | { | ||
5427 | // if root prim do it via SOG | ||
5428 | ParentGroup.ScriptSetVolumeDetect(makeVolumeDetect); | ||
5429 | return; | ||
5430 | } | ||
5431 | |||
5432 | bool wasUsingPhysics = ((Flags & PrimFlags.Physics) != 0); | ||
5433 | bool wasTemporary = ((Flags & PrimFlags.TemporaryOnRez) != 0); | ||
5434 | bool wasPhantom = ((Flags & PrimFlags.Phantom) != 0); | ||
5435 | |||
5436 | if(PhysActor != null) | ||
5437 | PhysActor.Building = true; | ||
5438 | UpdatePrimFlags(wasUsingPhysics,wasTemporary,wasPhantom,makeVolumeDetect,false); | ||
5439 | } | ||
5411 | } | 5440 | } |
5412 | } | 5441 | } |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 732d5ef..cb7422b 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -542,10 +542,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
542 | 542 | ||
543 | public Vector3 CameraPosition { get; set; } | 543 | public Vector3 CameraPosition { get; set; } |
544 | 544 | ||
545 | public Quaternion CameraRotation | 545 | public Quaternion CameraRotation { get; private set; } |
546 | { | ||
547 | get { return Util.Axes2Rot(CameraAtAxis, CameraLeftAxis, CameraUpAxis); } | ||
548 | } | ||
549 | 546 | ||
550 | // Use these three vectors to figure out what the agent is looking at | 547 | // Use these three vectors to figure out what the agent is looking at |
551 | // Convert it to a Matrix and/or Quaternion | 548 | // Convert it to a Matrix and/or Quaternion |
@@ -1242,6 +1239,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1242 | ParentPart = part; | 1239 | ParentPart = part; |
1243 | m_pos = PrevSitOffset; | 1240 | m_pos = PrevSitOffset; |
1244 | pos = part.GetWorldPosition(); | 1241 | pos = part.GetWorldPosition(); |
1242 | PhysicsActor partPhysActor = part.PhysActor; | ||
1243 | if(partPhysActor != null) | ||
1244 | { | ||
1245 | partPhysActor.OnPhysicsRequestingCameraData -= | ||
1246 | physActor_OnPhysicsRequestingCameraData; | ||
1247 | partPhysActor.OnPhysicsRequestingCameraData += | ||
1248 | physActor_OnPhysicsRequestingCameraData; | ||
1249 | } | ||
1245 | } | 1250 | } |
1246 | ParentUUID = UUID.Zero; | 1251 | ParentUUID = UUID.Zero; |
1247 | } | 1252 | } |
@@ -1922,6 +1927,31 @@ namespace OpenSim.Region.Framework.Scenes | |||
1922 | return true; | 1927 | return true; |
1923 | } | 1928 | } |
1924 | 1929 | ||
1930 | public void RotateToLookAt(Vector3 lookAt) | ||
1931 | { | ||
1932 | if(ParentID == 0) | ||
1933 | { | ||
1934 | float n = lookAt.X * lookAt.X + lookAt.Y * lookAt.Y; | ||
1935 | if(n < 0.0001f) | ||
1936 | { | ||
1937 | Rotation = Quaternion.Identity; | ||
1938 | return; | ||
1939 | } | ||
1940 | n = lookAt.X/(float)Math.Sqrt(n); | ||
1941 | float angle = (float)Math.Acos(n); | ||
1942 | angle *= 0.5f; | ||
1943 | float s = (float)Math.Sin(angle); | ||
1944 | if(lookAt.Y < 0) | ||
1945 | s = -s; | ||
1946 | Rotation = new Quaternion( | ||
1947 | 0f, | ||
1948 | 0f, | ||
1949 | s, | ||
1950 | (float)Math.Cos(angle) | ||
1951 | ); | ||
1952 | } | ||
1953 | } | ||
1954 | |||
1925 | /// <summary> | 1955 | /// <summary> |
1926 | /// Complete Avatar's movement into the region. | 1956 | /// Complete Avatar's movement into the region. |
1927 | /// </summary> | 1957 | /// </summary> |
@@ -1958,10 +1988,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1958 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); | 1988 | bool flying = ((m_AgentControlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0); |
1959 | 1989 | ||
1960 | Vector3 look = Lookat; | 1990 | Vector3 look = Lookat; |
1991 | look.Z = 0f; | ||
1961 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01)) | 1992 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01)) |
1962 | { | 1993 | { |
1963 | look = Velocity; | 1994 | look = Velocity; |
1964 | look.Z = 0; | ||
1965 | look.Normalize(); | 1995 | look.Normalize(); |
1966 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01) ) | 1996 | if ((Math.Abs(look.X) < 0.01) && (Math.Abs(look.Y) < 0.01) ) |
1967 | look = new Vector3(0.99f, 0.042f, 0); | 1997 | look = new Vector3(0.99f, 0.042f, 0); |
@@ -1995,11 +2025,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1995 | m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF); | 2025 | m_log.DebugFormat("[CompleteMovement]: Missing COF for {0} is {1}", client.AgentId, COF); |
1996 | } | 2026 | } |
1997 | 2027 | ||
2028 | if(!gotCrossUpdate) | ||
2029 | RotateToLookAt(look); | ||
1998 | 2030 | ||
1999 | // Tell the client that we're totally ready | 2031 | // Tell the client that we're totally ready |
2000 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); | 2032 | ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); |
2001 | 2033 | ||
2002 | |||
2003 | m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); | 2034 | m_log.DebugFormat("[CompleteMovement] MoveAgentIntoRegion: {0}ms", Util.EnvironmentTickCountSubtract(ts)); |
2004 | 2035 | ||
2005 | if (!string.IsNullOrEmpty(m_callbackURI)) | 2036 | if (!string.IsNullOrEmpty(m_callbackURI)) |
@@ -2696,9 +2727,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2696 | CameraPosition = agentData.CameraCenter; | 2727 | CameraPosition = agentData.CameraCenter; |
2697 | // Use these three vectors to figure out what the agent is looking at | 2728 | // Use these three vectors to figure out what the agent is looking at |
2698 | // Convert it to a Matrix and/or Quaternion | 2729 | // Convert it to a Matrix and/or Quaternion |
2730 | |||
2731 | // this my need lock | ||
2699 | CameraAtAxis = agentData.CameraAtAxis; | 2732 | CameraAtAxis = agentData.CameraAtAxis; |
2700 | CameraLeftAxis = agentData.CameraLeftAxis; | 2733 | CameraLeftAxis = agentData.CameraLeftAxis; |
2701 | CameraUpAxis = agentData.CameraUpAxis; | 2734 | CameraUpAxis = agentData.CameraUpAxis; |
2735 | Quaternion camRot = Util.Axes2Rot(CameraAtAxis, CameraLeftAxis, CameraUpAxis); | ||
2736 | CameraRotation = camRot; | ||
2702 | 2737 | ||
2703 | // The Agent's Draw distance setting | 2738 | // The Agent's Draw distance setting |
2704 | // When we get to the point of re-computing neighbors everytime this | 2739 | // When we get to the point of re-computing neighbors everytime this |
@@ -3171,9 +3206,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3171 | offset = offset * part.RotationOffset; | 3206 | offset = offset * part.RotationOffset; |
3172 | offset += part.OffsetPosition; | 3207 | offset += part.OffsetPosition; |
3173 | 3208 | ||
3174 | if (CameraAtAxis == Vector3.Zero && cameraEyeOffset == Vector3.Zero) | 3209 | if (cameraAtOffset == Vector3.Zero && cameraEyeOffset == Vector3.Zero) |
3175 | { | 3210 | { |
3176 | CameraAtAxis = part.ParentGroup.RootPart.GetCameraAtOffset(); | 3211 | cameraAtOffset = part.ParentGroup.RootPart.GetCameraAtOffset(); |
3177 | cameraEyeOffset = part.ParentGroup.RootPart.GetCameraEyeOffset(); | 3212 | cameraEyeOffset = part.ParentGroup.RootPart.GetCameraEyeOffset(); |
3178 | } | 3213 | } |
3179 | else | 3214 | else |
@@ -3304,7 +3339,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3304 | Vector3 cameraEyeOffset = part.GetCameraEyeOffset(); | 3339 | Vector3 cameraEyeOffset = part.GetCameraEyeOffset(); |
3305 | bool forceMouselook = part.GetForceMouselook(); | 3340 | bool forceMouselook = part.GetForceMouselook(); |
3306 | 3341 | ||
3307 | m_bodyRot = Orientation; | ||
3308 | 3342 | ||
3309 | if (!part.IsRoot) | 3343 | if (!part.IsRoot) |
3310 | { | 3344 | { |
@@ -3312,9 +3346,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
3312 | offset = offset * part.RotationOffset; | 3346 | offset = offset * part.RotationOffset; |
3313 | offset += part.OffsetPosition; | 3347 | offset += part.OffsetPosition; |
3314 | 3348 | ||
3315 | if (CameraAtAxis == Vector3.Zero && cameraEyeOffset == Vector3.Zero) | 3349 | if (cameraAtOffset == Vector3.Zero && cameraEyeOffset == Vector3.Zero) |
3316 | { | 3350 | { |
3317 | CameraAtAxis = part.ParentGroup.RootPart.GetCameraAtOffset(); | 3351 | cameraAtOffset = part.ParentGroup.RootPart.GetCameraAtOffset(); |
3318 | cameraEyeOffset = part.ParentGroup.RootPart.GetCameraEyeOffset(); | 3352 | cameraEyeOffset = part.ParentGroup.RootPart.GetCameraEyeOffset(); |
3319 | } | 3353 | } |
3320 | else | 3354 | else |
@@ -3326,6 +3360,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3326 | } | 3360 | } |
3327 | } | 3361 | } |
3328 | 3362 | ||
3363 | m_bodyRot = Orientation; | ||
3329 | m_pos = offset; | 3364 | m_pos = offset; |
3330 | 3365 | ||
3331 | ControllingClient.SendSitResponse( | 3366 | ControllingClient.SendSitResponse( |
@@ -4571,6 +4606,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
4571 | CameraAtAxis = cAgent.AtAxis; | 4606 | CameraAtAxis = cAgent.AtAxis; |
4572 | CameraLeftAxis = cAgent.LeftAxis; | 4607 | CameraLeftAxis = cAgent.LeftAxis; |
4573 | CameraUpAxis = cAgent.UpAxis; | 4608 | CameraUpAxis = cAgent.UpAxis; |
4609 | |||
4610 | Quaternion camRot = Util.Axes2Rot(CameraAtAxis, CameraLeftAxis, CameraUpAxis); | ||
4611 | CameraRotation = camRot; | ||
4612 | |||
4613 | |||
4574 | ParentUUID = cAgent.ParentPart; | 4614 | ParentUUID = cAgent.ParentPart; |
4575 | PrevSitOffset = cAgent.SitOffset; | 4615 | PrevSitOffset = cAgent.SitOffset; |
4576 | 4616 | ||
@@ -5429,10 +5469,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
5429 | } | 5469 | } |
5430 | } | 5470 | } |
5431 | 5471 | ||
5472 | CameraData physActor_OnPhysicsRequestingCameraData() | ||
5473 | { | ||
5474 | return new CameraData | ||
5475 | { | ||
5476 | Valid = true, | ||
5477 | MouseLook = this.m_mouseLook, | ||
5478 | CameraRotation = this.CameraRotation, | ||
5479 | CameraAtAxis = this.CameraAtAxis | ||
5480 | }; | ||
5481 | } | ||
5482 | |||
5432 | public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID) | 5483 | public void RegisterControlEventsToScript(int controls, int accept, int pass_on, uint Obj_localID, UUID Script_item_UUID) |
5433 | { | 5484 | { |
5434 | SceneObjectPart p = m_scene.GetSceneObjectPart(Obj_localID); | 5485 | SceneObjectPart part = m_scene.GetSceneObjectPart(Obj_localID); |
5435 | if (p == null) | 5486 | if (part == null) |
5436 | return; | 5487 | return; |
5437 | 5488 | ||
5438 | ControllingClient.SendTakeControls(controls, false, false); | 5489 | ControllingClient.SendTakeControls(controls, false, false); |
@@ -5442,7 +5493,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5442 | obj.ignoreControls = ScriptControlled.CONTROL_ZERO; | 5493 | obj.ignoreControls = ScriptControlled.CONTROL_ZERO; |
5443 | obj.eventControls = ScriptControlled.CONTROL_ZERO; | 5494 | obj.eventControls = ScriptControlled.CONTROL_ZERO; |
5444 | 5495 | ||
5445 | obj.objectID = p.ParentGroup.UUID; | 5496 | obj.objectID = part.ParentGroup.UUID; |
5446 | obj.itemID = Script_item_UUID; | 5497 | obj.itemID = Script_item_UUID; |
5447 | if (pass_on == 0 && accept == 0) | 5498 | if (pass_on == 0 && accept == 0) |
5448 | { | 5499 | { |
@@ -5470,17 +5521,43 @@ namespace OpenSim.Region.Framework.Scenes | |||
5470 | { | 5521 | { |
5471 | IgnoredControls &= ~(ScriptControlled)controls; | 5522 | IgnoredControls &= ~(ScriptControlled)controls; |
5472 | if (scriptedcontrols.ContainsKey(Script_item_UUID)) | 5523 | if (scriptedcontrols.ContainsKey(Script_item_UUID)) |
5473 | scriptedcontrols.Remove(Script_item_UUID); | 5524 | RemoveScriptFromControlNotifications(Script_item_UUID, part); |
5474 | } | 5525 | } |
5475 | else | 5526 | else |
5476 | { | 5527 | { |
5477 | scriptedcontrols[Script_item_UUID] = obj; | 5528 | AddScriptToControlNotifications(Script_item_UUID, part, ref obj); |
5478 | } | 5529 | } |
5479 | } | 5530 | } |
5480 | 5531 | ||
5481 | ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true); | 5532 | ControllingClient.SendTakeControls(controls, pass_on == 1 ? true : false, true); |
5482 | } | 5533 | } |
5483 | 5534 | ||
5535 | private void AddScriptToControlNotifications(OpenMetaverse.UUID Script_item_UUID, SceneObjectPart part, ref ScriptControllers obj) | ||
5536 | { | ||
5537 | scriptedcontrols[Script_item_UUID] = obj; | ||
5538 | |||
5539 | PhysicsActor physActor = part.ParentGroup.RootPart.PhysActor; | ||
5540 | if (physActor != null) | ||
5541 | { | ||
5542 | physActor.OnPhysicsRequestingCameraData -= physActor_OnPhysicsRequestingCameraData; | ||
5543 | physActor.OnPhysicsRequestingCameraData += physActor_OnPhysicsRequestingCameraData; | ||
5544 | } | ||
5545 | } | ||
5546 | |||
5547 | private void RemoveScriptFromControlNotifications(OpenMetaverse.UUID Script_item_UUID, SceneObjectPart part) | ||
5548 | { | ||
5549 | scriptedcontrols.Remove(Script_item_UUID); | ||
5550 | |||
5551 | if (part != null) | ||
5552 | { | ||
5553 | PhysicsActor physActor = part.ParentGroup.RootPart.PhysActor; | ||
5554 | if (physActor != null) | ||
5555 | { | ||
5556 | physActor.OnPhysicsRequestingCameraData -= physActor_OnPhysicsRequestingCameraData; | ||
5557 | } | ||
5558 | } | ||
5559 | } | ||
5560 | |||
5484 | public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID) | 5561 | public void HandleForceReleaseControls(IClientAPI remoteClient, UUID agentID) |
5485 | { | 5562 | { |
5486 | IgnoredControls = ScriptControlled.CONTROL_ZERO; | 5563 | IgnoredControls = ScriptControlled.CONTROL_ZERO; |
@@ -5518,6 +5595,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5518 | public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) | 5595 | public void UnRegisterControlEventsToScript(uint Obj_localID, UUID Script_item_UUID) |
5519 | { | 5596 | { |
5520 | ScriptControllers takecontrols; | 5597 | ScriptControllers takecontrols; |
5598 | SceneObjectPart part = m_scene.GetSceneObjectPart(Obj_localID); | ||
5521 | 5599 | ||
5522 | lock (scriptedcontrols) | 5600 | lock (scriptedcontrols) |
5523 | { | 5601 | { |
@@ -5528,7 +5606,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5528 | ControllingClient.SendTakeControls((int)sctc, false, false); | 5606 | ControllingClient.SendTakeControls((int)sctc, false, false); |
5529 | ControllingClient.SendTakeControls((int)sctc, true, false); | 5607 | ControllingClient.SendTakeControls((int)sctc, true, false); |
5530 | 5608 | ||
5531 | scriptedcontrols.Remove(Script_item_UUID); | 5609 | RemoveScriptFromControlNotifications(Script_item_UUID, part); |
5532 | IgnoredControls = ScriptControlled.CONTROL_ZERO; | 5610 | IgnoredControls = ScriptControlled.CONTROL_ZERO; |
5533 | foreach (ScriptControllers scData in scriptedcontrols.Values) | 5611 | foreach (ScriptControllers scData in scriptedcontrols.Values) |
5534 | { | 5612 | { |
@@ -5947,6 +6025,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5947 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) | 6025 | (m_teleportFlags & Constants.TeleportFlags.ViaHGLogin) != 0)) |
5948 | { | 6026 | { |
5949 | pos = land.LandData.UserLocation; | 6027 | pos = land.LandData.UserLocation; |
6028 | positionChanged = true; | ||
5950 | } | 6029 | } |
5951 | } | 6030 | } |
5952 | 6031 | ||
diff --git a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs index e21d69f..427b48e 100644 --- a/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs +++ b/OpenSim/Region/OptionalModules/Agent/InternetRelayClientView/Server/IRCClientView.cs | |||
@@ -1753,6 +1753,10 @@ namespace OpenSim.Region.OptionalModules.Agent.InternetRelayClientView.Server | |||
1753 | { | 1753 | { |
1754 | } | 1754 | } |
1755 | 1755 | ||
1756 | public void SendSelectedPartsProprieties(List<ISceneEntity> parts) | ||
1757 | { | ||
1758 | } | ||
1759 | |||
1756 | public void SendPartPhysicsProprieties(ISceneEntity entity) | 1760 | public void SendPartPhysicsProprieties(ISceneEntity entity) |
1757 | { | 1761 | { |
1758 | } | 1762 | } |
diff --git a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs index 5b9a5b5..941379f 100644 --- a/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs +++ b/OpenSim/Region/OptionalModules/Avatar/Chat/IRCConnector.cs | |||
@@ -270,7 +270,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
270 | 270 | ||
271 | public void Close() | 271 | public void Close() |
272 | { | 272 | { |
273 | |||
274 | m_log.InfoFormat("[IRC-Connector-{0}] Closing", idn); | 273 | m_log.InfoFormat("[IRC-Connector-{0}] Closing", idn); |
275 | 274 | ||
276 | lock (msyncConnect) | 275 | lock (msyncConnect) |
@@ -295,7 +294,6 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
295 | } | 294 | } |
296 | catch (Exception) { } | 295 | catch (Exception) { } |
297 | 296 | ||
298 | |||
299 | m_connected = false; | 297 | m_connected = false; |
300 | 298 | ||
301 | try { m_writer.Close(); } | 299 | try { m_writer.Close(); } |
@@ -308,10 +306,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
308 | catch (Exception) { } | 306 | catch (Exception) { } |
309 | 307 | ||
310 | } | 308 | } |
311 | |||
312 | lock (m_connectors) | 309 | lock (m_connectors) |
313 | m_connectors.Remove(this); | 310 | m_connectors.Remove(this); |
314 | |||
315 | } | 311 | } |
316 | } | 312 | } |
317 | 313 | ||
@@ -327,25 +323,21 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
327 | 323 | ||
328 | public void Connect() | 324 | public void Connect() |
329 | { | 325 | { |
330 | |||
331 | if (!m_enabled) | 326 | if (!m_enabled) |
332 | return; | 327 | return; |
333 | 328 | ||
334 | // Delay until next WD cycle if this is too close to the last start attempt | 329 | // Delay until next WD cycle if this is too close to the last start attempt |
335 | 330 | if(_icc_ < ICCD_PERIOD) | |
336 | while (_icc_ < ICCD_PERIOD) | ||
337 | return; | 331 | return; |
338 | 332 | ||
339 | m_log.DebugFormat("[IRC-Connector-{0}]: Connection request for {1} on {2}:{3}", idn, m_nick, m_server, m_ircChannel); | 333 | m_log.DebugFormat("[IRC-Connector-{0}]: Connection request for {1} on {2}:{3}", idn, m_nick, m_server, m_ircChannel); |
340 | 334 | ||
335 | _icc_ = 0; | ||
336 | |||
341 | lock (msyncConnect) | 337 | lock (msyncConnect) |
342 | { | 338 | { |
343 | |||
344 | _icc_ = 0; | ||
345 | |||
346 | try | 339 | try |
347 | { | 340 | { |
348 | |||
349 | if (m_connected) return; | 341 | if (m_connected) return; |
350 | 342 | ||
351 | m_connected = true; | 343 | m_connected = true; |
@@ -379,11 +371,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.Chat | |||
379 | // expires. By leaving them as they are, the connection will be retried | 371 | // expires. By leaving them as they are, the connection will be retried |
380 | // when the login timeout expires. Which is preferred. | 372 | // when the login timeout expires. Which is preferred. |
381 | } | 373 | } |
382 | |||
383 | } | 374 | } |
384 | 375 | ||
385 | return; | 376 | return; |
386 | |||
387 | } | 377 | } |
388 | 378 | ||
389 | // Reconnect is used to force a re-cycle of the IRC connection. Should generally | 379 | // Reconnect is used to force a re-cycle of the IRC connection. Should generally |
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs index 626937c..81add13 100644 --- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs +++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs | |||
@@ -1177,18 +1177,16 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1177 | } | 1177 | } |
1178 | 1178 | ||
1179 | GroupRecord groupInfo = m_groupData.GetGroupRecord(agentID, groupID, null); | 1179 | GroupRecord groupInfo = m_groupData.GetGroupRecord(agentID, groupID, null); |
1180 | 1180 | if (groupInfo == null) | |
1181 | UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, ejecteeID); | ||
1182 | if ((groupInfo == null) || (account == null)) | ||
1183 | { | ||
1184 | return; | 1181 | return; |
1185 | } | 1182 | |
1186 | 1183 | ||
1187 | IClientAPI ejecteeClient = GetActiveRootClient(ejecteeID); | 1184 | IClientAPI ejecteeClient = GetActiveRootClient(ejecteeID); |
1188 | 1185 | ||
1189 | // Send Message to Ejectee | 1186 | // Send Message to Ejectee |
1190 | GridInstantMessage msg = new GridInstantMessage(); | 1187 | GridInstantMessage msg = new GridInstantMessage(); |
1191 | 1188 | ||
1189 | string ejecteeName = "Unknown member"; | ||
1192 | // if local send a normal message | 1190 | // if local send a normal message |
1193 | if(ejecteeClient != null) | 1191 | if(ejecteeClient != null) |
1194 | { | 1192 | { |
@@ -1197,6 +1195,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1197 | // also execute and send update | 1195 | // also execute and send update |
1198 | ejecteeClient.SendAgentDropGroup(groupID); | 1196 | ejecteeClient.SendAgentDropGroup(groupID); |
1199 | SendAgentGroupDataUpdate(ejecteeClient,true); | 1197 | SendAgentGroupDataUpdate(ejecteeClient,true); |
1198 | ejecteeName = ejecteeClient.Name; | ||
1200 | } | 1199 | } |
1201 | else // send | 1200 | else // send |
1202 | { | 1201 | { |
@@ -1208,6 +1207,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1208 | 1207 | ||
1209 | msg.imSessionID = groupInfo.GroupID.Guid; | 1208 | msg.imSessionID = groupInfo.GroupID.Guid; |
1210 | msg.dialog = (byte)210; //interop | 1209 | msg.dialog = (byte)210; //interop |
1210 | UserAccount account = m_sceneList[0].UserAccountService.GetUserAccount(regionInfo.ScopeID, ejecteeID); | ||
1211 | if (account != null) | ||
1212 | ejecteeName = account.FirstName + " " + account.LastName; | ||
1211 | } | 1213 | } |
1212 | 1214 | ||
1213 | msg.fromAgentID = agentID.Guid; | 1215 | msg.fromAgentID = agentID.Guid; |
@@ -1234,14 +1236,9 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups | |||
1234 | msg.toAgentID = agentID.Guid; | 1236 | msg.toAgentID = agentID.Guid; |
1235 | msg.timestamp = 0; | 1237 | msg.timestamp = 0; |
1236 | msg.fromAgentName = agentName; | 1238 | msg.fromAgentName = agentName; |
1237 | if (account != null) | 1239 | |
1238 | { | 1240 | msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, ejecteeName); |
1239 | msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, account.FirstName + " " + account.LastName); | 1241 | |
1240 | } | ||
1241 | else | ||
1242 | { | ||
1243 | msg.message = string.Format("{2} has been ejected from '{1}' by {0}.", agentName, groupInfo.GroupName, "Unknown member"); | ||
1244 | } | ||
1245 | // msg.dialog = (byte)210; //interop | 1242 | // msg.dialog = (byte)210; //interop |
1246 | msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent; | 1243 | msg.dialog = (byte)OpenMetaverse.InstantMessageDialog.MessageFromAgent; |
1247 | msg.fromGroup = false; | 1244 | msg.fromGroup = false; |
diff --git a/OpenSim/Region/OptionalModules/UserStatistics/Clients_report.cs b/OpenSim/Region/OptionalModules/UserStatistics/Clients_report.cs index 4a6f7be..3f36e32 100644 --- a/OpenSim/Region/OptionalModules/UserStatistics/Clients_report.cs +++ b/OpenSim/Region/OptionalModules/UserStatistics/Clients_report.cs | |||
@@ -97,9 +97,8 @@ namespace OpenSim.Region.UserStatistics | |||
97 | sdr.Read(); | 97 | sdr.Read(); |
98 | totalregions = Convert.ToInt32(sdr["regcnt"]); | 98 | totalregions = Convert.ToInt32(sdr["regcnt"]); |
99 | } | 99 | } |
100 | |||
101 | sdr.Close(); | 100 | sdr.Close(); |
102 | sdr.Dispose(); | 101 | cmd.Dispose(); |
103 | 102 | ||
104 | sql = | 103 | sql = |
105 | "select client_version, count(*) as cnt, avg(avg_sim_fps) as simfps from stats_session_data group by client_version order by count(*) desc LIMIT 10;"; | 104 | "select client_version, count(*) as cnt, avg(avg_sim_fps) as simfps from stats_session_data group by client_version order by count(*) desc LIMIT 10;"; |
@@ -120,7 +119,7 @@ namespace OpenSim.Region.UserStatistics | |||
120 | } | 119 | } |
121 | } | 120 | } |
122 | sdr.Close(); | 121 | sdr.Close(); |
123 | sdr.Dispose(); | 122 | cmd.Dispose(); |
124 | 123 | ||
125 | if (totalregions > 1) | 124 | if (totalregions > 1) |
126 | { | 125 | { |
@@ -143,11 +142,8 @@ namespace OpenSim.Region.UserStatistics | |||
143 | } | 142 | } |
144 | } | 143 | } |
145 | sdr.Close(); | 144 | sdr.Close(); |
146 | sdr.Dispose(); | 145 | cmd.Dispose(); |
147 | |||
148 | |||
149 | } | 146 | } |
150 | |||
151 | } | 147 | } |
152 | 148 | ||
153 | foreach (ClientVersionData cvd in cliRegData) | 149 | foreach (ClientVersionData cvd in cliRegData) |
@@ -163,9 +159,6 @@ namespace OpenSim.Region.UserStatistics | |||
163 | { | 159 | { |
164 | regionTotals.Add(cvd.region_id, cvd.count); | 160 | regionTotals.Add(cvd.region_id, cvd.count); |
165 | } | 161 | } |
166 | |||
167 | |||
168 | |||
169 | } | 162 | } |
170 | 163 | ||
171 | modeldata["ClientData"] = clidata; | 164 | modeldata["ClientData"] = clidata; |
diff --git a/OpenSim/Region/OptionalModules/UserStatistics/Default_Report.cs b/OpenSim/Region/OptionalModules/UserStatistics/Default_Report.cs index fabe3d4..8745acd 100644 --- a/OpenSim/Region/OptionalModules/UserStatistics/Default_Report.cs +++ b/OpenSim/Region/OptionalModules/UserStatistics/Default_Report.cs | |||
@@ -227,7 +227,10 @@ TD.align_top { vertical-align: top; } | |||
227 | returnstruct.avg_client_mem_use = Convert.ToSingle(sdr["sav_mem_use"]); | 227 | returnstruct.avg_client_mem_use = Convert.ToSingle(sdr["sav_mem_use"]); |
228 | 228 | ||
229 | } | 229 | } |
230 | sdr.Close(); | ||
231 | cmd.Dispose(); | ||
230 | } | 232 | } |
233 | |||
231 | return returnstruct; | 234 | return returnstruct; |
232 | } | 235 | } |
233 | 236 | ||
diff --git a/OpenSim/Region/OptionalModules/UserStatistics/Sessions_Report.cs b/OpenSim/Region/OptionalModules/UserStatistics/Sessions_Report.cs index 0e94912..74e9c66 100644 --- a/OpenSim/Region/OptionalModules/UserStatistics/Sessions_Report.cs +++ b/OpenSim/Region/OptionalModules/UserStatistics/Sessions_Report.cs | |||
@@ -145,8 +145,7 @@ namespace OpenSim.Region.UserStatistics | |||
145 | } | 145 | } |
146 | } | 146 | } |
147 | sdr.Close(); | 147 | sdr.Close(); |
148 | sdr.Dispose(); | 148 | cmd.Dispose(); |
149 | |||
150 | } | 149 | } |
151 | modeldata["SessionData"] = lstSessions; | 150 | modeldata["SessionData"] = lstSessions; |
152 | return modeldata; | 151 | return modeldata; |
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs index 52e8660..07413cf 100644 --- a/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs +++ b/OpenSim/Region/OptionalModules/World/NPC/NPCAvatar.cs | |||
@@ -1337,6 +1337,10 @@ namespace OpenSim.Region.OptionalModules.World.NPC | |||
1337 | { | 1337 | { |
1338 | } | 1338 | } |
1339 | 1339 | ||
1340 | public void SendSelectedPartsProprieties(List<ISceneEntity> parts) | ||
1341 | { | ||
1342 | } | ||
1343 | |||
1340 | public void SendPartPhysicsProprieties(ISceneEntity entity) | 1344 | public void SendPartPhysicsProprieties(ISceneEntity entity) |
1341 | { | 1345 | { |
1342 | } | 1346 | } |
diff --git a/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs b/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs index 9b677be..ee57f0c 100644 --- a/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs +++ b/OpenSim/Region/PhysicsModules/BulletS/BSScene.cs | |||
@@ -954,25 +954,6 @@ namespace OpenSim.Region.PhysicsModule.BulletS | |||
954 | // m_log.DebugFormat("{0}: DeleteTerrain()", LogHeader); | 954 | // m_log.DebugFormat("{0}: DeleteTerrain()", LogHeader); |
955 | } | 955 | } |
956 | 956 | ||
957 | // Although no one seems to check this, I do support combining. | ||
958 | public override bool SupportsCombining() | ||
959 | { | ||
960 | return TerrainManager.SupportsCombining(); | ||
961 | } | ||
962 | // This call says I am a child to region zero in a mega-region. 'pScene' is that | ||
963 | // of region zero, 'offset' is my offset from regions zero's origin, and | ||
964 | // 'extents' is the largest XY that is handled in my region. | ||
965 | public override void Combine(PhysicsScene pScene, Vector3 offset, Vector3 extents) | ||
966 | { | ||
967 | TerrainManager.Combine(pScene, offset, extents); | ||
968 | } | ||
969 | |||
970 | // Unhook all the combining that I know about. | ||
971 | public override void UnCombine(PhysicsScene pScene) | ||
972 | { | ||
973 | TerrainManager.UnCombine(pScene); | ||
974 | } | ||
975 | |||
976 | #endregion // Terrain | 957 | #endregion // Terrain |
977 | 958 | ||
978 | public override Dictionary<uint, float> GetTopColliders() | 959 | public override Dictionary<uint, float> GetTopColliders() |
diff --git a/OpenSim/Region/PhysicsModules/ConvexDecompositionDotNet/HullUtils.cs b/OpenSim/Region/PhysicsModules/ConvexDecompositionDotNet/HullUtils.cs index b0bbfb9..72f2d6d 100644 --- a/OpenSim/Region/PhysicsModules/ConvexDecompositionDotNet/HullUtils.cs +++ b/OpenSim/Region/PhysicsModules/ConvexDecompositionDotNet/HullUtils.cs | |||
@@ -1074,14 +1074,27 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1074 | public static int maxdirfiltered(List<float3> p, int count, float3 dir, byte[] allow) | 1074 | public static int maxdirfiltered(List<float3> p, int count, float3 dir, byte[] allow) |
1075 | { | 1075 | { |
1076 | //Debug.Assert(count != 0); | 1076 | //Debug.Assert(count != 0); |
1077 | int m = 0; | 1077 | int m = -1; |
1078 | float currDotm = float3.dot(p[0], dir); | 1078 | float currDotm = 0; |
1079 | float currDoti; | 1079 | float currDoti; |
1080 | 1080 | ||
1081 | while (allow[m] == 0) | 1081 | for (int i = 0; i < count; i++) |
1082 | m++; | 1082 | { |
1083 | if (allow[i] != 0) | ||
1084 | { | ||
1085 | currDotm = float3.dot(p[i], dir); | ||
1086 | m = i; | ||
1087 | break; | ||
1088 | } | ||
1089 | } | ||
1083 | 1090 | ||
1084 | for (int i = 1; i < count; i++) | 1091 | if(m == -1) |
1092 | { | ||
1093 | Debug.Assert(false); | ||
1094 | return m; | ||
1095 | } | ||
1096 | |||
1097 | for (int i = m + 1; i < count; i++) | ||
1085 | { | 1098 | { |
1086 | if (allow[i] != 0) | 1099 | if (allow[i] != 0) |
1087 | { | 1100 | { |
@@ -1093,7 +1106,8 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1093 | } | 1106 | } |
1094 | } | 1107 | } |
1095 | } | 1108 | } |
1096 | //Debug.Assert(m != -1); | 1109 | |
1110 | // Debug.Assert(m != -1); | ||
1097 | return m; | 1111 | return m; |
1098 | } | 1112 | } |
1099 | 1113 | ||
@@ -1112,8 +1126,8 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1112 | { | 1126 | { |
1113 | int mb; | 1127 | int mb; |
1114 | { | 1128 | { |
1115 | float s = (float)Math.Sin((3.14159264f / 180.0f) * (x)); | 1129 | float s = (float)Math.Sin(0.01745329f * x); |
1116 | float c = (float)Math.Cos((3.14159264f / 180.0f) * (x)); | 1130 | float c = (float)Math.Cos(0.01745329f * x); |
1117 | mb = maxdirfiltered(p, count, dir + (u * s + v * c) * 0.025f, allow); | 1131 | mb = maxdirfiltered(p, count, dir + (u * s + v * c) * 0.025f, allow); |
1118 | } | 1132 | } |
1119 | if (ma == m && mb == m) | 1133 | if (ma == m && mb == m) |
@@ -1126,8 +1140,8 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1126 | int mc = ma; | 1140 | int mc = ma; |
1127 | for (float xx = x - 40.0f; xx <= x; xx += 5.0f) | 1141 | for (float xx = x - 40.0f; xx <= x; xx += 5.0f) |
1128 | { | 1142 | { |
1129 | float s = (float)Math.Sin((3.14159264f / 180.0f) * (xx)); | 1143 | float s = (float)Math.Sin(0.01745329f * xx); |
1130 | float c = (float)Math.Cos((3.14159264f / 180.0f) * (xx)); | 1144 | float c = (float)Math.Cos(0.01745329f * xx); |
1131 | int md = maxdirfiltered(p, count, dir + (u * s + v * c) * 0.025f, allow); | 1145 | int md = maxdirfiltered(p, count, dir + (u * s + v * c) * 0.025f, allow); |
1132 | if (mc == m && md == m) | 1146 | if (mc == m && md == m) |
1133 | { | 1147 | { |
@@ -1176,7 +1190,7 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1176 | Debug.Assert(!(p0 == p1 || p0 == p2 || p0 == p3 || p1 == p2 || p1 == p3 || p2 == p3)); | 1190 | Debug.Assert(!(p0 == p1 || p0 == p2 || p0 == p3 || p1 == p2 || p1 == p3 || p2 == p3)); |
1177 | if (float3.dot(verts[p3] - verts[p0], float3.cross(verts[p1] - verts[p0], verts[p2] - verts[p0])) < 0) | 1191 | if (float3.dot(verts[p3] - verts[p0], float3.cross(verts[p1] - verts[p0], verts[p2] - verts[p0])) < 0) |
1178 | { | 1192 | { |
1179 | Swap(ref p2, ref p3); | 1193 | return new int4(p0, p1, p3, p2); |
1180 | } | 1194 | } |
1181 | return new int4(p0, p1, p2, p3); | 1195 | return new int4(p0, p1, p2, p3); |
1182 | } | 1196 | } |
@@ -1207,12 +1221,12 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1207 | int j; | 1221 | int j; |
1208 | float3 bmin = new float3(verts[0]); | 1222 | float3 bmin = new float3(verts[0]); |
1209 | float3 bmax = new float3(verts[0]); | 1223 | float3 bmax = new float3(verts[0]); |
1210 | List<int> isextreme = new List<int>(verts.Count); | 1224 | byte[] isextreme = new byte[verts.Count]; |
1211 | byte[] allow = new byte[verts.Count]; | 1225 | byte[] allow = new byte[verts.Count]; |
1212 | for (j = 0; j < verts.Count; j++) | 1226 | for (j = 0; j < verts.Count; j++) |
1213 | { | 1227 | { |
1214 | allow[j] = 1; | 1228 | allow[j] = 1; |
1215 | isextreme.Add(0); | 1229 | isextreme[j] = 0; |
1216 | bmin = float3.VectorMin(bmin, verts[j]); | 1230 | bmin = float3.VectorMin(bmin, verts[j]); |
1217 | bmax = float3.VectorMax(bmax, verts[j]); | 1231 | bmax = float3.VectorMax(bmax, verts[j]); |
1218 | } | 1232 | } |
@@ -1526,6 +1540,19 @@ namespace OpenSim.Region.PhysicsModules.ConvexDecompositionDotNet | |||
1526 | } | 1540 | } |
1527 | } | 1541 | } |
1528 | 1542 | ||
1543 | public static bool ComputeHull(List<float3> vertices, out List<int> indices) | ||
1544 | { | ||
1545 | List<HullTriangle> tris = new List<HullTriangle>(); | ||
1546 | |||
1547 | bool ret = calchull(vertices, out indices, 0, tris); | ||
1548 | if (ret == false) | ||
1549 | { | ||
1550 | indices = new List<int>(); | ||
1551 | return false; | ||
1552 | } | ||
1553 | return true; | ||
1554 | } | ||
1555 | |||
1529 | private static bool CleanupVertices(List<float3> svertices, out List<float3> vertices, float normalepsilon, out float3 scale) | 1556 | private static bool CleanupVertices(List<float3> svertices, out List<float3> vertices, float normalepsilon, out float3 scale) |
1530 | { | 1557 | { |
1531 | const float EPSILON = 0.000001f; | 1558 | const float EPSILON = 0.000001f; |
diff --git a/OpenSim/Region/PhysicsModules/Ode/OdeScene.cs b/OpenSim/Region/PhysicsModules/Ode/OdeScene.cs index 8f9bccb..ed2aad4 100644 --- a/OpenSim/Region/PhysicsModules/Ode/OdeScene.cs +++ b/OpenSim/Region/PhysicsModules/Ode/OdeScene.cs | |||
@@ -258,8 +258,6 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
258 | 258 | ||
259 | private Random fluidRandomizer = new Random(Environment.TickCount); | 259 | private Random fluidRandomizer = new Random(Environment.TickCount); |
260 | 260 | ||
261 | public bool m_suportCombine = true; | ||
262 | |||
263 | private uint m_regionWidth = Constants.RegionSize; | 261 | private uint m_regionWidth = Constants.RegionSize; |
264 | private uint m_regionHeight = Constants.RegionSize; | 262 | private uint m_regionHeight = Constants.RegionSize; |
265 | 263 | ||
@@ -542,8 +540,6 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
542 | WorldExtents.Y = regionExtent.Y; | 540 | WorldExtents.Y = regionExtent.Y; |
543 | m_regionHeight = (uint)regionExtent.Y; | 541 | m_regionHeight = (uint)regionExtent.Y; |
544 | 542 | ||
545 | m_suportCombine = false; | ||
546 | |||
547 | nearCallback = near; | 543 | nearCallback = near; |
548 | m_rayCastManager = new ODERayCastRequestManager(this); | 544 | m_rayCastManager = new ODERayCastRequestManager(this); |
549 | 545 | ||
@@ -1627,15 +1623,6 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
1627 | 1623 | ||
1628 | #endregion | 1624 | #endregion |
1629 | 1625 | ||
1630 | public override void Combine(PhysicsScene pScene, Vector3 offset, Vector3 extents) | ||
1631 | { | ||
1632 | if (!m_suportCombine) | ||
1633 | return; | ||
1634 | m_worldOffset = offset; | ||
1635 | WorldExtents = new Vector2(extents.X, extents.Y); | ||
1636 | m_parentScene = pScene; | ||
1637 | } | ||
1638 | |||
1639 | // Recovered for use by fly height. Kitto Flora | 1626 | // Recovered for use by fly height. Kitto Flora |
1640 | internal float GetTerrainHeightAtXY(float x, float y) | 1627 | internal float GetTerrainHeightAtXY(float x, float y) |
1641 | { | 1628 | { |
@@ -1643,12 +1630,6 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
1643 | int offsetX = 0; | 1630 | int offsetX = 0; |
1644 | int offsetY = 0; | 1631 | int offsetY = 0; |
1645 | 1632 | ||
1646 | if (m_suportCombine) | ||
1647 | { | ||
1648 | offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize; | ||
1649 | offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize; | ||
1650 | } | ||
1651 | |||
1652 | if(RegionTerrain.TryGetValue(new Vector3(offsetX,offsetY,0), out heightFieldGeom)) | 1633 | if(RegionTerrain.TryGetValue(new Vector3(offsetX,offsetY,0), out heightFieldGeom)) |
1653 | { | 1634 | { |
1654 | if (heightFieldGeom != IntPtr.Zero) | 1635 | if (heightFieldGeom != IntPtr.Zero) |
@@ -3387,11 +3368,6 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
3387 | return waterlevel; | 3368 | return waterlevel; |
3388 | } | 3369 | } |
3389 | 3370 | ||
3390 | public override bool SupportsCombining() | ||
3391 | { | ||
3392 | return m_suportCombine; | ||
3393 | } | ||
3394 | |||
3395 | public override void SetWaterLevel(float baseheight) | 3371 | public override void SetWaterLevel(float baseheight) |
3396 | { | 3372 | { |
3397 | waterlevel = baseheight; | 3373 | waterlevel = baseheight; |
@@ -3452,6 +3428,11 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
3452 | } | 3428 | } |
3453 | } | 3429 | } |
3454 | 3430 | ||
3431 | private int compareByCollisionsDesc(OdePrim A, OdePrim B) | ||
3432 | { | ||
3433 | return -A.CollisionScore.CompareTo(B.CollisionScore); | ||
3434 | } | ||
3435 | |||
3455 | public override Dictionary<uint, float> GetTopColliders() | 3436 | public override Dictionary<uint, float> GetTopColliders() |
3456 | { | 3437 | { |
3457 | Dictionary<uint, float> topColliders; | 3438 | Dictionary<uint, float> topColliders; |
@@ -3459,7 +3440,7 @@ namespace OpenSim.Region.PhysicsModule.ODE | |||
3459 | lock (_prims) | 3440 | lock (_prims) |
3460 | { | 3441 | { |
3461 | List<OdePrim> orderedPrims = new List<OdePrim>(_prims); | 3442 | List<OdePrim> orderedPrims = new List<OdePrim>(_prims); |
3462 | orderedPrims.OrderByDescending(p => p.CollisionScore); | 3443 | orderedPrims.Sort(compareByCollisionsDesc); |
3463 | topColliders = orderedPrims.Take(25).ToDictionary(p => p.LocalID, p => p.CollisionScore); | 3444 | topColliders = orderedPrims.Take(25).ToDictionary(p => p.LocalID, p => p.CollisionScore); |
3464 | 3445 | ||
3465 | foreach (OdePrim p in _prims) | 3446 | foreach (OdePrim p in _prims) |
diff --git a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs index 04ccbf0..250b155 100644 --- a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs +++ b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsActor.cs | |||
@@ -55,6 +55,14 @@ namespace OpenSim.Region.PhysicsModules.SharedBase | |||
55 | Absolute | 55 | Absolute |
56 | } | 56 | } |
57 | 57 | ||
58 | public struct CameraData | ||
59 | { | ||
60 | public Quaternion CameraRotation; | ||
61 | public Vector3 CameraAtAxis; | ||
62 | public bool MouseLook; | ||
63 | public bool Valid; | ||
64 | } | ||
65 | |||
58 | public struct ContactPoint | 66 | public struct ContactPoint |
59 | { | 67 | { |
60 | public Vector3 Position; | 68 | public Vector3 Position; |
@@ -159,13 +167,15 @@ namespace OpenSim.Region.PhysicsModules.SharedBase | |||
159 | public delegate void RequestTerseUpdate(); | 167 | public delegate void RequestTerseUpdate(); |
160 | public delegate void CollisionUpdate(EventArgs e); | 168 | public delegate void CollisionUpdate(EventArgs e); |
161 | public delegate void OutOfBounds(Vector3 pos); | 169 | public delegate void OutOfBounds(Vector3 pos); |
170 | public delegate CameraData GetCameraData(); | ||
162 | 171 | ||
163 | // disable warning: public events | 172 | // disable warning: public events |
164 | #pragma warning disable 67 | 173 | #pragma warning disable 67 |
165 | public event PositionUpdate OnPositionUpdate; | 174 | public event PositionUpdate OnPositionUpdate; |
166 | public event VelocityUpdate OnVelocityUpdate; | 175 | public event VelocityUpdate OnVelocityUpdate; |
167 | public event OrientationUpdate OnOrientationUpdate; | 176 | public event OrientationUpdate OnOrientationUpdate; |
168 | public event RequestTerseUpdate OnRequestTerseUpdate; | 177 | public event RequestTerseUpdate OnRequestTerseUpdate; |
178 | public event GetCameraData OnPhysicsRequestingCameraData; | ||
169 | 179 | ||
170 | /// <summary> | 180 | /// <summary> |
171 | /// Subscribers to this event must synchronously handle the dictionary of collisions received, since the event | 181 | /// Subscribers to this event must synchronously handle the dictionary of collisions received, since the event |
@@ -176,6 +186,17 @@ namespace OpenSim.Region.PhysicsModules.SharedBase | |||
176 | public event OutOfBounds OnOutOfBounds; | 186 | public event OutOfBounds OnOutOfBounds; |
177 | #pragma warning restore 67 | 187 | #pragma warning restore 67 |
178 | 188 | ||
189 | public CameraData TryGetCameraData() | ||
190 | { | ||
191 | GetCameraData handler = OnPhysicsRequestingCameraData; | ||
192 | if (handler != null) | ||
193 | { | ||
194 | return handler(); | ||
195 | } | ||
196 | |||
197 | return new CameraData { Valid = false }; | ||
198 | } | ||
199 | |||
179 | public static PhysicsActor Null | 200 | public static PhysicsActor Null |
180 | { | 201 | { |
181 | get { return new NullPhysicsActor(); } | 202 | get { return new NullPhysicsActor(); } |
diff --git a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs index 65d8867..aa51c4e 100644 --- a/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs +++ b/OpenSim/Region/PhysicsModules/SharedBase/PhysicsScene.cs | |||
@@ -332,15 +332,6 @@ namespace OpenSim.Region.PhysicsModules.SharedBase | |||
332 | return false; | 332 | return false; |
333 | } | 333 | } |
334 | 334 | ||
335 | public virtual bool SupportsCombining() | ||
336 | { | ||
337 | return false; | ||
338 | } | ||
339 | |||
340 | public virtual void Combine(PhysicsScene pScene, Vector3 offset, Vector3 extents) {} | ||
341 | public virtual void CombineTerrain(float[] heightMap, Vector3 pOffset) {} | ||
342 | public virtual void UnCombine(PhysicsScene pScene) {} | ||
343 | |||
344 | /// <summary> | 335 | /// <summary> |
345 | /// Queue a raycast against the physics scene. | 336 | /// Queue a raycast against the physics scene. |
346 | /// The provided callback method will be called when the raycast is complete | 337 | /// The provided callback method will be called when the raycast is complete |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs index c9489d2..3a5a936 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODECharacter.cs | |||
@@ -122,8 +122,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
122 | private float m_buoyancy = 0f; | 122 | private float m_buoyancy = 0f; |
123 | 123 | ||
124 | private bool m_freemove = false; | 124 | private bool m_freemove = false; |
125 | // private CollisionLocker ode; | 125 | |
126 | |||
127 | // private string m_name = String.Empty; | 126 | // private string m_name = String.Empty; |
128 | // other filter control | 127 | // other filter control |
129 | int m_colliderfilter = 0; | 128 | int m_colliderfilter = 0; |
@@ -1571,11 +1570,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1571 | { | 1570 | { |
1572 | if (CollisionEventsThisFrame != null) | 1571 | if (CollisionEventsThisFrame != null) |
1573 | { | 1572 | { |
1574 | lock (CollisionEventsThisFrame) | 1573 | CollisionEventsThisFrame.Clear(); |
1575 | { | 1574 | CollisionEventsThisFrame = null; |
1576 | CollisionEventsThisFrame.Clear(); | ||
1577 | CollisionEventsThisFrame = null; | ||
1578 | } | ||
1579 | } | 1575 | } |
1580 | m_eventsubscription = 0; | 1576 | m_eventsubscription = 0; |
1581 | _parent_scene.RemoveCollisionEventReporting(this); | 1577 | _parent_scene.RemoveCollisionEventReporting(this); |
@@ -1585,11 +1581,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1585 | { | 1581 | { |
1586 | if (CollisionEventsThisFrame == null) | 1582 | if (CollisionEventsThisFrame == null) |
1587 | CollisionEventsThisFrame = new CollisionEventUpdate(); | 1583 | CollisionEventsThisFrame = new CollisionEventUpdate(); |
1588 | lock (CollisionEventsThisFrame) | 1584 | CollisionEventsThisFrame.AddCollider(CollidedWith, contact); |
1589 | { | 1585 | _parent_scene.AddCollisionEventReporting(this); |
1590 | CollisionEventsThisFrame.AddCollider(CollidedWith, contact); | ||
1591 | _parent_scene.AddCollisionEventReporting(this); | ||
1592 | } | ||
1593 | } | 1586 | } |
1594 | 1587 | ||
1595 | public void SendCollisions(int timestep) | 1588 | public void SendCollisions(int timestep) |
@@ -1600,28 +1593,25 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1600 | if (CollisionEventsThisFrame == null) | 1593 | if (CollisionEventsThisFrame == null) |
1601 | return; | 1594 | return; |
1602 | 1595 | ||
1603 | lock (CollisionEventsThisFrame) | 1596 | if (m_cureventsubscription < m_eventsubscription) |
1604 | { | 1597 | return; |
1605 | if (m_cureventsubscription < m_eventsubscription) | ||
1606 | return; | ||
1607 | 1598 | ||
1608 | int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count; | 1599 | int ncolisions = CollisionEventsThisFrame.m_objCollisionList.Count; |
1609 | 1600 | ||
1610 | if (!SentEmptyCollisionsEvent || ncolisions > 0) | 1601 | if (!SentEmptyCollisionsEvent || ncolisions > 0) |
1611 | { | 1602 | { |
1612 | base.SendCollisionUpdate(CollisionEventsThisFrame); | 1603 | base.SendCollisionUpdate(CollisionEventsThisFrame); |
1613 | m_cureventsubscription = 0; | 1604 | m_cureventsubscription = 0; |
1614 | 1605 | ||
1615 | if (ncolisions == 0) | 1606 | if (ncolisions == 0) |
1616 | { | 1607 | { |
1617 | SentEmptyCollisionsEvent = true; | 1608 | SentEmptyCollisionsEvent = true; |
1618 | // _parent_scene.RemoveCollisionEventReporting(this); | 1609 | // _parent_scene.RemoveCollisionEventReporting(this); |
1619 | } | 1610 | } |
1620 | else | 1611 | else |
1621 | { | 1612 | { |
1622 | SentEmptyCollisionsEvent = false; | 1613 | SentEmptyCollisionsEvent = false; |
1623 | CollisionEventsThisFrame.Clear(); | 1614 | CollisionEventsThisFrame.Clear(); |
1624 | } | ||
1625 | } | 1615 | } |
1626 | } | 1616 | } |
1627 | } | 1617 | } |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs index d8a2272..fa32441 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEDynamics.cs | |||
@@ -648,6 +648,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
648 | break; | 648 | break; |
649 | 649 | ||
650 | } | 650 | } |
651 | // disable mouse steering | ||
652 | m_flags &= ~(VehicleFlag.MOUSELOOK_STEER | | ||
653 | VehicleFlag.MOUSELOOK_BANK | | ||
654 | VehicleFlag.CAMERA_DECOUPLED); | ||
651 | 655 | ||
652 | m_lmDecay = (1.0f - 1.0f / m_linearMotorDecayTimescale); | 656 | m_lmDecay = (1.0f - 1.0f / m_linearMotorDecayTimescale); |
653 | m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale; | 657 | m_amDecay = 1.0f - 1.0f / m_angularMotorDecayTimescale; |
@@ -794,6 +798,28 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
794 | 798 | ||
795 | float ldampZ = 0; | 799 | float ldampZ = 0; |
796 | 800 | ||
801 | bool mousemode = false; | ||
802 | bool mousemodebank = false; | ||
803 | |||
804 | float bankingEfficiency; | ||
805 | float verticalAttractionTimescale = m_verticalAttractionTimescale; | ||
806 | |||
807 | if((m_flags & (VehicleFlag.MOUSELOOK_STEER | VehicleFlag.MOUSELOOK_BANK)) != 0 ) | ||
808 | { | ||
809 | mousemode = true; | ||
810 | mousemodebank = (m_flags & VehicleFlag.MOUSELOOK_BANK) != 0; | ||
811 | if(mousemodebank) | ||
812 | { | ||
813 | bankingEfficiency = m_bankingEfficiency; | ||
814 | if(verticalAttractionTimescale < 149.9) | ||
815 | verticalAttractionTimescale *= 2.0f; // reduce current instability | ||
816 | } | ||
817 | else | ||
818 | bankingEfficiency = 0; | ||
819 | } | ||
820 | else | ||
821 | bankingEfficiency = m_bankingEfficiency; | ||
822 | |||
797 | // linear motor | 823 | // linear motor |
798 | if (m_lmEfect > 0.01 && m_linearMotorTimescale < 1000) | 824 | if (m_lmEfect > 0.01 && m_linearMotorTimescale < 1000) |
799 | { | 825 | { |
@@ -930,12 +956,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
930 | } | 956 | } |
931 | 957 | ||
932 | // vertical atractor | 958 | // vertical atractor |
933 | if (m_verticalAttractionTimescale < 300) | 959 | if (verticalAttractionTimescale < 300) |
934 | { | 960 | { |
935 | float roll; | 961 | float roll; |
936 | float pitch; | 962 | float pitch; |
937 | 963 | ||
938 | float ftmp = m_invtimestep / m_verticalAttractionTimescale / m_verticalAttractionTimescale; | 964 | float ftmp = m_invtimestep / verticalAttractionTimescale / verticalAttractionTimescale; |
939 | 965 | ||
940 | float ftmp2; | 966 | float ftmp2; |
941 | ftmp2 = 0.5f * m_verticalAttractionEfficiency * m_invtimestep; | 967 | ftmp2 = 0.5f * m_verticalAttractionEfficiency * m_invtimestep; |
@@ -967,7 +993,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
967 | torque.Y += effpitch * ftmp; | 993 | torque.Y += effpitch * ftmp; |
968 | } | 994 | } |
969 | 995 | ||
970 | if (m_bankingEfficiency != 0 && Math.Abs(effroll) > 0.01) | 996 | if (bankingEfficiency != 0 && Math.Abs(effroll) > 0.01) |
971 | { | 997 | { |
972 | 998 | ||
973 | float broll = effroll; | 999 | float broll = effroll; |
@@ -1018,58 +1044,129 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1018 | m_amdampZ = 1 / m_angularFrictionTimescale.Z; | 1044 | m_amdampZ = 1 / m_angularFrictionTimescale.Z; |
1019 | } | 1045 | } |
1020 | 1046 | ||
1021 | // angular motor | 1047 | if(mousemode) |
1022 | if (m_amEfect > 0.01 && m_angularMotorTimescale < 1000) | ||
1023 | { | 1048 | { |
1024 | tmpV = m_angularMotorDirection - curLocalAngVel; // velocity error | 1049 | CameraData cam = rootPrim.TryGetCameraData(); |
1025 | tmpV *= m_amEfect / m_angularMotorTimescale; // error to correct in this timestep | 1050 | if(cam.Valid && cam.MouseLook) |
1026 | torque.X += tmpV.X * m_ampwr; | 1051 | { |
1027 | torque.Y += tmpV.Y * m_ampwr; | 1052 | Vector3 dirv = cam.CameraAtAxis * irotq; |
1028 | torque.Z += tmpV.Z; | ||
1029 | 1053 | ||
1030 | m_amEfect *= m_amDecay; | 1054 | float invamts = 1.0f/m_angularMotorTimescale; |
1031 | } | 1055 | float tmp; |
1032 | else | ||
1033 | m_amEfect = 0; | ||
1034 | 1056 | ||
1035 | // angular deflection | 1057 | // get out of x == 0 plane |
1036 | if (m_angularDeflectionEfficiency > 0) | 1058 | if(Math.Abs(dirv.X) < 0.001f) |
1037 | { | 1059 | dirv.X = 0.001f; |
1038 | Vector3 dirv; | 1060 | |
1039 | 1061 | if (Math.Abs(dirv.Z) > 0.01) | |
1040 | if (curLocalVel.X > 0.01f) | 1062 | { |
1041 | dirv = curLocalVel; | 1063 | tmp = -(float)Math.Atan2(dirv.Z, dirv.X) * m_angularMotorDirection.Y; |
1042 | else if (curLocalVel.X < -0.01f) | 1064 | if(tmp < -4f) |
1043 | // use oposite | 1065 | tmp = -4f; |
1044 | dirv = -curLocalVel; | 1066 | else if(tmp > 4f) |
1067 | tmp = 4f; | ||
1068 | torque.Y += (tmp - curLocalAngVel.Y) * invamts; | ||
1069 | torque.Y -= curLocalAngVel.Y * m_amdampY; | ||
1070 | } | ||
1071 | else | ||
1072 | torque.Y -= curLocalAngVel.Y * m_invtimestep; | ||
1073 | |||
1074 | if (Math.Abs(dirv.Y) > 0.01) | ||
1075 | { | ||
1076 | if(mousemodebank) | ||
1077 | { | ||
1078 | tmp = -(float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.X; | ||
1079 | if(tmp < -4f) | ||
1080 | tmp = -4f; | ||
1081 | else if(tmp > 4f) | ||
1082 | tmp = 4f; | ||
1083 | torque.X += (tmp - curLocalAngVel.X) * invamts; | ||
1084 | } | ||
1085 | else | ||
1086 | { | ||
1087 | tmp = (float)Math.Atan2(dirv.Y, dirv.X) * m_angularMotorDirection.Z; | ||
1088 | tmp *= invamts; | ||
1089 | if(tmp < -4f) | ||
1090 | tmp = -4f; | ||
1091 | else if(tmp > 4f) | ||
1092 | tmp = 4f; | ||
1093 | torque.Z += (tmp - curLocalAngVel.Z) * invamts; | ||
1094 | } | ||
1095 | torque.X -= curLocalAngVel.X * m_amdampX; | ||
1096 | torque.Z -= curLocalAngVel.Z * m_amdampZ; | ||
1097 | } | ||
1098 | else | ||
1099 | { | ||
1100 | if(mousemodebank) | ||
1101 | torque.X -= curLocalAngVel.X * m_invtimestep; | ||
1102 | else | ||
1103 | torque.Z -= curLocalAngVel.Z * m_invtimestep; | ||
1104 | } | ||
1105 | } | ||
1045 | else | 1106 | else |
1046 | { | 1107 | { |
1047 | // make it fall into small positive x case | 1108 | if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) |
1048 | dirv.X = 0.01f; | 1109 | { |
1049 | dirv.Y = curLocalVel.Y; | 1110 | torque.X -= curLocalAngVel.X * 10f; |
1050 | dirv.Z = curLocalVel.Z; | 1111 | torque.Y -= curLocalAngVel.Y * 10f; |
1112 | torque.Z -= curLocalAngVel.Z * 10f; | ||
1113 | } | ||
1051 | } | 1114 | } |
1115 | } | ||
1116 | else | ||
1117 | { | ||
1118 | // angular motor | ||
1119 | if (m_amEfect > 0.01 && m_angularMotorTimescale < 1000) | ||
1120 | { | ||
1121 | tmpV = m_angularMotorDirection - curLocalAngVel; // velocity error | ||
1122 | tmpV *= m_amEfect / m_angularMotorTimescale; // error to correct in this timestep | ||
1123 | torque.X += tmpV.X * m_ampwr; | ||
1124 | torque.Y += tmpV.Y * m_ampwr; | ||
1125 | torque.Z += tmpV.Z; | ||
1052 | 1126 | ||
1053 | float ftmp = m_angularDeflectionEfficiency / m_angularDeflectionTimescale; | 1127 | m_amEfect *= m_amDecay; |
1128 | } | ||
1129 | else | ||
1130 | m_amEfect = 0; | ||
1054 | 1131 | ||
1055 | if (Math.Abs(dirv.Z) > 0.01) | 1132 | // angular deflection |
1133 | if (m_angularDeflectionEfficiency > 0) | ||
1056 | { | 1134 | { |
1057 | torque.Y += - (float)Math.Atan2(dirv.Z, dirv.X) * ftmp; | 1135 | Vector3 dirv; |
1136 | |||
1137 | if (curLocalVel.X > 0.01f) | ||
1138 | dirv = curLocalVel; | ||
1139 | else if (curLocalVel.X < -0.01f) | ||
1140 | // use oposite | ||
1141 | dirv = -curLocalVel; | ||
1142 | else | ||
1143 | { | ||
1144 | // make it fall into small positive x case | ||
1145 | dirv.X = 0.01f; | ||
1146 | dirv.Y = curLocalVel.Y; | ||
1147 | dirv.Z = curLocalVel.Z; | ||
1148 | } | ||
1149 | |||
1150 | float ftmp = m_angularDeflectionEfficiency / m_angularDeflectionTimescale; | ||
1151 | |||
1152 | if (Math.Abs(dirv.Z) > 0.01) | ||
1153 | { | ||
1154 | torque.Y += - (float)Math.Atan2(dirv.Z, dirv.X) * ftmp; | ||
1155 | } | ||
1156 | |||
1157 | if (Math.Abs(dirv.Y) > 0.01) | ||
1158 | { | ||
1159 | torque.Z += (float)Math.Atan2(dirv.Y, dirv.X) * ftmp; | ||
1160 | } | ||
1058 | } | 1161 | } |
1059 | 1162 | ||
1060 | if (Math.Abs(dirv.Y) > 0.01) | 1163 | if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) |
1061 | { | 1164 | { |
1062 | torque.Z += (float)Math.Atan2(dirv.Y, dirv.X) * ftmp; | 1165 | torque.X -= curLocalAngVel.X * m_amdampX; |
1166 | torque.Y -= curLocalAngVel.Y * m_amdampY; | ||
1167 | torque.Z -= curLocalAngVel.Z * m_amdampZ; | ||
1063 | } | 1168 | } |
1064 | } | 1169 | } |
1065 | |||
1066 | // angular friction | ||
1067 | if (curLocalAngVel.X != 0 || curLocalAngVel.Y != 0 || curLocalAngVel.Z != 0) | ||
1068 | { | ||
1069 | torque.X -= curLocalAngVel.X * m_amdampX; | ||
1070 | torque.Y -= curLocalAngVel.Y * m_amdampY; | ||
1071 | torque.Z -= curLocalAngVel.Z * m_amdampZ; | ||
1072 | } | ||
1073 | 1170 | ||
1074 | force *= dmass.mass; | 1171 | force *= dmass.mass; |
1075 | 1172 | ||
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs index 6f2cbbe..4adf87e 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEPrim.cs | |||
@@ -306,7 +306,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
306 | public override uint LocalID | 306 | public override uint LocalID |
307 | { | 307 | { |
308 | get { return m_localID; } | 308 | get { return m_localID; } |
309 | set { m_localID = value; } | 309 | set |
310 | { | ||
311 | uint oldid = m_localID; | ||
312 | m_localID = value; | ||
313 | _parent_scene.changePrimID(this, oldid); | ||
314 | } | ||
310 | } | 315 | } |
311 | 316 | ||
312 | public override PhysicsActor ParentActor | 317 | public override PhysicsActor ParentActor |
@@ -1066,8 +1071,10 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1066 | public OdePrim(String primName, ODEScene parent_scene, Vector3 pos, Vector3 size, | 1071 | public OdePrim(String primName, ODEScene parent_scene, Vector3 pos, Vector3 size, |
1067 | Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical,bool pisPhantom,byte _shapeType,uint plocalID) | 1072 | Quaternion rotation, PrimitiveBaseShape pbs, bool pisPhysical,bool pisPhantom,byte _shapeType,uint plocalID) |
1068 | { | 1073 | { |
1074 | _parent_scene = parent_scene; | ||
1075 | |||
1069 | Name = primName; | 1076 | Name = primName; |
1070 | LocalID = plocalID; | 1077 | m_localID = plocalID; |
1071 | 1078 | ||
1072 | m_vehicle = null; | 1079 | m_vehicle = null; |
1073 | 1080 | ||
@@ -1113,7 +1120,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1113 | 1120 | ||
1114 | _pbs = pbs; | 1121 | _pbs = pbs; |
1115 | 1122 | ||
1116 | _parent_scene = parent_scene; | ||
1117 | m_targetSpace = IntPtr.Zero; | 1123 | m_targetSpace = IntPtr.Zero; |
1118 | 1124 | ||
1119 | if (pos.Z < 0) | 1125 | if (pos.Z < 0) |
@@ -1159,6 +1165,8 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1159 | m_OBBOffset = repData.OBBOffset; | 1165 | m_OBBOffset = repData.OBBOffset; |
1160 | 1166 | ||
1161 | UpdatePrimBodyData(); | 1167 | UpdatePrimBodyData(); |
1168 | |||
1169 | AddChange(changes.Add, null); | ||
1162 | } | 1170 | } |
1163 | 1171 | ||
1164 | private void resetCollisionAccounting() | 1172 | private void resetCollisionAccounting() |
@@ -2441,6 +2449,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2441 | 2449 | ||
2442 | private void changeadd() | 2450 | private void changeadd() |
2443 | { | 2451 | { |
2452 | _parent_scene.addToPrims(this); | ||
2444 | } | 2453 | } |
2445 | 2454 | ||
2446 | private void changeAngularLock(byte newLocks) | 2455 | private void changeAngularLock(byte newLocks) |
diff --git a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs index 6c5b405..e6aa7ef 100644 --- a/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs +++ b/OpenSim/Region/PhysicsModules/ubOde/ODEScene.cs | |||
@@ -30,6 +30,7 @@ | |||
30 | 30 | ||
31 | using System; | 31 | using System; |
32 | using System.Collections.Generic; | 32 | using System.Collections.Generic; |
33 | using System.Linq; | ||
33 | using System.Reflection; | 34 | using System.Reflection; |
34 | using System.Runtime.InteropServices; | 35 | using System.Runtime.InteropServices; |
35 | using System.Threading; | 36 | using System.Threading; |
@@ -170,7 +171,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
170 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 171 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
171 | 172 | ||
172 | public bool m_OSOdeLib = false; | 173 | public bool m_OSOdeLib = false; |
173 | public bool m_suportCombine = false; // mega suport not tested | ||
174 | public Scene m_frameWorkScene = null; | 174 | public Scene m_frameWorkScene = null; |
175 | 175 | ||
176 | // private int threadid = 0; | 176 | // private int threadid = 0; |
@@ -258,9 +258,9 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
258 | 258 | ||
259 | public ContactData[] m_materialContactsData = new ContactData[8]; | 259 | public ContactData[] m_materialContactsData = new ContactData[8]; |
260 | 260 | ||
261 | private Dictionary<Vector3, IntPtr> RegionTerrain = new Dictionary<Vector3, IntPtr>(); | 261 | private IntPtr TerrainGeom; |
262 | private Dictionary<IntPtr, float[]> TerrainHeightFieldHeights = new Dictionary<IntPtr, float[]>(); | 262 | private float[] TerrainHeightFieldHeight; |
263 | private Dictionary<IntPtr, GCHandle> TerrainHeightFieldHeightsHandlers = new Dictionary<IntPtr, GCHandle>(); | 263 | private GCHandle TerrainHeightFieldHeightsHandler = new GCHandle(); |
264 | 264 | ||
265 | private int m_physicsiterations = 15; | 265 | private int m_physicsiterations = 15; |
266 | private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag | 266 | private const float m_SkipFramesAtms = 0.40f; // Drop frames gracefully at a 400 ms lag |
@@ -302,9 +302,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
302 | public int physics_logging_interval = 0; | 302 | public int physics_logging_interval = 0; |
303 | public bool physics_logging_append_existing_logfile = false; | 303 | public bool physics_logging_append_existing_logfile = false; |
304 | 304 | ||
305 | private Vector3 m_worldOffset = Vector3.Zero; | ||
306 | public Vector2 WorldExtents = new Vector2((int)Constants.RegionSize, (int)Constants.RegionSize); | 305 | public Vector2 WorldExtents = new Vector2((int)Constants.RegionSize, (int)Constants.RegionSize); |
307 | private PhysicsScene m_parentScene = null; | ||
308 | 306 | ||
309 | private ODERayCastRequestManager m_rayCastManager; | 307 | private ODERayCastRequestManager m_rayCastManager; |
310 | public ODEMeshWorker m_meshWorker; | 308 | public ODEMeshWorker m_meshWorker; |
@@ -379,8 +377,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
379 | WorldExtents.Y = m_frameWorkScene.RegionInfo.RegionSizeY; | 377 | WorldExtents.Y = m_frameWorkScene.RegionInfo.RegionSizeY; |
380 | m_regionHeight = (uint)WorldExtents.Y; | 378 | m_regionHeight = (uint)WorldExtents.Y; |
381 | 379 | ||
382 | m_suportCombine = false; | ||
383 | |||
384 | lock (OdeLock) | 380 | lock (OdeLock) |
385 | { | 381 | { |
386 | // Create the world and the first space | 382 | // Create the world and the first space |
@@ -803,14 +799,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
803 | return; | 799 | return; |
804 | } | 800 | } |
805 | 801 | ||
806 | // update actors collision score | ||
807 | if (p1.CollisionScore >= float.MaxValue - count) | ||
808 | p1.CollisionScore = 0; | ||
809 | p1.CollisionScore += count; | ||
810 | |||
811 | if (p2.CollisionScore >= float.MaxValue - count) | ||
812 | p2.CollisionScore = 0; | ||
813 | p2.CollisionScore += count; | ||
814 | 802 | ||
815 | // get first contact | 803 | // get first contact |
816 | d.ContactGeom curContact = new d.ContactGeom(); | 804 | d.ContactGeom curContact = new d.ContactGeom(); |
@@ -1056,6 +1044,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1056 | { | 1044 | { |
1057 | uint obj2LocalID = 0; | 1045 | uint obj2LocalID = 0; |
1058 | 1046 | ||
1047 | // update actors collision score | ||
1048 | if (p1.CollisionScore < float.MaxValue) | ||
1049 | p1.CollisionScore += 1.0f; | ||
1050 | if (p2.CollisionScore < float.MaxValue) | ||
1051 | p2.CollisionScore += 1.0f; | ||
1052 | |||
1059 | bool p1events = p1.SubscribedEvents(); | 1053 | bool p1events = p1.SubscribedEvents(); |
1060 | bool p2events = p2.SubscribedEvents(); | 1054 | bool p2events = p2.SubscribedEvents(); |
1061 | 1055 | ||
@@ -1328,8 +1322,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1328 | { | 1322 | { |
1329 | 1323 | ||
1330 | newPrim = new OdePrim(name, this, position, size, rotation, pbs, isphysical, isPhantom, shapeType, localID); | 1324 | newPrim = new OdePrim(name, this, position, size, rotation, pbs, isphysical, isPhantom, shapeType, localID); |
1331 | lock (_prims) | ||
1332 | _prims[newPrim.LocalID] = newPrim; | ||
1333 | } | 1325 | } |
1334 | return newPrim; | 1326 | return newPrim; |
1335 | } | 1327 | } |
@@ -1350,7 +1342,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1350 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, | 1342 | public override PhysicsActor AddPrimShape(string primName, PrimitiveBaseShape pbs, Vector3 position, |
1351 | Vector3 size, Quaternion rotation, bool isPhysical, bool isPhantom, byte shapeType, uint localid) | 1343 | Vector3 size, Quaternion rotation, bool isPhysical, bool isPhantom, byte shapeType, uint localid) |
1352 | { | 1344 | { |
1353 | |||
1354 | return AddPrim(primName, position, size, rotation, pbs, isPhysical,isPhantom, shapeType, localid); | 1345 | return AddPrim(primName, position, size, rotation, pbs, isPhysical,isPhantom, shapeType, localid); |
1355 | } | 1346 | } |
1356 | 1347 | ||
@@ -1396,6 +1387,12 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1396 | 1387 | ||
1397 | } | 1388 | } |
1398 | 1389 | ||
1390 | public void addToPrims(OdePrim prim) | ||
1391 | { | ||
1392 | lock (_prims) | ||
1393 | _prims[prim.LocalID] = prim; | ||
1394 | } | ||
1395 | |||
1399 | public OdePrim getPrim(uint id) | 1396 | public OdePrim getPrim(uint id) |
1400 | { | 1397 | { |
1401 | lock (_prims) | 1398 | lock (_prims) |
@@ -1413,6 +1410,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1413 | return _prims.ContainsKey(prm.LocalID); | 1410 | return _prims.ContainsKey(prm.LocalID); |
1414 | } | 1411 | } |
1415 | 1412 | ||
1413 | public void changePrimID(OdePrim prim,uint oldID) | ||
1414 | { | ||
1415 | lock (_prims) | ||
1416 | { | ||
1417 | if(_prims.ContainsKey(oldID)) | ||
1418 | _prims.Remove(oldID); | ||
1419 | _prims[prim.LocalID] = prim; | ||
1420 | } | ||
1421 | } | ||
1422 | |||
1416 | public bool haveActor(PhysicsActor actor) | 1423 | public bool haveActor(PhysicsActor actor) |
1417 | { | 1424 | { |
1418 | if (actor is OdePrim) | 1425 | if (actor is OdePrim) |
@@ -1922,30 +1929,15 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
1922 | 1929 | ||
1923 | public float GetTerrainHeightAtXY(float x, float y) | 1930 | public float GetTerrainHeightAtXY(float x, float y) |
1924 | { | 1931 | { |
1925 | 1932 | if (TerrainGeom == IntPtr.Zero) | |
1926 | int offsetX = 0; | ||
1927 | int offsetY = 0; | ||
1928 | |||
1929 | if (m_suportCombine) | ||
1930 | { | ||
1931 | offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize; | ||
1932 | offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize; | ||
1933 | } | ||
1934 | |||
1935 | // get region map | ||
1936 | IntPtr heightFieldGeom = IntPtr.Zero; | ||
1937 | if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom)) | ||
1938 | return 0f; | 1933 | return 0f; |
1939 | 1934 | ||
1940 | if (heightFieldGeom == IntPtr.Zero) | 1935 | if (TerrainHeightFieldHeight == null || TerrainHeightFieldHeight.Length == 0) |
1941 | return 0f; | ||
1942 | |||
1943 | if (!TerrainHeightFieldHeights.ContainsKey(heightFieldGeom)) | ||
1944 | return 0f; | 1936 | return 0f; |
1945 | 1937 | ||
1946 | // TerrainHeightField for ODE as offset 1m | 1938 | // TerrainHeightField for ODE as offset 1m |
1947 | x += 1f - offsetX; | 1939 | x += 1f; |
1948 | y += 1f - offsetY; | 1940 | y += 1f; |
1949 | 1941 | ||
1950 | // make position fit into array | 1942 | // make position fit into array |
1951 | if (x < 0) | 1943 | if (x < 0) |
@@ -2024,7 +2016,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2024 | iy *= regsize; | 2016 | iy *= regsize; |
2025 | iy += ix; // all indexes have iy + ix | 2017 | iy += ix; // all indexes have iy + ix |
2026 | 2018 | ||
2027 | float[] heights = TerrainHeightFieldHeights[heightFieldGeom]; | 2019 | float[] heights = TerrainHeightFieldHeight; |
2028 | /* | 2020 | /* |
2029 | if ((dx + dy) <= 1.0f) | 2021 | if ((dx + dy) <= 1.0f) |
2030 | { | 2022 | { |
@@ -2061,31 +2053,17 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2061 | 2053 | ||
2062 | public Vector3 GetTerrainNormalAtXY(float x, float y) | 2054 | public Vector3 GetTerrainNormalAtXY(float x, float y) |
2063 | { | 2055 | { |
2064 | int offsetX = 0; | ||
2065 | int offsetY = 0; | ||
2066 | |||
2067 | if (m_suportCombine) | ||
2068 | { | ||
2069 | offsetX = ((int)(x / (int)Constants.RegionSize)) * (int)Constants.RegionSize; | ||
2070 | offsetY = ((int)(y / (int)Constants.RegionSize)) * (int)Constants.RegionSize; | ||
2071 | } | ||
2072 | |||
2073 | // get region map | ||
2074 | IntPtr heightFieldGeom = IntPtr.Zero; | ||
2075 | Vector3 norm = new Vector3(0, 0, 1); | 2056 | Vector3 norm = new Vector3(0, 0, 1); |
2076 | 2057 | ||
2077 | if (!RegionTerrain.TryGetValue(new Vector3(offsetX, offsetY, 0), out heightFieldGeom)) | 2058 | if (TerrainGeom == IntPtr.Zero) |
2078 | return norm; ; | ||
2079 | |||
2080 | if (heightFieldGeom == IntPtr.Zero) | ||
2081 | return norm; | 2059 | return norm; |
2082 | 2060 | ||
2083 | if (!TerrainHeightFieldHeights.ContainsKey(heightFieldGeom)) | 2061 | if (TerrainHeightFieldHeight == null || TerrainHeightFieldHeight.Length == 0) |
2084 | return norm; | 2062 | return norm; |
2085 | 2063 | ||
2086 | // TerrainHeightField for ODE as offset 1m | 2064 | // TerrainHeightField for ODE as offset 1m |
2087 | x += 1f - offsetX; | 2065 | x += 1f; |
2088 | y += 1f - offsetY; | 2066 | y += 1f; |
2089 | 2067 | ||
2090 | // make position fit into array | 2068 | // make position fit into array |
2091 | if (x < 0) | 2069 | if (x < 0) |
@@ -2172,7 +2150,7 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2172 | iy *= regsize; | 2150 | iy *= regsize; |
2173 | iy += ix; // all indexes have iy + ix | 2151 | iy += ix; // all indexes have iy + ix |
2174 | 2152 | ||
2175 | float[] heights = TerrainHeightFieldHeights[heightFieldGeom]; | 2153 | float[] heights = TerrainHeightFieldHeight; |
2176 | 2154 | ||
2177 | if (firstTri) | 2155 | if (firstTri) |
2178 | { | 2156 | { |
@@ -2199,34 +2177,13 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2199 | 2177 | ||
2200 | public override void SetTerrain(float[] heightMap) | 2178 | public override void SetTerrain(float[] heightMap) |
2201 | { | 2179 | { |
2202 | if (m_worldOffset != Vector3.Zero && m_parentScene != null) | ||
2203 | { | ||
2204 | if (m_parentScene is ODEScene) | ||
2205 | { | ||
2206 | ((ODEScene)m_parentScene).SetTerrain(heightMap, m_worldOffset); | ||
2207 | } | ||
2208 | } | ||
2209 | else | ||
2210 | { | ||
2211 | SetTerrain(heightMap, m_worldOffset); | ||
2212 | } | ||
2213 | } | ||
2214 | |||
2215 | public override void CombineTerrain(float[] heightMap, Vector3 pOffset) | ||
2216 | { | ||
2217 | if(m_suportCombine) | ||
2218 | SetTerrain(heightMap, pOffset); | ||
2219 | } | ||
2220 | |||
2221 | public void SetTerrain(float[] heightMap, Vector3 pOffset) | ||
2222 | { | ||
2223 | if (m_OSOdeLib) | 2180 | if (m_OSOdeLib) |
2224 | OSSetTerrain(heightMap, pOffset); | 2181 | OSSetTerrain(heightMap); |
2225 | else | 2182 | else |
2226 | OriSetTerrain(heightMap, pOffset); | 2183 | OriSetTerrain(heightMap); |
2227 | } | 2184 | } |
2228 | 2185 | ||
2229 | public void OriSetTerrain(float[] heightMap, Vector3 pOffset) | 2186 | public void OriSetTerrain(float[] heightMap) |
2230 | { | 2187 | { |
2231 | // assumes 1m size grid and constante size square regions | 2188 | // assumes 1m size grid and constante size square regions |
2232 | // needs to know about sims around in future | 2189 | // needs to know about sims around in future |
@@ -2291,45 +2248,40 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2291 | { | 2248 | { |
2292 | d.AllocateODEDataForThread(~0U); | 2249 | d.AllocateODEDataForThread(~0U); |
2293 | 2250 | ||
2294 | IntPtr GroundGeom = IntPtr.Zero; | 2251 | if (TerrainGeom != IntPtr.Zero) |
2295 | if (RegionTerrain.TryGetValue(pOffset, out GroundGeom)) | ||
2296 | { | 2252 | { |
2297 | RegionTerrain.Remove(pOffset); | 2253 | actor_name_map.Remove(TerrainGeom); |
2298 | if (GroundGeom != IntPtr.Zero) | 2254 | d.GeomDestroy(TerrainGeom); |
2299 | { | ||
2300 | actor_name_map.Remove(GroundGeom); | ||
2301 | d.GeomDestroy(GroundGeom); | ||
2302 | 2255 | ||
2303 | if (TerrainHeightFieldHeights.ContainsKey(GroundGeom)) | ||
2304 | { | ||
2305 | TerrainHeightFieldHeightsHandlers[GroundGeom].Free(); | ||
2306 | TerrainHeightFieldHeightsHandlers.Remove(GroundGeom); | ||
2307 | TerrainHeightFieldHeights.Remove(GroundGeom); | ||
2308 | } | ||
2309 | } | ||
2310 | } | 2256 | } |
2257 | |||
2258 | if (TerrainHeightFieldHeightsHandler.IsAllocated) | ||
2259 | TerrainHeightFieldHeightsHandler.Free(); | ||
2260 | |||
2311 | IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); | 2261 | IntPtr HeightmapData = d.GeomHeightfieldDataCreate(); |
2312 | 2262 | ||
2313 | GCHandle _heightmaphandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); | 2263 | GC.Collect(1); |
2264 | |||
2265 | TerrainHeightFieldHeightsHandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); | ||
2314 | 2266 | ||
2315 | d.GeomHeightfieldDataBuildSingle(HeightmapData, _heightmaphandler.AddrOfPinnedObject(), 0, | 2267 | d.GeomHeightfieldDataBuildSingle(HeightmapData, TerrainHeightFieldHeightsHandler.AddrOfPinnedObject(), 0, |
2316 | heightmapHeight, heightmapWidth , | 2268 | heightmapHeight, heightmapWidth , |
2317 | (int)heightmapHeightSamples, (int)heightmapWidthSamples, scale, | 2269 | (int)heightmapHeightSamples, (int)heightmapWidthSamples, scale, |
2318 | offset, thickness, wrap); | 2270 | offset, thickness, wrap); |
2319 | 2271 | ||
2320 | d.GeomHeightfieldDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); | 2272 | d.GeomHeightfieldDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); |
2321 | 2273 | ||
2322 | GroundGeom = d.CreateHeightfield(GroundSpace, HeightmapData, 1); | 2274 | TerrainGeom = d.CreateHeightfield(GroundSpace, HeightmapData, 1); |
2323 | 2275 | ||
2324 | if (GroundGeom != IntPtr.Zero) | 2276 | if (TerrainGeom != IntPtr.Zero) |
2325 | { | 2277 | { |
2326 | d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land)); | 2278 | d.GeomSetCategoryBits(TerrainGeom, (uint)(CollisionCategories.Land)); |
2327 | d.GeomSetCollideBits(GroundGeom, 0); | 2279 | d.GeomSetCollideBits(TerrainGeom, 0); |
2328 | 2280 | ||
2329 | PhysicsActor pa = new NullPhysicsActor(); | 2281 | PhysicsActor pa = new NullPhysicsActor(); |
2330 | pa.Name = "Terrain"; | 2282 | pa.Name = "Terrain"; |
2331 | pa.PhysicsActorType = (int)ActorTypes.Ground; | 2283 | pa.PhysicsActorType = (int)ActorTypes.Ground; |
2332 | actor_name_map[GroundGeom] = pa; | 2284 | actor_name_map[TerrainGeom] = pa; |
2333 | 2285 | ||
2334 | // geom_name_map[GroundGeom] = "Terrain"; | 2286 | // geom_name_map[GroundGeom] = "Terrain"; |
2335 | 2287 | ||
@@ -2339,16 +2291,16 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2339 | q.Z = 0.5f; | 2291 | q.Z = 0.5f; |
2340 | q.W = 0.5f; | 2292 | q.W = 0.5f; |
2341 | 2293 | ||
2342 | d.GeomSetQuaternion(GroundGeom, ref q); | 2294 | d.GeomSetQuaternion(TerrainGeom, ref q); |
2343 | d.GeomSetPosition(GroundGeom, pOffset.X + m_regionWidth * 0.5f, pOffset.Y + m_regionHeight * 0.5f, 0.0f); | 2295 | d.GeomSetPosition(TerrainGeom, m_regionWidth * 0.5f, m_regionHeight * 0.5f, 0.0f); |
2344 | RegionTerrain.Add(pOffset, GroundGeom); | 2296 | TerrainHeightFieldHeight = _heightmap; |
2345 | TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); | ||
2346 | TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler); | ||
2347 | } | 2297 | } |
2298 | else | ||
2299 | TerrainHeightFieldHeightsHandler.Free(); | ||
2348 | } | 2300 | } |
2349 | } | 2301 | } |
2350 | 2302 | ||
2351 | public void OSSetTerrain(float[] heightMap, Vector3 pOffset) | 2303 | public void OSSetTerrain(float[] heightMap) |
2352 | { | 2304 | { |
2353 | // assumes 1m size grid and constante size square regions | 2305 | // assumes 1m size grid and constante size square regions |
2354 | // needs to know about sims around in future | 2306 | // needs to know about sims around in future |
@@ -2402,26 +2354,20 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2402 | } | 2354 | } |
2403 | yt += heightmapWidthSamples; | 2355 | yt += heightmapWidthSamples; |
2404 | } | 2356 | } |
2357 | |||
2405 | lock (OdeLock) | 2358 | lock (OdeLock) |
2406 | { | 2359 | { |
2407 | IntPtr GroundGeom = IntPtr.Zero; | 2360 | if (TerrainGeom != IntPtr.Zero) |
2408 | if (RegionTerrain.TryGetValue(pOffset, out GroundGeom)) | ||
2409 | { | 2361 | { |
2410 | RegionTerrain.Remove(pOffset); | 2362 | actor_name_map.Remove(TerrainGeom); |
2411 | if (GroundGeom != IntPtr.Zero) | 2363 | d.GeomDestroy(TerrainGeom); |
2412 | { | ||
2413 | actor_name_map.Remove(GroundGeom); | ||
2414 | d.GeomDestroy(GroundGeom); | ||
2415 | |||
2416 | if (TerrainHeightFieldHeights.ContainsKey(GroundGeom)) | ||
2417 | { | ||
2418 | if (TerrainHeightFieldHeightsHandlers[GroundGeom].IsAllocated) | ||
2419 | TerrainHeightFieldHeightsHandlers[GroundGeom].Free(); | ||
2420 | TerrainHeightFieldHeightsHandlers.Remove(GroundGeom); | ||
2421 | TerrainHeightFieldHeights.Remove(GroundGeom); | ||
2422 | } | ||
2423 | } | ||
2424 | } | 2364 | } |
2365 | |||
2366 | if (TerrainHeightFieldHeightsHandler.IsAllocated) | ||
2367 | TerrainHeightFieldHeightsHandler.Free(); | ||
2368 | |||
2369 | TerrainHeightFieldHeight = null; | ||
2370 | |||
2425 | IntPtr HeightmapData = d.GeomOSTerrainDataCreate(); | 2371 | IntPtr HeightmapData = d.GeomOSTerrainDataCreate(); |
2426 | 2372 | ||
2427 | const int wrap = 0; | 2373 | const int wrap = 0; |
@@ -2429,32 +2375,31 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2429 | if (thickness < 0) | 2375 | if (thickness < 0) |
2430 | thickness = 1; | 2376 | thickness = 1; |
2431 | 2377 | ||
2432 | GCHandle _heightmaphandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); | 2378 | TerrainHeightFieldHeightsHandler = GCHandle.Alloc(_heightmap, GCHandleType.Pinned); |
2433 | 2379 | ||
2434 | d.GeomOSTerrainDataBuild(HeightmapData, _heightmaphandler.AddrOfPinnedObject(), 0, 1.0f, | 2380 | d.GeomOSTerrainDataBuild(HeightmapData, TerrainHeightFieldHeightsHandler.AddrOfPinnedObject(), 0, 1.0f, |
2435 | (int)heightmapWidthSamples, (int)heightmapHeightSamples, | 2381 | (int)heightmapWidthSamples, (int)heightmapHeightSamples, |
2436 | thickness, wrap); | 2382 | thickness, wrap); |
2437 | 2383 | ||
2438 | // d.GeomOSTerrainDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); | 2384 | // d.GeomOSTerrainDataSetBounds(HeightmapData, hfmin - 1, hfmax + 1); |
2439 | GroundGeom = d.CreateOSTerrain(GroundSpace, HeightmapData, 1); | 2385 | TerrainGeom = d.CreateOSTerrain(GroundSpace, HeightmapData, 1); |
2440 | if (GroundGeom != IntPtr.Zero) | 2386 | if (TerrainGeom != IntPtr.Zero) |
2441 | { | 2387 | { |
2442 | d.GeomSetCategoryBits(GroundGeom, (uint)(CollisionCategories.Land)); | 2388 | d.GeomSetCategoryBits(TerrainGeom, (uint)(CollisionCategories.Land)); |
2443 | d.GeomSetCollideBits(GroundGeom, 0); | 2389 | d.GeomSetCollideBits(TerrainGeom, 0); |
2444 | |||
2445 | 2390 | ||
2446 | PhysicsActor pa = new NullPhysicsActor(); | 2391 | PhysicsActor pa = new NullPhysicsActor(); |
2447 | pa.Name = "Terrain"; | 2392 | pa.Name = "Terrain"; |
2448 | pa.PhysicsActorType = (int)ActorTypes.Ground; | 2393 | pa.PhysicsActorType = (int)ActorTypes.Ground; |
2449 | actor_name_map[GroundGeom] = pa; | 2394 | actor_name_map[TerrainGeom] = pa; |
2450 | 2395 | ||
2451 | // geom_name_map[GroundGeom] = "Terrain"; | 2396 | // geom_name_map[GroundGeom] = "Terrain"; |
2452 | 2397 | ||
2453 | d.GeomSetPosition(GroundGeom, pOffset.X + m_regionWidth * 0.5f, pOffset.Y + m_regionHeight * 0.5f, 0.0f); | 2398 | d.GeomSetPosition(TerrainGeom, m_regionWidth * 0.5f, m_regionHeight * 0.5f, 0.0f); |
2454 | RegionTerrain.Add(pOffset, GroundGeom); | 2399 | TerrainHeightFieldHeight = _heightmap; |
2455 | TerrainHeightFieldHeights.Add(GroundGeom, _heightmap); | 2400 | } |
2456 | TerrainHeightFieldHeightsHandlers.Add(GroundGeom, _heightmaphandler); | 2401 | else |
2457 | } | 2402 | TerrainHeightFieldHeightsHandler.Free(); |
2458 | } | 2403 | } |
2459 | } | 2404 | } |
2460 | 2405 | ||
@@ -2467,11 +2412,6 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2467 | return waterlevel; | 2412 | return waterlevel; |
2468 | } | 2413 | } |
2469 | 2414 | ||
2470 | public override bool SupportsCombining() | ||
2471 | { | ||
2472 | return m_suportCombine; | ||
2473 | } | ||
2474 | |||
2475 | public override void SetWaterLevel(float baseheight) | 2415 | public override void SetWaterLevel(float baseheight) |
2476 | { | 2416 | { |
2477 | waterlevel = baseheight; | 2417 | waterlevel = baseheight; |
@@ -2518,26 +2458,14 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2518 | foreach (OdeCharacter ch in chtorem) | 2458 | foreach (OdeCharacter ch in chtorem) |
2519 | ch.DoAChange(changes.Remove, null); | 2459 | ch.DoAChange(changes.Remove, null); |
2520 | 2460 | ||
2461 | if (TerrainGeom != IntPtr.Zero) | ||
2462 | d.GeomDestroy(TerrainGeom); | ||
2463 | TerrainGeom = IntPtr.Zero; | ||
2521 | 2464 | ||
2522 | foreach (IntPtr GroundGeom in RegionTerrain.Values) | 2465 | if (TerrainHeightFieldHeightsHandler.IsAllocated) |
2523 | { | 2466 | TerrainHeightFieldHeightsHandler.Free(); |
2524 | if (GroundGeom != IntPtr.Zero) | ||
2525 | d.GeomDestroy(GroundGeom); | ||
2526 | } | ||
2527 | 2467 | ||
2528 | RegionTerrain.Clear(); | 2468 | TerrainHeightFieldHeight = null; |
2529 | |||
2530 | if (TerrainHeightFieldHeightsHandlers.Count > 0) | ||
2531 | { | ||
2532 | foreach (GCHandle gch in TerrainHeightFieldHeightsHandlers.Values) | ||
2533 | { | ||
2534 | if (gch.IsAllocated) | ||
2535 | gch.Free(); | ||
2536 | } | ||
2537 | } | ||
2538 | |||
2539 | TerrainHeightFieldHeightsHandlers.Clear(); | ||
2540 | TerrainHeightFieldHeights.Clear(); | ||
2541 | 2469 | ||
2542 | if (ContactgeomsArray != IntPtr.Zero) | 2470 | if (ContactgeomsArray != IntPtr.Zero) |
2543 | { | 2471 | { |
@@ -2556,27 +2484,22 @@ namespace OpenSim.Region.PhysicsModule.ubOde | |||
2556 | } | 2484 | } |
2557 | } | 2485 | } |
2558 | 2486 | ||
2487 | private int compareByCollisionsDesc(OdePrim A, OdePrim B) | ||
2488 | { | ||
2489 | return -A.CollisionScore.CompareTo(B.CollisionScore); | ||
2490 | } | ||
2491 | |||
2559 | public override Dictionary<uint, float> GetTopColliders() | 2492 | public override Dictionary<uint, float> GetTopColliders() |
2560 | { | 2493 | { |
2561 | Dictionary<uint, float> returncolliders = new Dictionary<uint, float>(); | 2494 | Dictionary<uint, float> topColliders; |
2562 | int cnt = 0; | 2495 | List<OdePrim> orderedPrims; |
2563 | lock (_prims) | 2496 | lock (_activeprims) |
2564 | { | 2497 | orderedPrims = new List<OdePrim>(_activeprims); |
2565 | foreach (OdePrim prm in _prims.Values) | 2498 | |
2566 | { | 2499 | orderedPrims.Sort(compareByCollisionsDesc); |
2567 | if (prm.CollisionScore > 0) | 2500 | topColliders = orderedPrims.Take(25).ToDictionary(p => p.LocalID, p => p.CollisionScore); |
2568 | { | 2501 | |
2569 | returncolliders.Add(prm.LocalID, prm.CollisionScore); | 2502 | return topColliders; |
2570 | cnt++; | ||
2571 | prm.CollisionScore = 0f; | ||
2572 | if (cnt > 25) | ||
2573 | { | ||
2574 | break; | ||
2575 | } | ||
2576 | } | ||
2577 | } | ||
2578 | } | ||
2579 | return returncolliders; | ||
2580 | } | 2503 | } |
2581 | 2504 | ||
2582 | public override bool SupportsRayCast() | 2505 | public override bool SupportsRayCast() |
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs index 6e43cf8..d9544db 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/Meshmerizer.cs | |||
@@ -121,9 +121,9 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
121 | 121 | ||
122 | CacheExpire = TimeSpan.FromHours(fcache); | 122 | CacheExpire = TimeSpan.FromHours(fcache); |
123 | 123 | ||
124 | if(doMeshFileCache && cachePath != "") | 124 | lock (diskLock) |
125 | { | 125 | { |
126 | lock (diskLock) | 126 | if(doMeshFileCache && cachePath != "") |
127 | { | 127 | { |
128 | try | 128 | try |
129 | { | 129 | { |
@@ -619,7 +619,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
619 | vs.Clear(); | 619 | vs.Clear(); |
620 | continue; | 620 | continue; |
621 | } | 621 | } |
622 | 622 | /* | |
623 | if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f)) | 623 | if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f)) |
624 | { | 624 | { |
625 | vs.Clear(); | 625 | vs.Clear(); |
@@ -657,6 +657,45 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
657 | f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3); | 657 | f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3); |
658 | faces.Add(f); | 658 | faces.Add(f); |
659 | } | 659 | } |
660 | */ | ||
661 | List<int> indices; | ||
662 | if (!HullUtils.ComputeHull(vs, out indices)) | ||
663 | { | ||
664 | vs.Clear(); | ||
665 | continue; | ||
666 | } | ||
667 | |||
668 | nverts = vs.Count; | ||
669 | nindexs = indices.Count; | ||
670 | |||
671 | if (nindexs % 3 != 0) | ||
672 | { | ||
673 | vs.Clear(); | ||
674 | continue; | ||
675 | } | ||
676 | |||
677 | for (i = 0; i < nverts; i++) | ||
678 | { | ||
679 | c.X = vs[i].x; | ||
680 | c.Y = vs[i].y; | ||
681 | c.Z = vs[i].z; | ||
682 | coords.Add(c); | ||
683 | } | ||
684 | |||
685 | for (i = 0; i < nindexs; i += 3) | ||
686 | { | ||
687 | t1 = indices[i]; | ||
688 | if (t1 > nverts) | ||
689 | break; | ||
690 | t2 = indices[i + 1]; | ||
691 | if (t2 > nverts) | ||
692 | break; | ||
693 | t3 = indices[i + 2]; | ||
694 | if (t3 > nverts) | ||
695 | break; | ||
696 | f = new Face(vertsoffset + t1, vertsoffset + t2, vertsoffset + t3); | ||
697 | faces.Add(f); | ||
698 | } | ||
660 | vertsoffset += nverts; | 699 | vertsoffset += nverts; |
661 | vs.Clear(); | 700 | vs.Clear(); |
662 | } | 701 | } |
@@ -686,13 +725,15 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
686 | vs.Add(f3); | 725 | vs.Add(f3); |
687 | } | 726 | } |
688 | 727 | ||
689 | if (vs.Count < 3) | 728 | nverts = vs.Count; |
729 | |||
730 | if (nverts < 3) | ||
690 | { | 731 | { |
691 | vs.Clear(); | 732 | vs.Clear(); |
692 | return false; | 733 | return false; |
693 | } | 734 | } |
694 | 735 | ||
695 | if (vs.Count < 5) | 736 | if (nverts < 5) |
696 | { | 737 | { |
697 | foreach (float3 point in vs) | 738 | foreach (float3 point in vs) |
698 | { | 739 | { |
@@ -701,10 +742,11 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
701 | c.Z = point.z; | 742 | c.Z = point.z; |
702 | coords.Add(c); | 743 | coords.Add(c); |
703 | } | 744 | } |
745 | |||
704 | f = new Face(0, 1, 2); | 746 | f = new Face(0, 1, 2); |
705 | faces.Add(f); | 747 | faces.Add(f); |
706 | 748 | ||
707 | if (vs.Count == 4) | 749 | if (nverts == 4) |
708 | { | 750 | { |
709 | f = new Face(0, 2, 3); | 751 | f = new Face(0, 2, 3); |
710 | faces.Add(f); | 752 | faces.Add(f); |
@@ -716,7 +758,7 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
716 | vs.Clear(); | 758 | vs.Clear(); |
717 | return true; | 759 | return true; |
718 | } | 760 | } |
719 | 761 | /* | |
720 | if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f)) | 762 | if (!HullUtils.ComputeHull(vs, ref hullr, 0, 0.0f)) |
721 | return false; | 763 | return false; |
722 | 764 | ||
@@ -747,7 +789,38 @@ namespace OpenSim.Region.PhysicsModule.ubODEMeshing | |||
747 | f = new Face(t1, t2, t3); | 789 | f = new Face(t1, t2, t3); |
748 | faces.Add(f); | 790 | faces.Add(f); |
749 | } | 791 | } |
792 | */ | ||
793 | List<int> indices; | ||
794 | if (!HullUtils.ComputeHull(vs, out indices)) | ||
795 | return false; | ||
796 | |||
797 | nindexs = indices.Count; | ||
750 | 798 | ||
799 | if (nindexs % 3 != 0) | ||
800 | return false; | ||
801 | |||
802 | for (i = 0; i < nverts; i++) | ||
803 | { | ||
804 | c.X = vs[i].x; | ||
805 | c.Y = vs[i].y; | ||
806 | c.Z = vs[i].z; | ||
807 | coords.Add(c); | ||
808 | } | ||
809 | for (i = 0; i < nindexs; i += 3) | ||
810 | { | ||
811 | t1 = indices[i]; | ||
812 | if (t1 > nverts) | ||
813 | break; | ||
814 | t2 = indices[i + 1]; | ||
815 | if (t2 > nverts) | ||
816 | break; | ||
817 | t3 = indices[i + 2]; | ||
818 | if (t3 > nverts) | ||
819 | break; | ||
820 | f = new Face(t1, t2, t3); | ||
821 | faces.Add(f); | ||
822 | } | ||
823 | vs.Clear(); | ||
751 | if (coords.Count > 0 && faces.Count > 0) | 824 | if (coords.Count > 0 && faces.Count > 0) |
752 | return true; | 825 | return true; |
753 | } | 826 | } |
diff --git a/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMap.cs b/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMap.cs index 1c75db6..2ca2af7 100644 --- a/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMap.cs +++ b/OpenSim/Region/PhysicsModules/ubOdeMeshing/SculptMap.cs | |||
@@ -57,7 +57,7 @@ namespace PrimMesher | |||
57 | int numLodPixels = lod * lod; // (32 * 2)^2 = 64^2 pixels for default sculpt map image | 57 | int numLodPixels = lod * lod; // (32 * 2)^2 = 64^2 pixels for default sculpt map image |
58 | 58 | ||
59 | bool needsScaling = false; | 59 | bool needsScaling = false; |
60 | bool smallMap = false; | 60 | bool smallMap = false; |
61 | 61 | ||
62 | width = bmW; | 62 | width = bmW; |
63 | height = bmH; | 63 | height = bmH; |
@@ -69,16 +69,8 @@ namespace PrimMesher | |||
69 | needsScaling = true; | 69 | needsScaling = true; |
70 | } | 70 | } |
71 | 71 | ||
72 | try | 72 | if (needsScaling) |
73 | { | 73 | bm = ScaleImage(bm, width, height); |
74 | if (needsScaling) | ||
75 | bm = ScaleImage(bm, width, height); | ||
76 | } | ||
77 | |||
78 | catch (Exception e) | ||
79 | { | ||
80 | throw new Exception("Exception in ScaleImage(): e: " + e.ToString()); | ||
81 | } | ||
82 | 74 | ||
83 | if (width * height > numLodPixels) | 75 | if (width * height > numLodPixels) |
84 | { | 76 | { |
@@ -129,11 +121,15 @@ namespace PrimMesher | |||
129 | } | 121 | } |
130 | catch (Exception e) | 122 | catch (Exception e) |
131 | { | 123 | { |
124 | if (needsScaling) | ||
125 | bm.Dispose(); | ||
132 | throw new Exception("Caught exception processing byte arrays in SculptMap(): e: " + e.ToString()); | 126 | throw new Exception("Caught exception processing byte arrays in SculptMap(): e: " + e.ToString()); |
133 | } | 127 | } |
134 | 128 | ||
135 | width++; | 129 | width++; |
136 | height++; | 130 | height++; |
131 | if(needsScaling) | ||
132 | bm.Dispose(); | ||
137 | } | 133 | } |
138 | 134 | ||
139 | public List<List<Coord>> ToRows(bool mirror) | 135 | public List<List<Coord>> ToRows(bool mirror) |
@@ -168,11 +164,9 @@ namespace PrimMesher | |||
168 | 164 | ||
169 | private Bitmap ScaleImage(Bitmap srcImage, int destWidth, int destHeight) | 165 | private Bitmap ScaleImage(Bitmap srcImage, int destWidth, int destHeight) |
170 | { | 166 | { |
171 | |||
172 | Bitmap scaledImage = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb); | 167 | Bitmap scaledImage = new Bitmap(destWidth, destHeight, PixelFormat.Format24bppRgb); |
173 | 168 | ||
174 | Color c; | 169 | Color c; |
175 | |||
176 | 170 | ||
177 | // will let last step to be eventually diferent, as seems to be in sl | 171 | // will let last step to be eventually diferent, as seems to be in sl |
178 | 172 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index ce0e59c..66cb30c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -4323,6 +4323,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4323 | return; | 4323 | return; |
4324 | 4324 | ||
4325 | SceneObjectPart targetPart = World.GetSceneObjectPart((UUID)targetID); | 4325 | SceneObjectPart targetPart = World.GetSceneObjectPart((UUID)targetID); |
4326 | if (targetPart == null) | ||
4327 | return; | ||
4326 | 4328 | ||
4327 | if (targetPart.ParentGroup.AttachmentPoint != 0) | 4329 | if (targetPart.ParentGroup.AttachmentPoint != 0) |
4328 | return; // Fail silently if attached | 4330 | return; // Fail silently if attached |
@@ -4332,24 +4334,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4332 | 4334 | ||
4333 | SceneObjectGroup parentPrim = null, childPrim = null; | 4335 | SceneObjectGroup parentPrim = null, childPrim = null; |
4334 | 4336 | ||
4335 | if (targetPart != null) | 4337 | if (parent != 0) |
4336 | { | 4338 | { |
4337 | if (parent != 0) | 4339 | parentPrim = m_host.ParentGroup; |
4338 | { | 4340 | childPrim = targetPart.ParentGroup; |
4339 | parentPrim = m_host.ParentGroup; | 4341 | } |
4340 | childPrim = targetPart.ParentGroup; | 4342 | else |
4341 | } | 4343 | { |
4342 | else | 4344 | parentPrim = targetPart.ParentGroup; |
4343 | { | 4345 | childPrim = m_host.ParentGroup; |
4344 | parentPrim = targetPart.ParentGroup; | ||
4345 | childPrim = m_host.ParentGroup; | ||
4346 | } | ||
4347 | |||
4348 | // Required for linking | ||
4349 | childPrim.RootPart.ClearUpdateSchedule(); | ||
4350 | parentPrim.LinkToGroup(childPrim, true); | ||
4351 | } | 4346 | } |
4352 | 4347 | ||
4348 | // Required for linking | ||
4349 | childPrim.RootPart.ClearUpdateSchedule(); | ||
4350 | parentPrim.LinkToGroup(childPrim, true); | ||
4351 | |||
4352 | |||
4353 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); | 4353 | parentPrim.TriggerScriptChangedEvent(Changed.LINK); |
4354 | parentPrim.RootPart.CreateSelected = true; | 4354 | parentPrim.RootPart.CreateSelected = true; |
4355 | parentPrim.HasGroupChanged = true; | 4355 | parentPrim.HasGroupChanged = true; |
@@ -4741,20 +4741,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4741 | { | 4741 | { |
4742 | m_host.AddScriptLPS(1); | 4742 | m_host.AddScriptLPS(1); |
4743 | Vector3 av3 = Util.Clip(color, 0.0f, 1.0f); | 4743 | Vector3 av3 = Util.Clip(color, 0.0f, 1.0f); |
4744 | if (text.Length > 254) | ||
4745 | text = text.Remove(254); | ||
4746 | |||
4747 | byte[] data; | 4744 | byte[] data; |
4748 | do | 4745 | data = Util.StringToBytes256(text); |
4749 | { | 4746 | text = Util.UTF8.GetString(data); |
4750 | data = Util.UTF8.GetBytes(text); | ||
4751 | if (data.Length > 254) | ||
4752 | text = text.Substring(0, text.Length - 1); | ||
4753 | } while (data.Length > 254); | ||
4754 | |||
4755 | m_host.SetText(text, av3, Util.Clip((float)alpha, 0.0f, 1.0f)); | 4747 | m_host.SetText(text, av3, Util.Clip((float)alpha, 0.0f, 1.0f)); |
4756 | //m_host.ParentGroup.HasGroupChanged = true; | ||
4757 | //m_host.ParentGroup.ScheduleGroupForFullUpdate(); | ||
4758 | } | 4748 | } |
4759 | 4749 | ||
4760 | public LSL_Float llWater(LSL_Vector offset) | 4750 | public LSL_Float llWater(LSL_Vector offset) |
@@ -5118,13 +5108,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5118 | { | 5108 | { |
5119 | m_host.CollisionSoundVolume = (float)impact_volume; | 5109 | m_host.CollisionSoundVolume = (float)impact_volume; |
5120 | m_host.CollisionSound = m_host.invalidCollisionSoundUUID; | 5110 | m_host.CollisionSound = m_host.invalidCollisionSoundUUID; |
5121 | m_host.CollisionSoundType = 0; | 5111 | m_host.CollisionSoundType = -1; // disable all sounds |
5112 | m_host.aggregateScriptEvents(); | ||
5122 | return; | 5113 | return; |
5123 | } | 5114 | } |
5115 | |||
5124 | // TODO: Parameter check logic required. | 5116 | // TODO: Parameter check logic required. |
5125 | m_host.CollisionSound = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound); | 5117 | UUID soundId = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound); |
5126 | m_host.CollisionSoundVolume = (float)impact_volume; | 5118 | if(soundId != UUID.Zero) |
5127 | m_host.CollisionSoundType = 1; | 5119 | { |
5120 | m_host.CollisionSound = soundId; | ||
5121 | m_host.CollisionSoundVolume = (float)impact_volume; | ||
5122 | m_host.CollisionSoundType = 1; | ||
5123 | } | ||
5124 | else | ||
5125 | m_host.CollisionSoundType = -1; | ||
5126 | |||
5127 | m_host.aggregateScriptEvents(); | ||
5128 | } | 5128 | } |
5129 | 5129 | ||
5130 | public LSL_String llGetAnimation(string id) | 5130 | public LSL_String llGetAnimation(string id) |
@@ -14679,13 +14679,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
14679 | msAvailable -= m_castRayCalls[i].UsedMs; | 14679 | msAvailable -= m_castRayCalls[i].UsedMs; |
14680 | } | 14680 | } |
14681 | } | 14681 | } |
14682 | } | ||
14683 | 14682 | ||
14684 | // Return failure if not enough available time | 14683 | // Return failure if not enough available time |
14685 | if (msAvailable < m_msMinInCastRay) | 14684 | if (msAvailable < m_msMinInCastRay) |
14686 | { | 14685 | { |
14687 | result.Add(new LSL_Integer(ScriptBaseClass.RCERR_CAST_TIME_EXCEEDED)); | 14686 | result.Add(new LSL_Integer(ScriptBaseClass.RCERR_CAST_TIME_EXCEEDED)); |
14688 | return result; | 14687 | return result; |
14688 | } | ||
14689 | } | 14689 | } |
14690 | 14690 | ||
14691 | // Initialize | 14691 | // Initialize |
@@ -15073,13 +15073,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
15073 | 15073 | ||
15074 | // Add to throttle data | 15074 | // Add to throttle data |
15075 | stopWatch.Stop(); | 15075 | stopWatch.Stop(); |
15076 | CastRayCall castRayCall = new CastRayCall(); | ||
15077 | castRayCall.RegionId = regionId; | ||
15078 | castRayCall.UserId = userId; | ||
15079 | castRayCall.CalledMs = calledMs; | ||
15080 | castRayCall.UsedMs = (int)stopWatch.ElapsedMilliseconds; | ||
15081 | lock (m_castRayCalls) | 15076 | lock (m_castRayCalls) |
15082 | { | 15077 | { |
15078 | CastRayCall castRayCall = new CastRayCall(); | ||
15079 | castRayCall.RegionId = regionId; | ||
15080 | castRayCall.UserId = userId; | ||
15081 | castRayCall.CalledMs = calledMs; | ||
15082 | castRayCall.UsedMs = (int)stopWatch.ElapsedMilliseconds; | ||
15083 | m_castRayCalls.Add(castRayCall); | 15083 | m_castRayCalls.Add(castRayCall); |
15084 | } | 15084 | } |
15085 | 15085 | ||
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs index e525a2e..4af4339 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs | |||
@@ -45,6 +45,7 @@ using OpenSim.Framework; | |||
45 | using OpenSim.Framework.Console; | 45 | using OpenSim.Framework.Console; |
46 | using OpenSim.Region.Framework.Interfaces; | 46 | using OpenSim.Region.Framework.Interfaces; |
47 | using OpenSim.Region.Framework.Scenes; | 47 | using OpenSim.Region.Framework.Scenes; |
48 | using OpenSim.Region.Framework.Scenes.Scripting; | ||
48 | using OpenSim.Region.ScriptEngine.Shared; | 49 | using OpenSim.Region.ScriptEngine.Shared; |
49 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; | 50 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; |
50 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 51 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
@@ -4250,5 +4251,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4250 | return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID, opts).ToString(); | 4251 | return m_UrlModule.RequestSecureURL(m_ScriptEngine.ScriptModule, m_host, m_item.ItemID, opts).ToString(); |
4251 | return UUID.Zero.ToString(); | 4252 | return UUID.Zero.ToString(); |
4252 | } | 4253 | } |
4254 | |||
4255 | public void osCollisionSound(string impact_sound, double impact_volume) | ||
4256 | { | ||
4257 | m_host.AddScriptLPS(1); | ||
4258 | |||
4259 | if(impact_sound == "") | ||
4260 | { | ||
4261 | m_host.CollisionSoundVolume = (float)impact_volume; | ||
4262 | m_host.CollisionSound = m_host.invalidCollisionSoundUUID; | ||
4263 | if(impact_volume == 0.0) | ||
4264 | m_host.CollisionSoundType = -1; // disable all sounds | ||
4265 | else if(impact_volume == 1.0f) | ||
4266 | m_host.CollisionSoundType = 0; // full return to default sounds | ||
4267 | else | ||
4268 | m_host.CollisionSoundType = 2; // default sounds with volume | ||
4269 | m_host.aggregateScriptEvents(); | ||
4270 | return; | ||
4271 | } | ||
4272 | // TODO: Parameter check logic required. | ||
4273 | UUID soundId = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound); | ||
4274 | if(soundId != UUID.Zero) | ||
4275 | { | ||
4276 | m_host.CollisionSound = soundId; | ||
4277 | m_host.CollisionSoundVolume = (float)impact_volume; | ||
4278 | m_host.CollisionSoundType = 1; | ||
4279 | } | ||
4280 | else | ||
4281 | m_host.CollisionSoundType = -1; | ||
4282 | |||
4283 | m_host.aggregateScriptEvents(); | ||
4284 | } | ||
4285 | |||
4286 | // still not very usefull, detector is lost on rez, restarts, etc | ||
4287 | public void osVolumeDetect(int detect) | ||
4288 | { | ||
4289 | m_host.AddScriptLPS(1); | ||
4290 | |||
4291 | if (m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted || m_host.ParentGroup.IsAttachment) | ||
4292 | return; | ||
4293 | |||
4294 | m_host.ScriptSetVolumeDetect(detect != 0); | ||
4295 | } | ||
4296 | |||
4253 | } | 4297 | } |
4254 | } | 4298 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs index c99679e..5ce859e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | |||
@@ -476,5 +476,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces | |||
476 | 476 | ||
477 | LSL_String osRequestURL(LSL_List options); | 477 | LSL_String osRequestURL(LSL_List options); |
478 | LSL_String osRequestSecureURL(LSL_List options); | 478 | LSL_String osRequestSecureURL(LSL_List options); |
479 | void osCollisionSound(string impact_sound, double impact_volume); | ||
480 | void osVolumeDetect(int detect); | ||
479 | } | 481 | } |
480 | } | 482 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs index 35eee59..c5cb88e 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | |||
@@ -1089,5 +1089,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase | |||
1089 | { | 1089 | { |
1090 | return m_OSSL_Functions.osRequestSecureURL(options); | 1090 | return m_OSSL_Functions.osRequestSecureURL(options); |
1091 | } | 1091 | } |
1092 | |||
1093 | public void osCollisionSound(string impact_sound, double impact_volume) | ||
1094 | { | ||
1095 | m_OSSL_Functions.osCollisionSound(impact_sound, impact_volume); | ||
1096 | } | ||
1097 | |||
1098 | public void osVolumeDetect(int detect) | ||
1099 | { | ||
1100 | m_OSSL_Functions.osVolumeDetect(detect); | ||
1101 | } | ||
1092 | } | 1102 | } |
1093 | } | 1103 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs index 4e0c273..bc6ce4f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs | |||
@@ -26,6 +26,7 @@ | |||
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System; | 28 | using System; |
29 | using System.Text; | ||
29 | using System.IO; | 30 | using System.IO; |
30 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
31 | using System.Reflection; | 32 | using System.Reflection; |
@@ -39,9 +40,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
39 | { | 40 | { |
40 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 41 | // private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
41 | 42 | ||
43 | private static yyLSLSyntax yyLSL = new yyLSLSyntax(); | ||
42 | private SYMBOL m_astRoot = null; | 44 | private SYMBOL m_astRoot = null; |
43 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> m_positionMap; | 45 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> m_positionMap; |
44 | private int m_indentWidth = 4; // for indentation | ||
45 | private int m_braceCount; // for indentation | 46 | private int m_braceCount; // for indentation |
46 | private int m_CSharpLine; // the current line of generated C# code | 47 | private int m_CSharpLine; // the current line of generated C# code |
47 | private int m_CSharpCol; // the current column of generated C# code | 48 | private int m_CSharpCol; // the current column of generated C# code |
@@ -94,6 +95,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
94 | get { return m_astRoot; } | 95 | get { return m_astRoot; } |
95 | } | 96 | } |
96 | 97 | ||
98 | public void Clear() | ||
99 | { | ||
100 | m_astRoot.kids = null; | ||
101 | m_astRoot.yylx = null; | ||
102 | m_astRoot.yyps = null; | ||
103 | m_astRoot = null; | ||
104 | m_positionMap = null; | ||
105 | m_warnings.Clear(); | ||
106 | m_comms = null; | ||
107 | } | ||
97 | /// <summary> | 108 | /// <summary> |
98 | /// Resets various counters and metadata. | 109 | /// Resets various counters and metadata. |
99 | /// </summary> | 110 | /// </summary> |
@@ -106,18 +117,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
106 | m_astRoot = null; | 117 | m_astRoot = null; |
107 | } | 118 | } |
108 | 119 | ||
120 | public string Convert(string script) | ||
121 | { | ||
122 | StringBuilder sb = new StringBuilder(4096); | ||
123 | Convert(script, sb); | ||
124 | return sb.ToString(); | ||
125 | } | ||
126 | |||
109 | /// <summary> | 127 | /// <summary> |
110 | /// Generate the code from the AST we have. | 128 | /// Generate the code from the AST we have. |
111 | /// </summary> | 129 | /// </summary> |
112 | /// <param name="script">The LSL source as a string.</param> | 130 | /// <param name="script">The LSL source as a string.</param> |
113 | /// <returns>String containing the generated C# code.</returns> | 131 | /// <returns>String containing the generated C# code.</returns> |
114 | public string Convert(string script) | 132 | public void Convert(string script, StringBuilder sb) |
115 | { | 133 | { |
116 | // m_log.DebugFormat("[CS CODE GENERATOR]: Converting to C#\n{0}", script); | 134 | // m_log.DebugFormat("[CS CODE GENERATOR]: Converting to C#\n{0}", script); |
117 | 135 | ||
118 | m_warnings.Clear(); | 136 | m_warnings.Clear(); |
119 | ResetCounters(); | 137 | ResetCounters(); |
120 | Parser p = new LSLSyntax(new yyLSLSyntax(), new ErrorHandler(true)); | 138 | ErrorHandler errorHandler = new ErrorHandler(true); |
139 | Parser p = new LSLSyntax(yyLSL, errorHandler); | ||
121 | 140 | ||
122 | LSL2CSCodeTransformer codeTransformer; | 141 | LSL2CSCodeTransformer codeTransformer; |
123 | try | 142 | try |
@@ -148,38 +167,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
148 | 167 | ||
149 | m_astRoot = codeTransformer.Transform(); | 168 | m_astRoot = codeTransformer.Transform(); |
150 | 169 | ||
151 | string retstr = String.Empty; | ||
152 | 170 | ||
153 | // standard preamble | 171 | // standard preamble |
154 | //retstr = GenerateLine("using OpenSim.Region.ScriptEngine.Common;"); | 172 | |
155 | //retstr += GenerateLine("using System.Collections.Generic;"); | 173 | |
156 | //retstr += GenerateLine(""); | 174 | |
157 | //retstr += GenerateLine("namespace SecondLife"); | ||
158 | //retstr += GenerateLine("{"); | ||
159 | m_braceCount++; | 175 | m_braceCount++; |
160 | //retstr += GenerateIndentedLine("public class Script : OpenSim.Region.ScriptEngine.Common"); | ||
161 | //retstr += GenerateIndentedLine("{"); | ||
162 | m_braceCount++; | 176 | m_braceCount++; |
163 | 177 | ||
164 | // line number | 178 | // line number |
165 | m_CSharpLine += 9; | 179 | m_CSharpLine += 10; |
166 | 180 | ||
167 | // here's the payload | 181 | // here's the payload |
168 | retstr += GenerateLine(); | 182 | sb.Append("\n"); |
169 | foreach (SYMBOL s in m_astRoot.kids) | 183 | foreach (SYMBOL s in m_astRoot.kids) |
170 | retstr += GenerateNode(m_astRoot, s); | 184 | GenerateNodeToSB(m_astRoot, s, sb); |
185 | |||
186 | codeTransformer = null; | ||
187 | p.m_lexer.m_buf=null; | ||
188 | p.m_lexer.yytext = null; | ||
189 | p.m_lexer = null; | ||
190 | p.m_symbols = null; | ||
191 | p = null; | ||
192 | errorHandler = null; | ||
171 | 193 | ||
172 | // close braces! | 194 | // close braces! |
173 | m_braceCount--; | 195 | // m_braceCount--; |
174 | //retstr += GenerateIndentedLine("}"); | 196 | //retstr += GenerateIndentedLine("}"); |
175 | m_braceCount--; | 197 | // m_braceCount--; |
176 | //retstr += GenerateLine("}"); | 198 | //retstr += GenerateLine("}"); |
177 | 199 | ||
178 | // Removes all carriage return characters which may be generated in Windows platform. Is there | 200 | // Removes all carriage return characters which may be generated in Windows platform. Is there |
179 | // cleaner way of doing this? | 201 | // cleaner way of doing this? |
180 | retstr = retstr.Replace("\r", ""); | 202 | // sb.Replace("\r", ""); |
181 | |||
182 | return retstr; | ||
183 | } | 203 | } |
184 | 204 | ||
185 | /// <summary> | 205 | /// <summary> |
@@ -206,78 +226,76 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
206 | /// <param name="previousSymbol">The parent node.</param> | 226 | /// <param name="previousSymbol">The parent node.</param> |
207 | /// <param name="s">The current node to generate code for.</param> | 227 | /// <param name="s">The current node to generate code for.</param> |
208 | /// <returns>String containing C# code for SYMBOL s.</returns> | 228 | /// <returns>String containing C# code for SYMBOL s.</returns> |
209 | private string GenerateNode(SYMBOL previousSymbol, SYMBOL s) | 229 | private void GenerateNodeToSB(SYMBOL previousSymbol, SYMBOL s, StringBuilder sb) |
210 | { | 230 | { |
211 | string retstr = String.Empty; | ||
212 | |||
213 | // make sure to put type lower in the inheritance hierarchy first | 231 | // make sure to put type lower in the inheritance hierarchy first |
214 | // ie: since IdentArgument and ExpressionArgument inherit from | 232 | // ie: since IdentArgument and ExpressionArgument inherit from |
215 | // Argument, put IdentArgument and ExpressionArgument before Argument | 233 | // Argument, put IdentArgument and ExpressionArgument before Argument |
216 | if (s is GlobalFunctionDefinition) | 234 | if (s is GlobalFunctionDefinition) |
217 | retstr += GenerateGlobalFunctionDefinition((GlobalFunctionDefinition) s); | 235 | GenerateGlobalFunctionDefinition((GlobalFunctionDefinition) s, sb); |
218 | else if (s is GlobalVariableDeclaration) | 236 | else if (s is GlobalVariableDeclaration) |
219 | retstr += GenerateGlobalVariableDeclaration((GlobalVariableDeclaration) s); | 237 | GenerateGlobalVariableDeclaration((GlobalVariableDeclaration) s , sb); |
220 | else if (s is State) | 238 | else if (s is State) |
221 | retstr += GenerateState((State) s); | 239 | GenerateState((State) s, sb); |
222 | else if (s is CompoundStatement) | 240 | else if (s is CompoundStatement) |
223 | retstr += GenerateCompoundStatement(previousSymbol, (CompoundStatement) s); | 241 | GenerateCompoundStatement(previousSymbol, (CompoundStatement) s, sb); |
224 | else if (s is Declaration) | 242 | else if (s is Declaration) |
225 | retstr += GenerateDeclaration((Declaration) s); | 243 | GenerateDeclaration((Declaration) s, sb); |
226 | else if (s is Statement) | 244 | else if (s is Statement) |
227 | retstr += GenerateStatement(previousSymbol, (Statement) s); | 245 | GenerateStatement(previousSymbol, (Statement) s, sb); |
228 | else if (s is ReturnStatement) | 246 | else if (s is ReturnStatement) |
229 | retstr += GenerateReturnStatement((ReturnStatement) s); | 247 | GenerateReturnStatement((ReturnStatement) s, sb); |
230 | else if (s is JumpLabel) | 248 | else if (s is JumpLabel) |
231 | retstr += GenerateJumpLabel((JumpLabel) s); | 249 | GenerateJumpLabel((JumpLabel) s, sb); |
232 | else if (s is JumpStatement) | 250 | else if (s is JumpStatement) |
233 | retstr += GenerateJumpStatement((JumpStatement) s); | 251 | GenerateJumpStatement((JumpStatement) s, sb); |
234 | else if (s is StateChange) | 252 | else if (s is StateChange) |
235 | retstr += GenerateStateChange((StateChange) s); | 253 | GenerateStateChange((StateChange) s, sb); |
236 | else if (s is IfStatement) | 254 | else if (s is IfStatement) |
237 | retstr += GenerateIfStatement((IfStatement) s); | 255 | GenerateIfStatement((IfStatement) s, sb); |
238 | else if (s is WhileStatement) | 256 | else if (s is WhileStatement) |
239 | retstr += GenerateWhileStatement((WhileStatement) s); | 257 | GenerateWhileStatement((WhileStatement) s, sb); |
240 | else if (s is DoWhileStatement) | 258 | else if (s is DoWhileStatement) |
241 | retstr += GenerateDoWhileStatement((DoWhileStatement) s); | 259 | GenerateDoWhileStatement((DoWhileStatement) s, sb); |
242 | else if (s is ForLoop) | 260 | else if (s is ForLoop) |
243 | retstr += GenerateForLoop((ForLoop) s); | 261 | GenerateForLoop((ForLoop) s, sb); |
244 | else if (s is ArgumentList) | 262 | else if (s is ArgumentList) |
245 | retstr += GenerateArgumentList((ArgumentList) s); | 263 | GenerateArgumentList((ArgumentList) s, sb); |
246 | else if (s is Assignment) | 264 | else if (s is Assignment) |
247 | retstr += GenerateAssignment((Assignment) s); | 265 | GenerateAssignment((Assignment) s, sb); |
248 | else if (s is BinaryExpression) | 266 | else if (s is BinaryExpression) |
249 | retstr += GenerateBinaryExpression((BinaryExpression) s); | 267 | GenerateBinaryExpression((BinaryExpression) s, sb); |
250 | else if (s is ParenthesisExpression) | 268 | else if (s is ParenthesisExpression) |
251 | retstr += GenerateParenthesisExpression((ParenthesisExpression) s); | 269 | GenerateParenthesisExpression((ParenthesisExpression) s, sb); |
252 | else if (s is UnaryExpression) | 270 | else if (s is UnaryExpression) |
253 | retstr += GenerateUnaryExpression((UnaryExpression) s); | 271 | GenerateUnaryExpression((UnaryExpression) s, sb); |
254 | else if (s is IncrementDecrementExpression) | 272 | else if (s is IncrementDecrementExpression) |
255 | retstr += GenerateIncrementDecrementExpression((IncrementDecrementExpression) s); | 273 | GenerateIncrementDecrementExpression((IncrementDecrementExpression) s, sb); |
256 | else if (s is TypecastExpression) | 274 | else if (s is TypecastExpression) |
257 | retstr += GenerateTypecastExpression((TypecastExpression) s); | 275 | GenerateTypecastExpression((TypecastExpression) s, sb); |
258 | else if (s is FunctionCall) | 276 | else if (s is FunctionCall) |
259 | retstr += GenerateFunctionCall((FunctionCall) s); | 277 | GenerateFunctionCall((FunctionCall) s, sb); |
260 | else if (s is VectorConstant) | 278 | else if (s is VectorConstant) |
261 | retstr += GenerateVectorConstant((VectorConstant) s); | 279 | GenerateVectorConstant((VectorConstant) s, sb); |
262 | else if (s is RotationConstant) | 280 | else if (s is RotationConstant) |
263 | retstr += GenerateRotationConstant((RotationConstant) s); | 281 | GenerateRotationConstant((RotationConstant) s, sb); |
264 | else if (s is ListConstant) | 282 | else if (s is ListConstant) |
265 | retstr += GenerateListConstant((ListConstant) s); | 283 | GenerateListConstant((ListConstant) s, sb); |
266 | else if (s is Constant) | 284 | else if (s is Constant) |
267 | retstr += GenerateConstant((Constant) s); | 285 | GenerateConstant((Constant) s, sb); |
268 | else if (s is IdentDotExpression) | 286 | else if (s is IdentDotExpression) |
269 | retstr += Generate(CheckName(((IdentDotExpression) s).Name) + "." + ((IdentDotExpression) s).Member, s); | 287 | Generate(CheckName(((IdentDotExpression) s).Name) + "." + ((IdentDotExpression) s).Member, s, sb); |
270 | else if (s is IdentExpression) | 288 | else if (s is IdentExpression) |
271 | retstr += GenerateIdentifier(((IdentExpression) s).Name, s); | 289 | GenerateIdentifier(((IdentExpression) s).Name, s, sb); |
272 | else if (s is IDENT) | 290 | else if (s is IDENT) |
273 | retstr += Generate(CheckName(((TOKEN) s).yytext), s); | 291 | Generate(CheckName(((TOKEN) s).yytext), s, sb); |
274 | else | 292 | else |
275 | { | 293 | { |
276 | foreach (SYMBOL kid in s.kids) | 294 | foreach (SYMBOL kid in s.kids) |
277 | retstr += GenerateNode(s, kid); | 295 | GenerateNodeToSB(s, kid,sb); |
278 | } | 296 | } |
279 | 297 | ||
280 | return retstr; | 298 | return; |
281 | } | 299 | } |
282 | 300 | ||
283 | /// <summary> | 301 | /// <summary> |
@@ -285,10 +303,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
285 | /// </summary> | 303 | /// </summary> |
286 | /// <param name="gf">The GlobalFunctionDefinition node.</param> | 304 | /// <param name="gf">The GlobalFunctionDefinition node.</param> |
287 | /// <returns>String containing C# code for GlobalFunctionDefinition gf.</returns> | 305 | /// <returns>String containing C# code for GlobalFunctionDefinition gf.</returns> |
288 | private string GenerateGlobalFunctionDefinition(GlobalFunctionDefinition gf) | 306 | private void GenerateGlobalFunctionDefinition(GlobalFunctionDefinition gf, StringBuilder sb) |
289 | { | 307 | { |
290 | string retstr = String.Empty; | ||
291 | |||
292 | // we need to separate the argument declaration list from other kids | 308 | // we need to separate the argument declaration list from other kids |
293 | List<SYMBOL> argumentDeclarationListKids = new List<SYMBOL>(); | 309 | List<SYMBOL> argumentDeclarationListKids = new List<SYMBOL>(); |
294 | List<SYMBOL> remainingKids = new List<SYMBOL>(); | 310 | List<SYMBOL> remainingKids = new List<SYMBOL>(); |
@@ -299,18 +315,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
299 | else | 315 | else |
300 | remainingKids.Add(kid); | 316 | remainingKids.Add(kid); |
301 | 317 | ||
302 | retstr += GenerateIndented(String.Format("{0} {1}(", gf.ReturnType, CheckName(gf.Name)), gf); | 318 | GenerateIndented(String.Format("{0} {1}(", gf.ReturnType, CheckName(gf.Name)), gf, sb); |
303 | 319 | ||
304 | // print the state arguments, if any | 320 | // print the state arguments, if any |
305 | foreach (SYMBOL kid in argumentDeclarationListKids) | 321 | foreach (SYMBOL kid in argumentDeclarationListKids) |
306 | retstr += GenerateArgumentDeclarationList((ArgumentDeclarationList) kid); | 322 | GenerateArgumentDeclarationList((ArgumentDeclarationList) kid, sb); |
307 | 323 | ||
308 | retstr += GenerateLine(")"); | 324 | GenerateLine(")", sb); |
309 | 325 | ||
310 | foreach (SYMBOL kid in remainingKids) | 326 | foreach (SYMBOL kid in remainingKids) |
311 | retstr += GenerateNode(gf, kid); | 327 | GenerateNodeToSB(gf, kid,sb); |
312 | |||
313 | return retstr; | ||
314 | } | 328 | } |
315 | 329 | ||
316 | /// <summary> | 330 | /// <summary> |
@@ -318,18 +332,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
318 | /// </summary> | 332 | /// </summary> |
319 | /// <param name="gv">The GlobalVariableDeclaration node.</param> | 333 | /// <param name="gv">The GlobalVariableDeclaration node.</param> |
320 | /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> | 334 | /// <returns>String containing C# code for GlobalVariableDeclaration gv.</returns> |
321 | private string GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv) | 335 | private void GenerateGlobalVariableDeclaration(GlobalVariableDeclaration gv, StringBuilder sb) |
322 | { | 336 | { |
323 | string retstr = String.Empty; | ||
324 | |||
325 | foreach (SYMBOL s in gv.kids) | 337 | foreach (SYMBOL s in gv.kids) |
326 | { | 338 | { |
327 | retstr += Indent(); | 339 | Indent(sb); |
328 | retstr += GenerateNode(gv, s); | 340 | GenerateNodeToSB(gv, s ,sb); |
329 | retstr += GenerateLine(";"); | 341 | GenerateLine(";", sb); |
330 | } | 342 | } |
331 | |||
332 | return retstr; | ||
333 | } | 343 | } |
334 | 344 | ||
335 | /// <summary> | 345 | /// <summary> |
@@ -337,15 +347,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
337 | /// </summary> | 347 | /// </summary> |
338 | /// <param name="s">The State node.</param> | 348 | /// <param name="s">The State node.</param> |
339 | /// <returns>String containing C# code for State s.</returns> | 349 | /// <returns>String containing C# code for State s.</returns> |
340 | private string GenerateState(State s) | 350 | private void GenerateState(State s, StringBuilder sb) |
341 | { | 351 | { |
342 | string retstr = String.Empty; | ||
343 | |||
344 | foreach (SYMBOL kid in s.kids) | 352 | foreach (SYMBOL kid in s.kids) |
345 | if (kid is StateEvent) | 353 | if (kid is StateEvent) |
346 | retstr += GenerateStateEvent((StateEvent) kid, s.Name); | 354 | GenerateStateEvent((StateEvent) kid, s.Name, sb); |
347 | |||
348 | return retstr; | ||
349 | } | 355 | } |
350 | 356 | ||
351 | /// <summary> | 357 | /// <summary> |
@@ -354,10 +360,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
354 | /// <param name="se">The StateEvent node.</param> | 360 | /// <param name="se">The StateEvent node.</param> |
355 | /// <param name="parentStateName">The name of the parent state.</param> | 361 | /// <param name="parentStateName">The name of the parent state.</param> |
356 | /// <returns>String containing C# code for StateEvent se.</returns> | 362 | /// <returns>String containing C# code for StateEvent se.</returns> |
357 | private string GenerateStateEvent(StateEvent se, string parentStateName) | 363 | private void GenerateStateEvent(StateEvent se, string parentStateName, StringBuilder sb) |
358 | { | 364 | { |
359 | string retstr = String.Empty; | ||
360 | |||
361 | // we need to separate the argument declaration list from other kids | 365 | // we need to separate the argument declaration list from other kids |
362 | List<SYMBOL> argumentDeclarationListKids = new List<SYMBOL>(); | 366 | List<SYMBOL> argumentDeclarationListKids = new List<SYMBOL>(); |
363 | List<SYMBOL> remainingKids = new List<SYMBOL>(); | 367 | List<SYMBOL> remainingKids = new List<SYMBOL>(); |
@@ -369,18 +373,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
369 | remainingKids.Add(kid); | 373 | remainingKids.Add(kid); |
370 | 374 | ||
371 | // "state" (function) declaration | 375 | // "state" (function) declaration |
372 | retstr += GenerateIndented(String.Format("public void {0}_event_{1}(", parentStateName, se.Name), se); | 376 | GenerateIndented(String.Format("public void {0}_event_{1}(", parentStateName, se.Name), se , sb); |
373 | 377 | ||
374 | // print the state arguments, if any | 378 | // print the state arguments, if any |
375 | foreach (SYMBOL kid in argumentDeclarationListKids) | 379 | foreach (SYMBOL kid in argumentDeclarationListKids) |
376 | retstr += GenerateArgumentDeclarationList((ArgumentDeclarationList) kid); | 380 | GenerateArgumentDeclarationList((ArgumentDeclarationList) kid, sb); |
377 | 381 | ||
378 | retstr += GenerateLine(")"); | 382 | GenerateLine(")", sb); |
379 | 383 | ||
380 | foreach (SYMBOL kid in remainingKids) | 384 | foreach (SYMBOL kid in remainingKids) |
381 | retstr += GenerateNode(se, kid); | 385 | GenerateNodeToSB(se, kid, sb); |
382 | |||
383 | return retstr; | ||
384 | } | 386 | } |
385 | 387 | ||
386 | /// <summary> | 388 | /// <summary> |
@@ -388,20 +390,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
388 | /// </summary> | 390 | /// </summary> |
389 | /// <param name="adl">The ArgumentDeclarationList node.</param> | 391 | /// <param name="adl">The ArgumentDeclarationList node.</param> |
390 | /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns> | 392 | /// <returns>String containing C# code for ArgumentDeclarationList adl.</returns> |
391 | private string GenerateArgumentDeclarationList(ArgumentDeclarationList adl) | 393 | private void GenerateArgumentDeclarationList(ArgumentDeclarationList adl, StringBuilder sb) |
392 | { | 394 | { |
393 | string retstr = String.Empty; | ||
394 | |||
395 | int comma = adl.kids.Count - 1; // tells us whether to print a comma | 395 | int comma = adl.kids.Count - 1; // tells us whether to print a comma |
396 | 396 | ||
397 | foreach (Declaration d in adl.kids) | 397 | foreach (Declaration d in adl.kids) |
398 | { | 398 | { |
399 | retstr += Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); | 399 | Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d, sb); |
400 | if (0 < comma--) | 400 | if (0 < comma--) |
401 | retstr += Generate(", "); | 401 | Generate(", ", sb); |
402 | } | 402 | } |
403 | |||
404 | return retstr; | ||
405 | } | 403 | } |
406 | 404 | ||
407 | /// <summary> | 405 | /// <summary> |
@@ -409,20 +407,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
409 | /// </summary> | 407 | /// </summary> |
410 | /// <param name="al">The ArgumentList node.</param> | 408 | /// <param name="al">The ArgumentList node.</param> |
411 | /// <returns>String containing C# code for ArgumentList al.</returns> | 409 | /// <returns>String containing C# code for ArgumentList al.</returns> |
412 | private string GenerateArgumentList(ArgumentList al) | 410 | private void GenerateArgumentList(ArgumentList al, StringBuilder sb) |
413 | { | 411 | { |
414 | string retstr = String.Empty; | ||
415 | |||
416 | int comma = al.kids.Count - 1; // tells us whether to print a comma | 412 | int comma = al.kids.Count - 1; // tells us whether to print a comma |
417 | 413 | ||
418 | foreach (SYMBOL s in al.kids) | 414 | foreach (SYMBOL s in al.kids) |
419 | { | 415 | { |
420 | retstr += GenerateNode(al, s); | 416 | GenerateNodeToSB(al, s, sb); |
421 | if (0 < comma--) | 417 | if (0 < comma--) |
422 | retstr += Generate(", "); | 418 | Generate(", ", sb); |
423 | } | 419 | } |
424 | |||
425 | return retstr; | ||
426 | } | 420 | } |
427 | 421 | ||
428 | /// <summary> | 422 | /// <summary> |
@@ -430,12 +424,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
430 | /// </summary> | 424 | /// </summary> |
431 | /// <param name="cs">The CompoundStatement node.</param> | 425 | /// <param name="cs">The CompoundStatement node.</param> |
432 | /// <returns>String containing C# code for CompoundStatement cs.</returns> | 426 | /// <returns>String containing C# code for CompoundStatement cs.</returns> |
433 | private string GenerateCompoundStatement(SYMBOL previousSymbol, CompoundStatement cs) | 427 | private void GenerateCompoundStatement(SYMBOL previousSymbol, CompoundStatement cs, StringBuilder sb) |
434 | { | 428 | { |
435 | string retstr = String.Empty; | ||
436 | |||
437 | // opening brace | 429 | // opening brace |
438 | retstr += GenerateIndentedLine("{"); | 430 | GenerateIndentedLine("{", sb); |
439 | m_braceCount++; | 431 | m_braceCount++; |
440 | 432 | ||
441 | if (m_insertCoopTerminationChecks) | 433 | if (m_insertCoopTerminationChecks) |
@@ -446,17 +438,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
446 | || previousSymbol is DoWhileStatement | 438 | || previousSymbol is DoWhileStatement |
447 | || previousSymbol is ForLoop | 439 | || previousSymbol is ForLoop |
448 | || previousSymbol is StateEvent) | 440 | || previousSymbol is StateEvent) |
449 | retstr += GenerateIndentedLine(m_coopTerminationCheck); | 441 | GenerateIndentedLine(m_coopTerminationCheck, sb); |
450 | } | 442 | } |
451 | 443 | ||
452 | foreach (SYMBOL kid in cs.kids) | 444 | foreach (SYMBOL kid in cs.kids) |
453 | retstr += GenerateNode(cs, kid); | 445 | GenerateNodeToSB(cs, kid, sb); |
454 | 446 | ||
455 | // closing brace | 447 | // closing brace |
456 | m_braceCount--; | 448 | m_braceCount--; |
457 | retstr += GenerateIndentedLine("}"); | 449 | GenerateIndentedLine("}", sb); |
458 | |||
459 | return retstr; | ||
460 | } | 450 | } |
461 | 451 | ||
462 | /// <summary> | 452 | /// <summary> |
@@ -464,9 +454,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
464 | /// </summary> | 454 | /// </summary> |
465 | /// <param name="d">The Declaration node.</param> | 455 | /// <param name="d">The Declaration node.</param> |
466 | /// <returns>String containing C# code for Declaration d.</returns> | 456 | /// <returns>String containing C# code for Declaration d.</returns> |
467 | private string GenerateDeclaration(Declaration d) | 457 | private void GenerateDeclaration(Declaration d, StringBuilder sb) |
468 | { | 458 | { |
469 | return Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d); | 459 | Generate(String.Format("{0} {1}", d.Datatype, CheckName(d.Id)), d, sb); |
470 | } | 460 | } |
471 | 461 | ||
472 | /// <summary> | 462 | /// <summary> |
@@ -474,7 +464,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
474 | /// </summary> | 464 | /// </summary> |
475 | /// <param name="s">The Statement node.</param> | 465 | /// <param name="s">The Statement node.</param> |
476 | /// <returns>String containing C# code for Statement s.</returns> | 466 | /// <returns>String containing C# code for Statement s.</returns> |
477 | private string GenerateStatement(SYMBOL previousSymbol, Statement s) | 467 | private void GenerateStatement(SYMBOL previousSymbol, Statement s, StringBuilder sb) |
478 | { | 468 | { |
479 | string retstr = String.Empty; | 469 | string retstr = String.Empty; |
480 | bool printSemicolon = true; | 470 | bool printSemicolon = true; |
@@ -491,13 +481,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
491 | transformToBlock = true; | 481 | transformToBlock = true; |
492 | 482 | ||
493 | // FIXME: This will be wrongly indented because the previous for/while/dowhile will have already indented. | 483 | // FIXME: This will be wrongly indented because the previous for/while/dowhile will have already indented. |
494 | retstr += GenerateIndentedLine("{"); | 484 | GenerateIndentedLine("{", sb); |
495 | 485 | ||
496 | retstr += GenerateIndentedLine(m_coopTerminationCheck); | 486 | GenerateIndentedLine(m_coopTerminationCheck, sb); |
497 | } | 487 | } |
498 | } | 488 | } |
499 | 489 | ||
500 | retstr += Indent(); | 490 | Indent(sb); |
501 | 491 | ||
502 | if (0 < s.kids.Count) | 492 | if (0 < s.kids.Count) |
503 | { | 493 | { |
@@ -508,19 +498,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
508 | // (MONO) error. | 498 | // (MONO) error. |
509 | if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count)) | 499 | if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count)) |
510 | foreach (SYMBOL kid in s.kids) | 500 | foreach (SYMBOL kid in s.kids) |
511 | retstr += GenerateNode(s, kid); | 501 | GenerateNodeToSB(s, kid, sb); |
512 | } | 502 | } |
513 | 503 | ||
514 | if (printSemicolon) | 504 | if (printSemicolon) |
515 | retstr += GenerateLine(";"); | 505 | GenerateLine(";", sb); |
516 | 506 | ||
517 | if (transformToBlock) | 507 | if (transformToBlock) |
518 | { | 508 | { |
519 | // FIXME: This will be wrongly indented because the for/while/dowhile is currently handling the unindent | 509 | // FIXME: This will be wrongly indented because the for/while/dowhile is currently handling the unindent |
520 | retstr += GenerateIndentedLine("}"); | 510 | GenerateIndentedLine("}", sb); |
521 | } | 511 | } |
522 | |||
523 | return retstr; | ||
524 | } | 512 | } |
525 | 513 | ||
526 | /// <summary> | 514 | /// <summary> |
@@ -528,19 +516,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
528 | /// </summary> | 516 | /// </summary> |
529 | /// <param name="a">The Assignment node.</param> | 517 | /// <param name="a">The Assignment node.</param> |
530 | /// <returns>String containing C# code for Assignment a.</returns> | 518 | /// <returns>String containing C# code for Assignment a.</returns> |
531 | private string GenerateAssignment(Assignment a) | 519 | private void GenerateAssignment(Assignment a, StringBuilder sb) |
532 | { | 520 | { |
533 | string retstr = String.Empty; | ||
534 | |||
535 | List<string> identifiers = new List<string>(); | 521 | List<string> identifiers = new List<string>(); |
536 | checkForMultipleAssignments(identifiers, a); | 522 | checkForMultipleAssignments(identifiers, a); |
537 | 523 | ||
538 | retstr += GenerateNode(a, (SYMBOL) a.kids.Pop()); | 524 | GenerateNodeToSB(a, (SYMBOL) a.kids.Pop(), sb); |
539 | retstr += Generate(String.Format(" {0} ", a.AssignmentType), a); | 525 | Generate(String.Format(" {0} ", a.AssignmentType), a, sb); |
540 | foreach (SYMBOL kid in a.kids) | 526 | foreach (SYMBOL kid in a.kids) |
541 | retstr += GenerateNode(a, kid); | 527 | GenerateNodeToSB(a, kid, sb); |
542 | |||
543 | return retstr; | ||
544 | } | 528 | } |
545 | 529 | ||
546 | // This code checks for LSL of the following forms, and generates a | 530 | // This code checks for LSL of the following forms, and generates a |
@@ -604,16 +588,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
604 | /// </summary> | 588 | /// </summary> |
605 | /// <param name="rs">The ReturnStatement node.</param> | 589 | /// <param name="rs">The ReturnStatement node.</param> |
606 | /// <returns>String containing C# code for ReturnStatement rs.</returns> | 590 | /// <returns>String containing C# code for ReturnStatement rs.</returns> |
607 | private string GenerateReturnStatement(ReturnStatement rs) | 591 | private void GenerateReturnStatement(ReturnStatement rs, StringBuilder sb) |
608 | { | 592 | { |
609 | string retstr = String.Empty; | 593 | Generate("return ", rs, sb); |
610 | |||
611 | retstr += Generate("return ", rs); | ||
612 | 594 | ||
613 | foreach (SYMBOL kid in rs.kids) | 595 | foreach (SYMBOL kid in rs.kids) |
614 | retstr += GenerateNode(rs, kid); | 596 | GenerateNodeToSB(rs, kid, sb); |
615 | |||
616 | return retstr; | ||
617 | } | 597 | } |
618 | 598 | ||
619 | /// <summary> | 599 | /// <summary> |
@@ -621,7 +601,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
621 | /// </summary> | 601 | /// </summary> |
622 | /// <param name="jl">The JumpLabel node.</param> | 602 | /// <param name="jl">The JumpLabel node.</param> |
623 | /// <returns>String containing C# code for JumpLabel jl.</returns> | 603 | /// <returns>String containing C# code for JumpLabel jl.</returns> |
624 | private string GenerateJumpLabel(JumpLabel jl) | 604 | private void GenerateJumpLabel(JumpLabel jl, StringBuilder sb) |
625 | { | 605 | { |
626 | string labelStatement; | 606 | string labelStatement; |
627 | 607 | ||
@@ -630,7 +610,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
630 | else | 610 | else |
631 | labelStatement = "NoOp();"; | 611 | labelStatement = "NoOp();"; |
632 | 612 | ||
633 | return GenerateLine(String.Format("{0}: {1}", CheckName(jl.LabelName), labelStatement), jl); | 613 | GenerateLine(String.Format("{0}: {1}", CheckName(jl.LabelName), labelStatement), jl, sb); |
634 | } | 614 | } |
635 | 615 | ||
636 | /// <summary> | 616 | /// <summary> |
@@ -638,9 +618,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
638 | /// </summary> | 618 | /// </summary> |
639 | /// <param name="js">The JumpStatement node.</param> | 619 | /// <param name="js">The JumpStatement node.</param> |
640 | /// <returns>String containing C# code for JumpStatement js.</returns> | 620 | /// <returns>String containing C# code for JumpStatement js.</returns> |
641 | private string GenerateJumpStatement(JumpStatement js) | 621 | private void GenerateJumpStatement(JumpStatement js, StringBuilder sb) |
642 | { | 622 | { |
643 | return Generate(String.Format("goto {0}", CheckName(js.TargetName)), js); | 623 | Generate(String.Format("goto {0}", CheckName(js.TargetName)), js, sb); |
644 | } | 624 | } |
645 | 625 | ||
646 | /// <summary> | 626 | /// <summary> |
@@ -648,32 +628,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
648 | /// </summary> | 628 | /// </summary> |
649 | /// <param name="ifs">The IfStatement node.</param> | 629 | /// <param name="ifs">The IfStatement node.</param> |
650 | /// <returns>String containing C# code for IfStatement ifs.</returns> | 630 | /// <returns>String containing C# code for IfStatement ifs.</returns> |
651 | private string GenerateIfStatement(IfStatement ifs) | 631 | private void GenerateIfStatement(IfStatement ifs, StringBuilder sb) |
652 | { | 632 | { |
653 | string retstr = String.Empty; | 633 | GenerateIndented("if (", ifs, sb); |
654 | 634 | GenerateNodeToSB(ifs, (SYMBOL) ifs.kids.Pop(), sb); | |
655 | retstr += GenerateIndented("if (", ifs); | 635 | GenerateLine(")", sb); |
656 | retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop()); | ||
657 | retstr += GenerateLine(")"); | ||
658 | 636 | ||
659 | // CompoundStatement handles indentation itself but we need to do it | 637 | // CompoundStatement handles indentation itself but we need to do it |
660 | // otherwise. | 638 | // otherwise. |
661 | bool indentHere = ifs.kids.Top is Statement; | 639 | bool indentHere = ifs.kids.Top is Statement; |
662 | if (indentHere) m_braceCount++; | 640 | if (indentHere) m_braceCount++; |
663 | retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop()); | 641 | GenerateNodeToSB(ifs, (SYMBOL) ifs.kids.Pop(), sb); |
664 | if (indentHere) m_braceCount--; | 642 | if (indentHere) m_braceCount--; |
665 | 643 | ||
666 | if (0 < ifs.kids.Count) // do it again for an else | 644 | if (0 < ifs.kids.Count) // do it again for an else |
667 | { | 645 | { |
668 | retstr += GenerateIndentedLine("else", ifs); | 646 | GenerateIndentedLine("else", ifs, sb); |
669 | 647 | ||
670 | indentHere = ifs.kids.Top is Statement; | 648 | indentHere = ifs.kids.Top is Statement; |
671 | if (indentHere) m_braceCount++; | 649 | if (indentHere) m_braceCount++; |
672 | retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop()); | 650 | GenerateNodeToSB(ifs, (SYMBOL) ifs.kids.Pop(), sb); |
673 | if (indentHere) m_braceCount--; | 651 | if (indentHere) m_braceCount--; |
674 | } | 652 | } |
675 | |||
676 | return retstr; | ||
677 | } | 653 | } |
678 | 654 | ||
679 | /// <summary> | 655 | /// <summary> |
@@ -681,9 +657,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
681 | /// </summary> | 657 | /// </summary> |
682 | /// <param name="sc">The StateChange node.</param> | 658 | /// <param name="sc">The StateChange node.</param> |
683 | /// <returns>String containing C# code for StateChange sc.</returns> | 659 | /// <returns>String containing C# code for StateChange sc.</returns> |
684 | private string GenerateStateChange(StateChange sc) | 660 | private void GenerateStateChange(StateChange sc, StringBuilder sb) |
685 | { | 661 | { |
686 | return Generate(String.Format("state(\"{0}\")", sc.NewState), sc); | 662 | Generate(String.Format("state(\"{0}\")", sc.NewState), sc, sb); |
687 | } | 663 | } |
688 | 664 | ||
689 | /// <summary> | 665 | /// <summary> |
@@ -691,22 +667,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
691 | /// </summary> | 667 | /// </summary> |
692 | /// <param name="ws">The WhileStatement node.</param> | 668 | /// <param name="ws">The WhileStatement node.</param> |
693 | /// <returns>String containing C# code for WhileStatement ws.</returns> | 669 | /// <returns>String containing C# code for WhileStatement ws.</returns> |
694 | private string GenerateWhileStatement(WhileStatement ws) | 670 | private void GenerateWhileStatement(WhileStatement ws, StringBuilder sb) |
695 | { | 671 | { |
696 | string retstr = String.Empty; | 672 | GenerateIndented("while (", ws, sb); |
697 | 673 | GenerateNodeToSB(ws, (SYMBOL) ws.kids.Pop(), sb); | |
698 | retstr += GenerateIndented("while (", ws); | 674 | GenerateLine(")", sb); |
699 | retstr += GenerateNode(ws, (SYMBOL) ws.kids.Pop()); | ||
700 | retstr += GenerateLine(")"); | ||
701 | 675 | ||
702 | // CompoundStatement handles indentation itself but we need to do it | 676 | // CompoundStatement handles indentation itself but we need to do it |
703 | // otherwise. | 677 | // otherwise. |
704 | bool indentHere = ws.kids.Top is Statement; | 678 | bool indentHere = ws.kids.Top is Statement; |
705 | if (indentHere) m_braceCount++; | 679 | if (indentHere) m_braceCount++; |
706 | retstr += GenerateNode(ws, (SYMBOL) ws.kids.Pop()); | 680 | GenerateNodeToSB(ws, (SYMBOL) ws.kids.Pop(), sb); |
707 | if (indentHere) m_braceCount--; | 681 | if (indentHere) m_braceCount--; |
708 | |||
709 | return retstr; | ||
710 | } | 682 | } |
711 | 683 | ||
712 | /// <summary> | 684 | /// <summary> |
@@ -714,24 +686,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
714 | /// </summary> | 686 | /// </summary> |
715 | /// <param name="dws">The DoWhileStatement node.</param> | 687 | /// <param name="dws">The DoWhileStatement node.</param> |
716 | /// <returns>String containing C# code for DoWhileStatement dws.</returns> | 688 | /// <returns>String containing C# code for DoWhileStatement dws.</returns> |
717 | private string GenerateDoWhileStatement(DoWhileStatement dws) | 689 | private void GenerateDoWhileStatement(DoWhileStatement dws, StringBuilder sb) |
718 | { | 690 | { |
719 | string retstr = String.Empty; | 691 | GenerateIndentedLine("do", dws, sb); |
720 | |||
721 | retstr += GenerateIndentedLine("do", dws); | ||
722 | 692 | ||
723 | // CompoundStatement handles indentation itself but we need to do it | 693 | // CompoundStatement handles indentation itself but we need to do it |
724 | // otherwise. | 694 | // otherwise. |
725 | bool indentHere = dws.kids.Top is Statement; | 695 | bool indentHere = dws.kids.Top is Statement; |
726 | if (indentHere) m_braceCount++; | 696 | if (indentHere) m_braceCount++; |
727 | retstr += GenerateNode(dws, (SYMBOL) dws.kids.Pop()); | 697 | GenerateNodeToSB(dws, (SYMBOL) dws.kids.Pop(), sb); |
728 | if (indentHere) m_braceCount--; | 698 | if (indentHere) m_braceCount--; |
729 | 699 | ||
730 | retstr += GenerateIndented("while (", dws); | 700 | GenerateIndented("while (", dws ,sb); |
731 | retstr += GenerateNode(dws, (SYMBOL) dws.kids.Pop()); | 701 | GenerateNodeToSB(dws, (SYMBOL) dws.kids.Pop(), sb); |
732 | retstr += GenerateLine(");"); | 702 | GenerateLine(");", sb); |
733 | |||
734 | return retstr; | ||
735 | } | 703 | } |
736 | 704 | ||
737 | /// <summary> | 705 | /// <summary> |
@@ -739,11 +707,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
739 | /// </summary> | 707 | /// </summary> |
740 | /// <param name="fl">The ForLoop node.</param> | 708 | /// <param name="fl">The ForLoop node.</param> |
741 | /// <returns>String containing C# code for ForLoop fl.</returns> | 709 | /// <returns>String containing C# code for ForLoop fl.</returns> |
742 | private string GenerateForLoop(ForLoop fl) | 710 | private void GenerateForLoop(ForLoop fl, StringBuilder sb) |
743 | { | 711 | { |
744 | string retstr = String.Empty; | 712 | GenerateIndented("for (", fl, sb); |
745 | |||
746 | retstr += GenerateIndented("for (", fl); | ||
747 | 713 | ||
748 | // It's possible that we don't have an assignment, in which case | 714 | // It's possible that we don't have an assignment, in which case |
749 | // the child will be null and we only print the semicolon. | 715 | // the child will be null and we only print the semicolon. |
@@ -752,26 +718,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
752 | ForLoopStatement s = (ForLoopStatement) fl.kids.Pop(); | 718 | ForLoopStatement s = (ForLoopStatement) fl.kids.Pop(); |
753 | if (null != s) | 719 | if (null != s) |
754 | { | 720 | { |
755 | retstr += GenerateForLoopStatement(s); | 721 | GenerateForLoopStatement(s, sb); |
756 | } | 722 | } |
757 | retstr += Generate("; "); | 723 | Generate("; ", sb); |
758 | // for (x = 0; x < 10; x++) | 724 | // for (x = 0; x < 10; x++) |
759 | // ^^^^^^ | 725 | // ^^^^^^ |
760 | retstr += GenerateNode(fl, (SYMBOL) fl.kids.Pop()); | 726 | GenerateNodeToSB(fl, (SYMBOL) fl.kids.Pop(), sb); |
761 | retstr += Generate("; "); | 727 | Generate("; ", sb); |
762 | // for (x = 0; x < 10; x++) | 728 | // for (x = 0; x < 10; x++) |
763 | // ^^^ | 729 | // ^^^ |
764 | retstr += GenerateForLoopStatement((ForLoopStatement) fl.kids.Pop()); | 730 | GenerateForLoopStatement((ForLoopStatement) fl.kids.Pop(), sb); |
765 | retstr += GenerateLine(")"); | 731 | GenerateLine(")", sb); |
766 | 732 | ||
767 | // CompoundStatement handles indentation itself but we need to do it | 733 | // CompoundStatement handles indentation itself but we need to do it |
768 | // otherwise. | 734 | // otherwise. |
769 | bool indentHere = fl.kids.Top is Statement; | 735 | bool indentHere = fl.kids.Top is Statement; |
770 | if (indentHere) m_braceCount++; | 736 | if (indentHere) m_braceCount++; |
771 | retstr += GenerateNode(fl, (SYMBOL) fl.kids.Pop()); | 737 | GenerateNodeToSB(fl, (SYMBOL) fl.kids.Pop(), sb); |
772 | if (indentHere) m_braceCount--; | 738 | if (indentHere) m_braceCount--; |
773 | |||
774 | return retstr; | ||
775 | } | 739 | } |
776 | 740 | ||
777 | /// <summary> | 741 | /// <summary> |
@@ -779,10 +743,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
779 | /// </summary> | 743 | /// </summary> |
780 | /// <param name="fls">The ForLoopStatement node.</param> | 744 | /// <param name="fls">The ForLoopStatement node.</param> |
781 | /// <returns>String containing C# code for ForLoopStatement fls.</returns> | 745 | /// <returns>String containing C# code for ForLoopStatement fls.</returns> |
782 | private string GenerateForLoopStatement(ForLoopStatement fls) | 746 | private void GenerateForLoopStatement(ForLoopStatement fls, StringBuilder sb) |
783 | { | 747 | { |
784 | string retstr = String.Empty; | ||
785 | |||
786 | int comma = fls.kids.Count - 1; // tells us whether to print a comma | 748 | int comma = fls.kids.Count - 1; // tells us whether to print a comma |
787 | 749 | ||
788 | // It's possible that all we have is an empty Ident, for example: | 750 | // It's possible that all we have is an empty Ident, for example: |
@@ -791,7 +753,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
791 | // | 753 | // |
792 | // Which is illegal in C# (MONO). We'll skip it. | 754 | // Which is illegal in C# (MONO). We'll skip it. |
793 | if (fls.kids.Top is IdentExpression && 1 == fls.kids.Count) | 755 | if (fls.kids.Top is IdentExpression && 1 == fls.kids.Count) |
794 | return retstr; | 756 | return; |
795 | 757 | ||
796 | for (int i = 0; i < fls.kids.Count; i++) | 758 | for (int i = 0; i < fls.kids.Count; i++) |
797 | { | 759 | { |
@@ -813,12 +775,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
813 | while (s is ParenthesisExpression) | 775 | while (s is ParenthesisExpression) |
814 | s = (SYMBOL)s.kids.Pop(); | 776 | s = (SYMBOL)s.kids.Pop(); |
815 | 777 | ||
816 | retstr += GenerateNode(fls, s); | 778 | GenerateNodeToSB(fls, s, sb); |
817 | if (0 < comma--) | 779 | if (0 < comma--) |
818 | retstr += Generate(", "); | 780 | Generate(", ", sb); |
819 | } | 781 | } |
820 | |||
821 | return retstr; | ||
822 | } | 782 | } |
823 | 783 | ||
824 | /// <summary> | 784 | /// <summary> |
@@ -826,31 +786,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
826 | /// </summary> | 786 | /// </summary> |
827 | /// <param name="be">The BinaryExpression node.</param> | 787 | /// <param name="be">The BinaryExpression node.</param> |
828 | /// <returns>String containing C# code for BinaryExpression be.</returns> | 788 | /// <returns>String containing C# code for BinaryExpression be.</returns> |
829 | private string GenerateBinaryExpression(BinaryExpression be) | 789 | private void GenerateBinaryExpression(BinaryExpression be, StringBuilder sb) |
830 | { | 790 | { |
831 | string retstr = String.Empty; | ||
832 | |||
833 | if (be.ExpressionSymbol.Equals("&&") || be.ExpressionSymbol.Equals("||")) | 791 | if (be.ExpressionSymbol.Equals("&&") || be.ExpressionSymbol.Equals("||")) |
834 | { | 792 | { |
835 | // special case handling for logical and/or, see Mantis 3174 | 793 | // special case handling for logical and/or, see Mantis 3174 |
836 | retstr += "((bool)("; | 794 | sb.Append("((bool)("); |
837 | retstr += GenerateNode(be, (SYMBOL)be.kids.Pop()); | 795 | GenerateNodeToSB(be, (SYMBOL)be.kids.Pop(), sb); |
838 | retstr += "))"; | 796 | sb.Append("))"); |
839 | retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be); | 797 | Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be, sb); |
840 | retstr += "((bool)("; | 798 | sb.Append("((bool)("); |
841 | foreach (SYMBOL kid in be.kids) | 799 | foreach (SYMBOL kid in be.kids) |
842 | retstr += GenerateNode(be, kid); | 800 | GenerateNodeToSB(be, kid, sb); |
843 | retstr += "))"; | 801 | sb.Append("))"); |
844 | } | 802 | } |
845 | else | 803 | else |
846 | { | 804 | { |
847 | retstr += GenerateNode(be, (SYMBOL)be.kids.Pop()); | 805 | GenerateNodeToSB(be, (SYMBOL)be.kids.Pop(), sb); |
848 | retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol), be); | 806 | Generate(String.Format(" {0} ", be.ExpressionSymbol), be, sb); |
849 | foreach (SYMBOL kid in be.kids) | 807 | foreach (SYMBOL kid in be.kids) |
850 | retstr += GenerateNode(be, kid); | 808 | GenerateNodeToSB(be, kid, sb); |
851 | } | 809 | } |
852 | |||
853 | return retstr; | ||
854 | } | 810 | } |
855 | 811 | ||
856 | /// <summary> | 812 | /// <summary> |
@@ -858,14 +814,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
858 | /// </summary> | 814 | /// </summary> |
859 | /// <param name="ue">The UnaryExpression node.</param> | 815 | /// <param name="ue">The UnaryExpression node.</param> |
860 | /// <returns>String containing C# code for UnaryExpression ue.</returns> | 816 | /// <returns>String containing C# code for UnaryExpression ue.</returns> |
861 | private string GenerateUnaryExpression(UnaryExpression ue) | 817 | private void GenerateUnaryExpression(UnaryExpression ue, StringBuilder sb) |
862 | { | 818 | { |
863 | string retstr = String.Empty; | 819 | Generate(ue.UnarySymbol, ue, sb); |
864 | 820 | GenerateNodeToSB(ue, (SYMBOL) ue.kids.Pop(), sb); | |
865 | retstr += Generate(ue.UnarySymbol, ue); | ||
866 | retstr += GenerateNode(ue, (SYMBOL) ue.kids.Pop()); | ||
867 | |||
868 | return retstr; | ||
869 | } | 821 | } |
870 | 822 | ||
871 | /// <summary> | 823 | /// <summary> |
@@ -873,16 +825,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
873 | /// </summary> | 825 | /// </summary> |
874 | /// <param name="pe">The ParenthesisExpression node.</param> | 826 | /// <param name="pe">The ParenthesisExpression node.</param> |
875 | /// <returns>String containing C# code for ParenthesisExpression pe.</returns> | 827 | /// <returns>String containing C# code for ParenthesisExpression pe.</returns> |
876 | private string GenerateParenthesisExpression(ParenthesisExpression pe) | 828 | private void GenerateParenthesisExpression(ParenthesisExpression pe, StringBuilder sb) |
877 | { | 829 | { |
878 | string retstr = String.Empty; | 830 | string retstr = String.Empty; |
879 | 831 | ||
880 | retstr += Generate("("); | 832 | Generate("(", sb); |
881 | foreach (SYMBOL kid in pe.kids) | 833 | foreach (SYMBOL kid in pe.kids) |
882 | retstr += GenerateNode(pe, kid); | 834 | GenerateNodeToSB(pe, kid, sb); |
883 | retstr += Generate(")"); | 835 | Generate(")", sb); |
884 | |||
885 | return retstr; | ||
886 | } | 836 | } |
887 | 837 | ||
888 | /// <summary> | 838 | /// <summary> |
@@ -890,19 +840,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
890 | /// </summary> | 840 | /// </summary> |
891 | /// <param name="ide">The IncrementDecrementExpression node.</param> | 841 | /// <param name="ide">The IncrementDecrementExpression node.</param> |
892 | /// <returns>String containing C# code for IncrementDecrementExpression ide.</returns> | 842 | /// <returns>String containing C# code for IncrementDecrementExpression ide.</returns> |
893 | private string GenerateIncrementDecrementExpression(IncrementDecrementExpression ide) | 843 | private void GenerateIncrementDecrementExpression(IncrementDecrementExpression ide, StringBuilder sb) |
894 | { | 844 | { |
895 | string retstr = String.Empty; | ||
896 | |||
897 | if (0 < ide.kids.Count) | 845 | if (0 < ide.kids.Count) |
898 | { | 846 | { |
899 | IdentDotExpression dot = (IdentDotExpression) ide.kids.Top; | 847 | IdentDotExpression dot = (IdentDotExpression) ide.kids.Top; |
900 | retstr += Generate(String.Format("{0}", ide.PostOperation ? CheckName(dot.Name) + "." + dot.Member + ide.Operation : ide.Operation + CheckName(dot.Name) + "." + dot.Member), ide); | 848 | Generate(String.Format("{0}", ide.PostOperation ? CheckName(dot.Name) + "." + dot.Member + ide.Operation : ide.Operation + CheckName(dot.Name) + "." + dot.Member), ide, sb); |
901 | } | 849 | } |
902 | else | 850 | else |
903 | retstr += Generate(String.Format("{0}", ide.PostOperation ? CheckName(ide.Name) + ide.Operation : ide.Operation + CheckName(ide.Name)), ide); | 851 | Generate(String.Format("{0}", ide.PostOperation ? CheckName(ide.Name) + ide.Operation : ide.Operation + CheckName(ide.Name)), ide, sb); |
904 | |||
905 | return retstr; | ||
906 | } | 852 | } |
907 | 853 | ||
908 | /// <summary> | 854 | /// <summary> |
@@ -910,16 +856,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
910 | /// </summary> | 856 | /// </summary> |
911 | /// <param name="te">The TypecastExpression node.</param> | 857 | /// <param name="te">The TypecastExpression node.</param> |
912 | /// <returns>String containing C# code for TypecastExpression te.</returns> | 858 | /// <returns>String containing C# code for TypecastExpression te.</returns> |
913 | private string GenerateTypecastExpression(TypecastExpression te) | 859 | private void GenerateTypecastExpression(TypecastExpression te, StringBuilder sb) |
914 | { | 860 | { |
915 | string retstr = String.Empty; | ||
916 | |||
917 | // we wrap all typecasted statements in parentheses | 861 | // we wrap all typecasted statements in parentheses |
918 | retstr += Generate(String.Format("({0}) (", te.TypecastType), te); | 862 | Generate(String.Format("({0}) (", te.TypecastType), te, sb); |
919 | retstr += GenerateNode(te, (SYMBOL) te.kids.Pop()); | 863 | GenerateNodeToSB(te, (SYMBOL) te.kids.Pop(), sb); |
920 | retstr += Generate(")"); | 864 | Generate(")", sb); |
921 | |||
922 | return retstr; | ||
923 | } | 865 | } |
924 | 866 | ||
925 | /// <summary> | 867 | /// <summary> |
@@ -928,7 +870,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
928 | /// <param name="id">The symbol name</param> | 870 | /// <param name="id">The symbol name</param> |
929 | /// <param name="s">The Symbol node.</param> | 871 | /// <param name="s">The Symbol node.</param> |
930 | /// <returns>String containing C# code for identifier reference.</returns> | 872 | /// <returns>String containing C# code for identifier reference.</returns> |
931 | private string GenerateIdentifier(string id, SYMBOL s) | 873 | private void GenerateIdentifier(string id, SYMBOL s, StringBuilder sb) |
932 | { | 874 | { |
933 | if (m_comms != null) | 875 | if (m_comms != null) |
934 | { | 876 | { |
@@ -950,11 +892,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
950 | retval = String.Format("new LSL_Types.Quaternion(\"{0}\")",((OpenMetaverse.Quaternion)value).ToString()); | 892 | retval = String.Format("new LSL_Types.Quaternion(\"{0}\")",((OpenMetaverse.Quaternion)value).ToString()); |
951 | else retval = id; | 893 | else retval = id; |
952 | 894 | ||
953 | return Generate(retval, s); | 895 | Generate(retval, s, sb); |
896 | return; | ||
954 | } | 897 | } |
955 | } | 898 | } |
956 | 899 | ||
957 | return Generate(CheckName(id), s); | 900 | Generate(CheckName(id), s, sb); |
901 | return; | ||
958 | } | 902 | } |
959 | 903 | ||
960 | /// <summary> | 904 | /// <summary> |
@@ -962,10 +906,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
962 | /// </summary> | 906 | /// </summary> |
963 | /// <param name="fc">The FunctionCall node.</param> | 907 | /// <param name="fc">The FunctionCall node.</param> |
964 | /// <returns>String containing C# code for FunctionCall fc.</returns> | 908 | /// <returns>String containing C# code for FunctionCall fc.</returns> |
965 | private string GenerateFunctionCall(FunctionCall fc) | 909 | private void GenerateFunctionCall(FunctionCall fc, StringBuilder sb) |
966 | { | 910 | { |
967 | string retstr = String.Empty; | ||
968 | |||
969 | string modinvoke = null; | 911 | string modinvoke = null; |
970 | if (m_comms != null) | 912 | if (m_comms != null) |
971 | modinvoke = m_comms.LookupModInvocation(fc.Id); | 913 | modinvoke = m_comms.LookupModInvocation(fc.Id); |
@@ -975,22 +917,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
975 | if (fc.kids[0] is ArgumentList) | 917 | if (fc.kids[0] is ArgumentList) |
976 | { | 918 | { |
977 | if ((fc.kids[0] as ArgumentList).kids.Count == 0) | 919 | if ((fc.kids[0] as ArgumentList).kids.Count == 0) |
978 | retstr += Generate(String.Format("{0}(\"{1}\"",modinvoke,fc.Id), fc); | 920 | Generate(String.Format("{0}(\"{1}\"",modinvoke,fc.Id), fc, sb); |
979 | else | 921 | else |
980 | retstr += Generate(String.Format("{0}(\"{1}\",",modinvoke,fc.Id), fc); | 922 | Generate(String.Format("{0}(\"{1}\",",modinvoke,fc.Id), fc, sb); |
981 | } | 923 | } |
982 | } | 924 | } |
983 | else | 925 | else |
984 | { | 926 | { |
985 | retstr += Generate(String.Format("{0}(", CheckName(fc.Id)), fc); | 927 | Generate(String.Format("{0}(", CheckName(fc.Id)), fc, sb); |
986 | } | 928 | } |
987 | 929 | ||
988 | foreach (SYMBOL kid in fc.kids) | 930 | foreach (SYMBOL kid in fc.kids) |
989 | retstr += GenerateNode(fc, kid); | 931 | GenerateNodeToSB(fc, kid, sb); |
990 | |||
991 | retstr += Generate(")"); | ||
992 | 932 | ||
993 | return retstr; | 933 | Generate(")", sb); |
994 | } | 934 | } |
995 | 935 | ||
996 | /// <summary> | 936 | /// <summary> |
@@ -998,10 +938,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
998 | /// </summary> | 938 | /// </summary> |
999 | /// <param name="c">The Constant node.</param> | 939 | /// <param name="c">The Constant node.</param> |
1000 | /// <returns>String containing C# code for Constant c.</returns> | 940 | /// <returns>String containing C# code for Constant c.</returns> |
1001 | private string GenerateConstant(Constant c) | 941 | private void GenerateConstant(Constant c, StringBuilder sb) |
1002 | { | 942 | { |
1003 | string retstr = String.Empty; | ||
1004 | |||
1005 | // Supprt LSL's weird acceptance of floats with no trailing digits | 943 | // Supprt LSL's weird acceptance of floats with no trailing digits |
1006 | // after the period. Turn float x = 10.; into float x = 10.0; | 944 | // after the period. Turn float x = 10.; into float x = 10.0; |
1007 | if ("LSL_Types.LSLFloat" == c.Type) | 945 | if ("LSL_Types.LSLFloat" == c.Type) |
@@ -1020,9 +958,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1020 | c.Value = "new LSL_Types.LSLString(\""+c.Value+"\")"; | 958 | c.Value = "new LSL_Types.LSLString(\""+c.Value+"\")"; |
1021 | } | 959 | } |
1022 | 960 | ||
1023 | retstr += Generate(c.Value, c); | 961 | Generate(c.Value, c, sb); |
1024 | |||
1025 | return retstr; | ||
1026 | } | 962 | } |
1027 | 963 | ||
1028 | /// <summary> | 964 | /// <summary> |
@@ -1030,19 +966,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1030 | /// </summary> | 966 | /// </summary> |
1031 | /// <param name="vc">The VectorConstant node.</param> | 967 | /// <param name="vc">The VectorConstant node.</param> |
1032 | /// <returns>String containing C# code for VectorConstant vc.</returns> | 968 | /// <returns>String containing C# code for VectorConstant vc.</returns> |
1033 | private string GenerateVectorConstant(VectorConstant vc) | 969 | private void GenerateVectorConstant(VectorConstant vc, StringBuilder sb) |
1034 | { | 970 | { |
1035 | string retstr = String.Empty; | 971 | Generate(String.Format("new {0}(", vc.Type), vc, sb); |
1036 | 972 | GenerateNodeToSB(vc, (SYMBOL) vc.kids.Pop(), sb); | |
1037 | retstr += Generate(String.Format("new {0}(", vc.Type), vc); | 973 | Generate(", ", sb); |
1038 | retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop()); | 974 | GenerateNodeToSB(vc, (SYMBOL) vc.kids.Pop(), sb); |
1039 | retstr += Generate(", "); | 975 | Generate(", ", sb); |
1040 | retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop()); | 976 | GenerateNodeToSB(vc, (SYMBOL) vc.kids.Pop(), sb); |
1041 | retstr += Generate(", "); | 977 | Generate(")", sb); |
1042 | retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop()); | ||
1043 | retstr += Generate(")"); | ||
1044 | |||
1045 | return retstr; | ||
1046 | } | 978 | } |
1047 | 979 | ||
1048 | /// <summary> | 980 | /// <summary> |
@@ -1050,21 +982,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1050 | /// </summary> | 982 | /// </summary> |
1051 | /// <param name="rc">The RotationConstant node.</param> | 983 | /// <param name="rc">The RotationConstant node.</param> |
1052 | /// <returns>String containing C# code for RotationConstant rc.</returns> | 984 | /// <returns>String containing C# code for RotationConstant rc.</returns> |
1053 | private string GenerateRotationConstant(RotationConstant rc) | 985 | private void GenerateRotationConstant(RotationConstant rc, StringBuilder sb) |
1054 | { | 986 | { |
1055 | string retstr = String.Empty; | 987 | Generate(String.Format("new {0}(", rc.Type), rc, sb); |
1056 | 988 | GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); | |
1057 | retstr += Generate(String.Format("new {0}(", rc.Type), rc); | 989 | Generate(", ", sb); |
1058 | retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop()); | 990 | GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); |
1059 | retstr += Generate(", "); | 991 | Generate(", ", sb); |
1060 | retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop()); | 992 | GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); |
1061 | retstr += Generate(", "); | 993 | Generate(", ", sb); |
1062 | retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop()); | 994 | GenerateNodeToSB(rc, (SYMBOL) rc.kids.Pop(), sb); |
1063 | retstr += Generate(", "); | 995 | Generate(")", sb); |
1064 | retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop()); | ||
1065 | retstr += Generate(")"); | ||
1066 | |||
1067 | return retstr; | ||
1068 | } | 996 | } |
1069 | 997 | ||
1070 | /// <summary> | 998 | /// <summary> |
@@ -1072,27 +1000,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1072 | /// </summary> | 1000 | /// </summary> |
1073 | /// <param name="lc">The ListConstant node.</param> | 1001 | /// <param name="lc">The ListConstant node.</param> |
1074 | /// <returns>String containing C# code for ListConstant lc.</returns> | 1002 | /// <returns>String containing C# code for ListConstant lc.</returns> |
1075 | private string GenerateListConstant(ListConstant lc) | 1003 | private void GenerateListConstant(ListConstant lc, StringBuilder sb) |
1076 | { | 1004 | { |
1077 | string retstr = String.Empty; | 1005 | Generate(String.Format("new {0}(", lc.Type), lc, sb); |
1078 | |||
1079 | retstr += Generate(String.Format("new {0}(", lc.Type), lc); | ||
1080 | 1006 | ||
1081 | foreach (SYMBOL kid in lc.kids) | 1007 | foreach (SYMBOL kid in lc.kids) |
1082 | retstr += GenerateNode(lc, kid); | 1008 | GenerateNodeToSB(lc, kid, sb); |
1083 | 1009 | ||
1084 | retstr += Generate(")"); | 1010 | Generate(")", sb); |
1085 | |||
1086 | return retstr; | ||
1087 | } | 1011 | } |
1088 | 1012 | ||
1089 | /// <summary> | 1013 | /// <summary> |
1090 | /// Prints a newline. | 1014 | /// Prints a newline. |
1091 | /// </summary> | 1015 | /// </summary> |
1092 | /// <returns>A newline.</returns> | 1016 | /// <returns>A newline.</returns> |
1093 | private string GenerateLine() | 1017 | private void GenerateLine(StringBuilder sb) |
1094 | { | 1018 | { |
1095 | return GenerateLine(""); | 1019 | sb.Append("\n"); |
1020 | m_CSharpLine++; | ||
1021 | m_CSharpCol = 1; | ||
1096 | } | 1022 | } |
1097 | 1023 | ||
1098 | /// <summary> | 1024 | /// <summary> |
@@ -1100,9 +1026,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1100 | /// </summary> | 1026 | /// </summary> |
1101 | /// <param name="s">String of text to print.</param> | 1027 | /// <param name="s">String of text to print.</param> |
1102 | /// <returns>String s followed by newline.</returns> | 1028 | /// <returns>String s followed by newline.</returns> |
1103 | private string GenerateLine(string s) | 1029 | private void GenerateLine(string s, StringBuilder sb) |
1104 | { | 1030 | { |
1105 | return GenerateLine(s, null); | 1031 | sb.Append(s); |
1032 | sb.Append("\n"); | ||
1033 | m_CSharpLine++; | ||
1034 | m_CSharpCol = 1; | ||
1106 | } | 1035 | } |
1107 | 1036 | ||
1108 | /// <summary> | 1037 | /// <summary> |
@@ -1112,14 +1041,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1112 | /// <param name="sym">Symbol being generated to extract original line | 1041 | /// <param name="sym">Symbol being generated to extract original line |
1113 | /// number and column from.</param> | 1042 | /// number and column from.</param> |
1114 | /// <returns>String s followed by newline.</returns> | 1043 | /// <returns>String s followed by newline.</returns> |
1115 | private string GenerateLine(string s, SYMBOL sym) | 1044 | private void GenerateLine(string s, SYMBOL sym, StringBuilder sb) |
1116 | { | 1045 | { |
1117 | string retstr = Generate(s, sym) + "\n"; | 1046 | Generate(s, sym, sb); |
1047 | sb.Append("\n"); | ||
1118 | 1048 | ||
1119 | m_CSharpLine++; | 1049 | m_CSharpLine++; |
1120 | m_CSharpCol = 1; | 1050 | m_CSharpCol = 1; |
1121 | |||
1122 | return retstr; | ||
1123 | } | 1051 | } |
1124 | 1052 | ||
1125 | /// <summary> | 1053 | /// <summary> |
@@ -1127,9 +1055,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1127 | /// </summary> | 1055 | /// </summary> |
1128 | /// <param name="s">String of text to print.</param> | 1056 | /// <param name="s">String of text to print.</param> |
1129 | /// <returns>String s.</returns> | 1057 | /// <returns>String s.</returns> |
1130 | private string Generate(string s) | 1058 | private void Generate(string s, StringBuilder sb) |
1131 | { | 1059 | { |
1132 | return Generate(s, null); | 1060 | sb.Append(s); |
1061 | m_CSharpCol += s.Length; | ||
1133 | } | 1062 | } |
1134 | 1063 | ||
1135 | /// <summary> | 1064 | /// <summary> |
@@ -1139,14 +1068,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1139 | /// <param name="sym">Symbol being generated to extract original line | 1068 | /// <param name="sym">Symbol being generated to extract original line |
1140 | /// number and column from.</param> | 1069 | /// number and column from.</param> |
1141 | /// <returns>String s.</returns> | 1070 | /// <returns>String s.</returns> |
1142 | private string Generate(string s, SYMBOL sym) | 1071 | private void Generate(string s, SYMBOL sym, StringBuilder sb) |
1143 | { | 1072 | { |
1073 | sb.Append(s); | ||
1144 | if (null != sym) | 1074 | if (null != sym) |
1145 | m_positionMap.Add(new KeyValuePair<int, int>(m_CSharpLine, m_CSharpCol), new KeyValuePair<int, int>(sym.Line, sym.Position)); | 1075 | m_positionMap.Add(new KeyValuePair<int, int>(m_CSharpLine, m_CSharpCol), new KeyValuePair<int, int>(sym.Line, sym.Position)); |
1146 | 1076 | ||
1147 | m_CSharpCol += s.Length; | 1077 | m_CSharpCol += s.Length; |
1148 | |||
1149 | return s; | ||
1150 | } | 1078 | } |
1151 | 1079 | ||
1152 | /// <summary> | 1080 | /// <summary> |
@@ -1154,9 +1082,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1154 | /// </summary> | 1082 | /// </summary> |
1155 | /// <param name="s">String of text to print.</param> | 1083 | /// <param name="s">String of text to print.</param> |
1156 | /// <returns>Properly indented string s followed by newline.</returns> | 1084 | /// <returns>Properly indented string s followed by newline.</returns> |
1157 | private string GenerateIndentedLine(string s) | 1085 | private void GenerateIndentedLine(string s, StringBuilder sb) |
1158 | { | 1086 | { |
1159 | return GenerateIndentedLine(s, null); | 1087 | GenerateIndentedLine(s, null, sb); |
1160 | } | 1088 | } |
1161 | 1089 | ||
1162 | /// <summary> | 1090 | /// <summary> |
@@ -1166,14 +1094,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1166 | /// <param name="sym">Symbol being generated to extract original line | 1094 | /// <param name="sym">Symbol being generated to extract original line |
1167 | /// number and column from.</param> | 1095 | /// number and column from.</param> |
1168 | /// <returns>Properly indented string s followed by newline.</returns> | 1096 | /// <returns>Properly indented string s followed by newline.</returns> |
1169 | private string GenerateIndentedLine(string s, SYMBOL sym) | 1097 | private void GenerateIndentedLine(string s, SYMBOL sym, StringBuilder sb) |
1170 | { | 1098 | { |
1171 | string retstr = GenerateIndented(s, sym) + "\n"; | 1099 | GenerateIndented(s, sym , sb ); |
1172 | 1100 | sb.Append("\n"); | |
1173 | m_CSharpLine++; | 1101 | m_CSharpLine++; |
1174 | m_CSharpCol = 1; | 1102 | m_CSharpCol = 1; |
1175 | |||
1176 | return retstr; | ||
1177 | } | 1103 | } |
1178 | 1104 | ||
1179 | /// <summary> | 1105 | /// <summary> |
@@ -1194,34 +1120,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
1194 | /// <param name="sym">Symbol being generated to extract original line | 1120 | /// <param name="sym">Symbol being generated to extract original line |
1195 | /// number and column from.</param> | 1121 | /// number and column from.</param> |
1196 | /// <returns>Properly indented string s.</returns> | 1122 | /// <returns>Properly indented string s.</returns> |
1197 | private string GenerateIndented(string s, SYMBOL sym) | 1123 | private void GenerateIndented(string s, SYMBOL sym, StringBuilder sb) |
1198 | { | 1124 | { |
1199 | string retstr = Indent() + s; | 1125 | Indent(sb); |
1200 | 1126 | sb.Append(s); | |
1127 | |||
1201 | if (null != sym) | 1128 | if (null != sym) |
1202 | m_positionMap.Add(new KeyValuePair<int, int>(m_CSharpLine, m_CSharpCol), new KeyValuePair<int, int>(sym.Line, sym.Position)); | 1129 | m_positionMap.Add(new KeyValuePair<int, int>(m_CSharpLine, m_CSharpCol), new KeyValuePair<int, int>(sym.Line, sym.Position)); |
1203 | 1130 | ||
1204 | m_CSharpCol += s.Length; | 1131 | m_CSharpCol += s.Length; |
1205 | |||
1206 | return retstr; | ||
1207 | } | 1132 | } |
1208 | 1133 | ||
1209 | /// <summary> | 1134 | /// <summary> |
1210 | /// Prints correct indentation. | 1135 | /// Prints correct indentation. |
1211 | /// </summary> | 1136 | /// </summary> |
1212 | /// <returns>Indentation based on brace count.</returns> | 1137 | /// <returns>Indentation based on brace count.</returns> |
1213 | private string Indent() | 1138 | private void Indent(StringBuilder sb) |
1214 | { | 1139 | { |
1215 | string retstr = String.Empty; | ||
1216 | |||
1217 | for (int i = 0; i < m_braceCount; i++) | 1140 | for (int i = 0; i < m_braceCount; i++) |
1218 | for (int j = 0; j < m_indentWidth; j++) | 1141 | { |
1219 | { | 1142 | sb.Append(" "); |
1220 | retstr += " "; | 1143 | m_CSharpCol += 4; |
1221 | m_CSharpCol++; | 1144 | } |
1222 | } | ||
1223 | |||
1224 | return retstr; | ||
1225 | } | 1145 | } |
1226 | 1146 | ||
1227 | /// <summary> | 1147 | /// <summary> |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs index af324bf..f632cb0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs | |||
@@ -81,8 +81,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
81 | 81 | ||
82 | // private object m_syncy = new object(); | 82 | // private object m_syncy = new object(); |
83 | 83 | ||
84 | private static CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); | 84 | // private static CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); |
85 | private static VBCodeProvider VBcodeProvider = new VBCodeProvider(); | 85 | // private static VBCodeProvider VBcodeProvider = new VBCodeProvider(); |
86 | 86 | ||
87 | // private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files | 87 | // private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files |
88 | private static UInt64 scriptCompileCounter = 0; // And a counter | 88 | private static UInt64 scriptCompileCounter = 0; // And a counter |
@@ -356,14 +356,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
356 | throw new Exception(errtext); | 356 | throw new Exception(errtext); |
357 | } | 357 | } |
358 | 358 | ||
359 | string compileScript = source; | 359 | string compileScript = string.Empty; |
360 | 360 | ||
361 | if (language == enumCompileType.lsl) | 361 | if (language == enumCompileType.lsl) |
362 | { | 362 | { |
363 | // Its LSL, convert it to C# | 363 | // Its LSL, convert it to C# |
364 | |||
365 | StringBuilder sb = new StringBuilder(16394); | ||
366 | |||
364 | LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms, m_insertCoopTerminationCalls); | 367 | LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms, m_insertCoopTerminationCalls); |
365 | compileScript = LSL_Converter.Convert(source); | 368 | AddCSScriptHeader( |
369 | m_scriptEngine.ScriptClassName, | ||
370 | m_scriptEngine.ScriptBaseClassName, | ||
371 | m_scriptEngine.ScriptBaseClassParameters, | ||
372 | sb); | ||
366 | 373 | ||
374 | LSL_Converter.Convert(source,sb); | ||
375 | AddCSScriptTail(sb); | ||
376 | compileScript = sb.ToString(); | ||
367 | // copy converter warnings into our warnings. | 377 | // copy converter warnings into our warnings. |
368 | foreach (string warning in LSL_Converter.GetWarnings()) | 378 | foreach (string warning in LSL_Converter.GetWarnings()) |
369 | { | 379 | { |
@@ -374,22 +384,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
374 | // Write the linemap to a file and save it in our dictionary for next time. | 384 | // Write the linemap to a file and save it in our dictionary for next time. |
375 | m_lineMaps[assembly] = linemap; | 385 | m_lineMaps[assembly] = linemap; |
376 | WriteMapFile(assembly + ".map", linemap); | 386 | WriteMapFile(assembly + ".map", linemap); |
387 | LSL_Converter.Clear(); | ||
377 | } | 388 | } |
378 | 389 | else | |
379 | switch (language) | 390 | { |
380 | { | 391 | switch (language) |
381 | case enumCompileType.cs: | 392 | { |
382 | case enumCompileType.lsl: | 393 | case enumCompileType.cs: |
383 | compileScript = CreateCSCompilerScript( | 394 | compileScript = CreateCSCompilerScript( |
384 | compileScript, | 395 | compileScript, |
385 | m_scriptEngine.ScriptClassName, | 396 | m_scriptEngine.ScriptClassName, |
386 | m_scriptEngine.ScriptBaseClassName, | 397 | m_scriptEngine.ScriptBaseClassName, |
387 | m_scriptEngine.ScriptBaseClassParameters); | 398 | m_scriptEngine.ScriptBaseClassParameters); |
388 | break; | 399 | break; |
389 | case enumCompileType.vb: | 400 | case enumCompileType.vb: |
390 | compileScript = CreateVBCompilerScript( | 401 | compileScript = CreateVBCompilerScript( |
391 | compileScript, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName); | 402 | compileScript, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName); |
392 | break; | 403 | break; |
404 | } | ||
393 | } | 405 | } |
394 | 406 | ||
395 | assembly = CompileFromDotNetText(compileScript, language, asset, assembly); | 407 | assembly = CompileFromDotNetText(compileScript, language, asset, assembly); |
@@ -419,6 +431,34 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
419 | // return compileScript; | 431 | // return compileScript; |
420 | // } | 432 | // } |
421 | 433 | ||
434 | public static void AddCSScriptHeader(string className, string baseClassName, ParameterInfo[] constructorParameters, StringBuilder sb) | ||
435 | { | ||
436 | sb.Append(string.Format( | ||
437 | @"using OpenSim.Region.ScriptEngine.Shared; | ||
438 | using System.Collections.Generic; | ||
439 | |||
440 | namespace SecondLife | ||
441 | {{ | ||
442 | public class {0} : {1} | ||
443 | {{ | ||
444 | public {0}({2}) : base({3}) {{}} | ||
445 | ", | ||
446 | className, | ||
447 | baseClassName, | ||
448 | constructorParameters != null | ||
449 | ? string.Join(", ", Array.ConvertAll<ParameterInfo, string>(constructorParameters, pi => pi.ToString())) | ||
450 | : "", | ||
451 | constructorParameters != null | ||
452 | ? string.Join(", ", Array.ConvertAll<ParameterInfo, string>(constructorParameters, pi => pi.Name)) | ||
453 | : "" | ||
454 | )); | ||
455 | } | ||
456 | |||
457 | public static void AddCSScriptTail(StringBuilder sb) | ||
458 | { | ||
459 | sb.Append(string.Format(" }}\n}}\n")); | ||
460 | } | ||
461 | |||
422 | public static string CreateCSCompilerScript( | 462 | public static string CreateCSCompilerScript( |
423 | string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters) | 463 | string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters) |
424 | { | 464 | { |
@@ -511,8 +551,6 @@ namespace SecondLife | |||
511 | // Do actual compile | 551 | // Do actual compile |
512 | CompilerParameters parameters = new CompilerParameters(); | 552 | CompilerParameters parameters = new CompilerParameters(); |
513 | 553 | ||
514 | parameters.IncludeDebugInformation = true; | ||
515 | |||
516 | string rootPath = AppDomain.CurrentDomain.BaseDirectory; | 554 | string rootPath = AppDomain.CurrentDomain.BaseDirectory; |
517 | 555 | ||
518 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, | 556 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, |
@@ -532,26 +570,44 @@ namespace SecondLife | |||
532 | parameters.IncludeDebugInformation = CompileWithDebugInformation; | 570 | parameters.IncludeDebugInformation = CompileWithDebugInformation; |
533 | //parameters.WarningLevel = 1; // Should be 4? | 571 | //parameters.WarningLevel = 1; // Should be 4? |
534 | parameters.TreatWarningsAsErrors = false; | 572 | parameters.TreatWarningsAsErrors = false; |
535 | 573 | parameters.GenerateInMemory = false; | |
574 | |||
536 | CompilerResults results; | 575 | CompilerResults results; |
576 | |||
577 | CodeDomProvider provider; | ||
537 | switch (lang) | 578 | switch (lang) |
538 | { | 579 | { |
539 | case enumCompileType.vb: | 580 | case enumCompileType.vb: |
540 | results = VBcodeProvider.CompileAssemblyFromSource( | 581 | // results = VBcodeProvider.CompileAssemblyFromSource( |
541 | parameters, Script); | 582 | // parameters, Script); |
583 | provider = CodeDomProvider.CreateProvider("VisualBasic"); | ||
542 | break; | 584 | break; |
543 | case enumCompileType.cs: | 585 | case enumCompileType.cs: |
544 | case enumCompileType.lsl: | 586 | case enumCompileType.lsl: |
587 | provider = CodeDomProvider.CreateProvider("CSharp"); | ||
588 | break; | ||
589 | default: | ||
590 | throw new Exception("Compiler is not able to recongnize " + | ||
591 | "language type \"" + lang.ToString() + "\""); | ||
592 | } | ||
593 | |||
594 | if(provider == null) | ||
595 | throw new Exception("Compiler failed to load "); | ||
596 | |||
597 | |||
545 | bool complete = false; | 598 | bool complete = false; |
546 | bool retried = false; | 599 | bool retried = false; |
600 | |||
547 | do | 601 | do |
548 | { | 602 | { |
549 | lock (CScodeProvider) | 603 | // lock (CScodeProvider) |
550 | { | 604 | // { |
551 | results = CScodeProvider.CompileAssemblyFromSource( | 605 | // results = CScodeProvider.CompileAssemblyFromSource( |
606 | // parameters, Script); | ||
607 | // } | ||
608 | |||
609 | results = provider.CompileAssemblyFromSource( | ||
552 | parameters, Script); | 610 | parameters, Script); |
553 | } | ||
554 | |||
555 | // Deal with an occasional segv in the compiler. | 611 | // Deal with an occasional segv in the compiler. |
556 | // Rarely, if ever, occurs twice in succession. | 612 | // Rarely, if ever, occurs twice in succession. |
557 | // Line # == 0 and no file name are indications that | 613 | // Line # == 0 and no file name are indications that |
@@ -575,11 +631,11 @@ namespace SecondLife | |||
575 | complete = true; | 631 | complete = true; |
576 | } | 632 | } |
577 | } while (!complete); | 633 | } while (!complete); |
578 | break; | 634 | // break; |
579 | default: | 635 | // default: |
580 | throw new Exception("Compiler is not able to recongnize " + | 636 | // throw new Exception("Compiler is not able to recongnize " + |
581 | "language type \"" + lang.ToString() + "\""); | 637 | // "language type \"" + lang.ToString() + "\""); |
582 | } | 638 | // } |
583 | 639 | ||
584 | // foreach (Type type in results.CompiledAssembly.GetTypes()) | 640 | // foreach (Type type in results.CompiledAssembly.GetTypes()) |
585 | // { | 641 | // { |
@@ -628,6 +684,8 @@ namespace SecondLife | |||
628 | } | 684 | } |
629 | } | 685 | } |
630 | 686 | ||
687 | provider.Dispose(); | ||
688 | |||
631 | if (hadErrors) | 689 | if (hadErrors) |
632 | { | 690 | { |
633 | throw new Exception(errtext); | 691 | throw new Exception(errtext); |
@@ -785,15 +843,16 @@ namespace SecondLife | |||
785 | 843 | ||
786 | private static void WriteMapFile(string filename, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> linemap) | 844 | private static void WriteMapFile(string filename, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> linemap) |
787 | { | 845 | { |
788 | string mapstring = String.Empty; | 846 | StringBuilder mapbuilder = new StringBuilder(1024); |
847 | |||
789 | foreach (KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>> kvp in linemap) | 848 | foreach (KeyValuePair<KeyValuePair<int, int>, KeyValuePair<int, int>> kvp in linemap) |
790 | { | 849 | { |
791 | KeyValuePair<int, int> k = kvp.Key; | 850 | KeyValuePair<int, int> k = kvp.Key; |
792 | KeyValuePair<int, int> v = kvp.Value; | 851 | KeyValuePair<int, int> v = kvp.Value; |
793 | mapstring += String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value); | 852 | mapbuilder.Append(String.Format("{0},{1},{2},{3}\n", k.Key, k.Value, v.Key, v.Value)); |
794 | } | 853 | } |
795 | 854 | ||
796 | Byte[] mapbytes = Encoding.ASCII.GetBytes(mapstring); | 855 | Byte[] mapbytes = Encoding.ASCII.GetBytes(mapbuilder.ToString()); |
797 | 856 | ||
798 | using (FileStream mfs = File.Create(filename)) | 857 | using (FileStream mfs = File.Create(filename)) |
799 | mfs.Write(mapbytes, 0, mapbytes.Length); | 858 | mfs.Write(mapbytes, 0, mapbytes.Length); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs index 84e8ab2..076caad 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/ICodeConverter.cs | |||
@@ -27,12 +27,15 @@ | |||
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Text; | ||
30 | 31 | ||
31 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | 32 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools |
32 | { | 33 | { |
33 | public interface ICodeConverter | 34 | public interface ICodeConverter |
34 | { | 35 | { |
35 | string Convert(string script); | 36 | string Convert(string script); |
37 | void Convert(string script, StringBuilder sb); | ||
36 | string[] GetWarnings(); | 38 | string[] GetWarnings(); |
39 | void Clear(); | ||
37 | } | 40 | } |
38 | } | 41 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs index 0fb3574..0585f8b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/LSL2CSCodeTransformer.cs | |||
@@ -191,7 +191,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | |||
191 | Constant rca = new Constant(p, "float", "0.0"); | 191 | Constant rca = new Constant(p, "float", "0.0"); |
192 | Constant rcb = new Constant(p, "float", "0.0"); | 192 | Constant rcb = new Constant(p, "float", "0.0"); |
193 | Constant rcc = new Constant(p, "float", "0.0"); | 193 | Constant rcc = new Constant(p, "float", "0.0"); |
194 | Constant rcd = new Constant(p, "float", "0.0"); | 194 | Constant rcd = new Constant(p, "float", "1.0"); |
195 | ConstantExpression rcea = new ConstantExpression(p, rca); | 195 | ConstantExpression rcea = new ConstantExpression(p, rca); |
196 | ConstantExpression rceb = new ConstantExpression(p, rcb); | 196 | ConstantExpression rceb = new ConstantExpression(p, rcb); |
197 | ConstantExpression rcec = new ConstantExpression(p, rcc); | 197 | ConstantExpression rcec = new ConstantExpression(p, rcc); |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs index b92f3a3..a9f3283 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs | |||
@@ -1388,7 +1388,7 @@ default | |||
1388 | "\n LSL_Types.list m = new LSL_Types.list(new LSL_Types.LSLInteger(1), new LSL_Types.LSLInteger(2), new LSL_Types.LSLInteger(3));" + | 1388 | "\n LSL_Types.list m = new LSL_Types.list(new LSL_Types.LSLInteger(1), new LSL_Types.LSLInteger(2), new LSL_Types.LSLInteger(3));" + |
1389 | "\n LSL_Types.Vector3 v = new LSL_Types.Vector3(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0));" + | 1389 | "\n LSL_Types.Vector3 v = new LSL_Types.Vector3(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0));" + |
1390 | "\n LSL_Types.Vector3 w = new LSL_Types.Vector3(new LSL_Types.LSLFloat(1.0), new LSL_Types.LSLFloat(0.1), new LSL_Types.LSLFloat(0.5));" + | 1390 | "\n LSL_Types.Vector3 w = new LSL_Types.Vector3(new LSL_Types.LSLFloat(1.0), new LSL_Types.LSLFloat(0.1), new LSL_Types.LSLFloat(0.5));" + |
1391 | "\n LSL_Types.Quaternion r = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0));" + | 1391 | "\n LSL_Types.Quaternion r = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(0.0), new LSL_Types.LSLFloat(1.0));" + |
1392 | "\n LSL_Types.Quaternion u = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.8), new LSL_Types.LSLFloat(0.7), new LSL_Types.LSLFloat(0.6), llSomeFunc());" + | 1392 | "\n LSL_Types.Quaternion u = new LSL_Types.Quaternion(new LSL_Types.LSLFloat(0.8), new LSL_Types.LSLFloat(0.7), new LSL_Types.LSLFloat(0.6), llSomeFunc());" + |
1393 | "\n LSL_Types.LSLString k = new LSL_Types.LSLString(\"\");" + | 1393 | "\n LSL_Types.LSLString k = new LSL_Types.LSLString(\"\");" + |
1394 | "\n LSL_Types.LSLString n = new LSL_Types.LSLString(\"ping\");" + | 1394 | "\n LSL_Types.LSLString n = new LSL_Types.LSLString(\"ping\");" + |
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs index b476e32..ad4ccf0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs +++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs | |||
@@ -37,6 +37,7 @@ using OpenSim.Tests.Common; | |||
37 | 37 | ||
38 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | 38 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests |
39 | { | 39 | { |
40 | |||
40 | /// <summary> | 41 | /// <summary> |
41 | /// Tests the LSL compiler. Among other things, test that error messages | 42 | /// Tests the LSL compiler. Among other things, test that error messages |
42 | /// generated by the C# compiler can be mapped to prper lines/columns in | 43 | /// generated by the C# compiler can be mapped to prper lines/columns in |
@@ -132,7 +133,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | |||
132 | 133 | ||
133 | return compilerResults; | 134 | return compilerResults; |
134 | } | 135 | } |
135 | 136 | /* test too depedent on counting lines and columns maping code generation changes | |
137 | erros position is better tested on viewers | ||
136 | /// <summary> | 138 | /// <summary> |
137 | /// Test that line number errors are resolved as expected when preceding code contains a jump. | 139 | /// Test that line number errors are resolved as expected when preceding code contains a jump. |
138 | /// </summary> | 140 | /// </summary> |
@@ -159,6 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | |||
159 | positionMap[new KeyValuePair<int, int>(compilerResults.Errors[0].Line, compilerResults.Errors[0].Column)]); | 161 | positionMap[new KeyValuePair<int, int>(compilerResults.Errors[0].Line, compilerResults.Errors[0].Column)]); |
160 | } | 162 | } |
161 | 163 | ||
164 | |||
162 | /// <summary> | 165 | /// <summary> |
163 | /// Test the C# compiler error message can be mapped to the correct | 166 | /// Test the C# compiler error message can be mapped to the correct |
164 | /// line/column in the LSL source when an undeclared variable is used. | 167 | /// line/column in the LSL source when an undeclared variable is used. |
@@ -183,7 +186,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests | |||
183 | new KeyValuePair<int, int>(5, 21), | 186 | new KeyValuePair<int, int>(5, 21), |
184 | positionMap[new KeyValuePair<int, int>(compilerResults.Errors[0].Line, compilerResults.Errors[0].Column)]); | 187 | positionMap[new KeyValuePair<int, int>(compilerResults.Errors[0].Line, compilerResults.Errors[0].Column)]); |
185 | } | 188 | } |
186 | 189 | */ | |
187 | /// <summary> | 190 | /// <summary> |
188 | /// Test that a string can be cast to string and another string | 191 | /// Test that a string can be cast to string and another string |
189 | /// concatenated. | 192 | /// concatenated. |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 674144b..611df58 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -416,7 +416,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
416 | PostEvent(new EventParams("on_rez", | 416 | PostEvent(new EventParams("on_rez", |
417 | new Object[] {new LSL_Types.LSLInteger(StartParam)}, new DetectParams[0])); | 417 | new Object[] {new LSL_Types.LSLInteger(StartParam)}, new DetectParams[0])); |
418 | } | 418 | } |
419 | |||
420 | if (m_stateSource == StateSource.AttachedRez) | 419 | if (m_stateSource == StateSource.AttachedRez) |
421 | { | 420 | { |
422 | PostEvent(new EventParams("attach", | 421 | PostEvent(new EventParams("attach", |
@@ -457,7 +456,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
457 | PostEvent(new EventParams("attach", | 456 | PostEvent(new EventParams("attach", |
458 | new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); | 457 | new object[] { new LSL_Types.LSLString(m_AttachedAvatar.ToString()) }, new DetectParams[0])); |
459 | } | 458 | } |
460 | |||
461 | } | 459 | } |
462 | } | 460 | } |
463 | 461 | ||
@@ -807,9 +805,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
807 | lock (EventQueue) | 805 | lock (EventQueue) |
808 | { | 806 | { |
809 | data = (EventParams)EventQueue.Dequeue(); | 807 | data = (EventParams)EventQueue.Dequeue(); |
810 | if (data == null) // Shouldn't happen | 808 | if (data == null) |
811 | { | 809 | { |
812 | if (EventQueue.Count > 0 && Running && !ShuttingDown) | 810 | // check if a null event was enqueued or if its really empty |
811 | if (EventQueue.Count > 0 && Running && !ShuttingDown && !m_InSelfDelete) | ||
813 | { | 812 | { |
814 | m_CurrentWorkItem = Engine.QueueEventHandler(this); | 813 | m_CurrentWorkItem = Engine.QueueEventHandler(this); |
815 | } | 814 | } |
@@ -870,13 +869,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
870 | } | 869 | } |
871 | else | 870 | else |
872 | { | 871 | { |
872 | Exception e = null; | ||
873 | |||
873 | if (Engine.World.PipeEventsForScript(LocalID) || | 874 | if (Engine.World.PipeEventsForScript(LocalID) || |
874 | data.EventName == "control") // Don't freeze avies! | 875 | data.EventName == "control") // Don't freeze avies! |
875 | { | 876 | { |
876 | // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", | 877 | // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", |
877 | // PrimName, ScriptName, data.EventName, State); | 878 | // PrimName, ScriptName, data.EventName, State); |
878 | 879 | ||
879 | |||
880 | try | 880 | try |
881 | { | 881 | { |
882 | m_CurrentEvent = data.EventName; | 882 | m_CurrentEvent = data.EventName; |
@@ -891,6 +891,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
891 | { | 891 | { |
892 | m_InEvent = false; | 892 | m_InEvent = false; |
893 | m_CurrentEvent = String.Empty; | 893 | m_CurrentEvent = String.Empty; |
894 | lock (EventQueue) | ||
895 | m_CurrentWorkItem = null; // no longer in a event that can be canceled | ||
894 | } | 896 | } |
895 | 897 | ||
896 | if (m_SaveState) | 898 | if (m_SaveState) |
@@ -903,7 +905,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
903 | m_SaveState = false; | 905 | m_SaveState = false; |
904 | } | 906 | } |
905 | } | 907 | } |
906 | catch (Exception e) | 908 | catch (Exception exx) |
909 | { | ||
910 | e = exx; | ||
911 | } | ||
912 | |||
913 | if(e != null) | ||
907 | { | 914 | { |
908 | // m_log.DebugFormat( | 915 | // m_log.DebugFormat( |
909 | // "[SCRIPT] Exception in script {0} {1}: {2}{3}", | 916 | // "[SCRIPT] Exception in script {0} {1}: {2}{3}", |
@@ -979,7 +986,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
979 | ScriptTask.ItemID, ScriptTask.AssetID, data.EventName, EventsProcessed); | 986 | ScriptTask.ItemID, ScriptTask.AssetID, data.EventName, EventsProcessed); |
980 | } | 987 | } |
981 | 988 | ||
982 | if (EventQueue.Count > 0 && Running && !ShuttingDown) | 989 | if (EventQueue.Count > 0 && Running && !ShuttingDown && !m_InSelfDelete) |
983 | { | 990 | { |
984 | m_CurrentWorkItem = Engine.QueueEventHandler(this); | 991 | m_CurrentWorkItem = Engine.QueueEventHandler(this); |
985 | } | 992 | } |
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs index d501979..9fb1e2c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs +++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs | |||
@@ -339,7 +339,7 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
339 | y = (float)Quat.y; | 339 | y = (float)Quat.y; |
340 | z = (float)Quat.z; | 340 | z = (float)Quat.z; |
341 | s = (float)Quat.s; | 341 | s = (float)Quat.s; |
342 | if (x == 0 && y == 0 && z == 0 && s == 0) | 342 | if (s == 0 && x == 0 && y == 0 && z == 0) |
343 | s = 1; | 343 | s = 1; |
344 | } | 344 | } |
345 | 345 | ||
@@ -349,7 +349,7 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
349 | y = Y; | 349 | y = Y; |
350 | z = Z; | 350 | z = Z; |
351 | s = S; | 351 | s = S; |
352 | if (x == 0 && y == 0 && z == 0 && s == 0) | 352 | if (s == 0 && x == 0 && y == 0 && z == 0) |
353 | s = 1; | 353 | s = 1; |
354 | } | 354 | } |
355 | 355 | ||
@@ -368,7 +368,7 @@ namespace OpenSim.Region.ScriptEngine.Shared | |||
368 | res = res & Double.TryParse(tmps[1], NumberStyles.Float, Culture.NumberFormatInfo, out y); | 368 | res = res & Double.TryParse(tmps[1], NumberStyles.Float, Culture.NumberFormatInfo, out y); |
369 | res = res & Double.TryParse(tmps[2], NumberStyles.Float, Culture.NumberFormatInfo, out z); | 369 | res = res & Double.TryParse(tmps[2], NumberStyles.Float, Culture.NumberFormatInfo, out z); |
370 | res = res & Double.TryParse(tmps[3], NumberStyles.Float, Culture.NumberFormatInfo, out s); | 370 | res = res & Double.TryParse(tmps[3], NumberStyles.Float, Culture.NumberFormatInfo, out s); |
371 | if (x == 0 && y == 0 && z == 0 && s == 0) | 371 | if (s == 0 && x == 0 && y == 0 && z == 0) |
372 | s = 1; | 372 | s = 1; |
373 | } | 373 | } |
374 | 374 | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index f1b1e66..301eada 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs | |||
@@ -408,10 +408,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
408 | 408 | ||
409 | public void attach(uint localID, UUID itemID, UUID avatar) | 409 | public void attach(uint localID, UUID itemID, UUID avatar) |
410 | { | 410 | { |
411 | myScriptEngine.PostObjectEvent(localID, new EventParams( | 411 | SceneObjectGroup grp = myScriptEngine.World.GetSceneObjectGroup(localID); |
412 | if(grp == null) | ||
413 | return; | ||
414 | |||
415 | foreach(SceneObjectPart part in grp.Parts) | ||
416 | { | ||
417 | myScriptEngine.PostObjectEvent(part.LocalId, new EventParams( | ||
412 | "attach",new object[] { | 418 | "attach",new object[] { |
413 | new LSL_Types.LSLString(avatar.ToString()) }, | 419 | new LSL_Types.LSLString(avatar.ToString()) }, |
414 | new DetectParams[0])); | 420 | new DetectParams[0])); |
421 | } | ||
415 | } | 422 | } |
416 | 423 | ||
417 | // dataserver: not handled here | 424 | // dataserver: not handled here |
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 78d4ee9..3038915 100755 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -1024,18 +1024,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1024 | 1024 | ||
1025 | // m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID); | 1025 | // m_log.DebugFormat("[XEngine]: Added script {0} to compile queue", itemID); |
1026 | 1026 | ||
1027 | if (m_CurrentCompile == null) | 1027 | // NOTE: Although we use a lockless queue, the lock here |
1028 | // is required. It ensures that there are never two | ||
1029 | // compile threads running, which, due to a race | ||
1030 | // conndition, might otherwise happen | ||
1031 | // | ||
1032 | lock (m_CompileQueue) | ||
1028 | { | 1033 | { |
1029 | // NOTE: Although we use a lockless queue, the lock here | 1034 | if (m_CurrentCompile == null) |
1030 | // is required. It ensures that there are never two | 1035 | m_CurrentCompile = m_ThreadPool.QueueWorkItem(DoOnRezScriptQueue, null); |
1031 | // compile threads running, which, due to a race | ||
1032 | // conndition, might otherwise happen | ||
1033 | // | ||
1034 | lock (m_CompileQueue) | ||
1035 | { | ||
1036 | if (m_CurrentCompile == null) | ||
1037 | m_CurrentCompile = m_ThreadPool.QueueWorkItem(DoOnRezScriptQueue, null); | ||
1038 | } | ||
1039 | } | 1036 | } |
1040 | } | 1037 | } |
1041 | } | 1038 | } |
@@ -1281,6 +1278,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1281 | } | 1278 | } |
1282 | } | 1279 | } |
1283 | 1280 | ||
1281 | // do not load a assembly on top of a lot of to release memory | ||
1282 | // also yield a bit | ||
1283 | // only if logins disable since causes a lot of rubber banding | ||
1284 | if(!m_Scene.LoginsEnabled) | ||
1285 | GC.Collect(2); | ||
1286 | |||
1284 | ScriptInstance instance = null; | 1287 | ScriptInstance instance = null; |
1285 | lock (m_Scripts) | 1288 | lock (m_Scripts) |
1286 | { | 1289 | { |
@@ -1288,26 +1291,27 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1288 | if ((!m_Scripts.ContainsKey(itemID)) || | 1291 | if ((!m_Scripts.ContainsKey(itemID)) || |
1289 | (m_Scripts[itemID].AssetID != assetID)) | 1292 | (m_Scripts[itemID].AssetID != assetID)) |
1290 | { | 1293 | { |
1291 | UUID appDomain = assetID; | 1294 | // UUID appDomain = assetID; |
1292 | 1295 | ||
1293 | if (part.ParentGroup.IsAttachment) | 1296 | // if (part.ParentGroup.IsAttachment) |
1294 | appDomain = part.ParentGroup.RootPart.UUID; | 1297 | // appDomain = part.ParentGroup.RootPart.UUID; |
1298 | UUID appDomain = part.ParentGroup.RootPart.UUID; | ||
1295 | 1299 | ||
1296 | if (!m_AppDomains.ContainsKey(appDomain)) | 1300 | if (!m_AppDomains.ContainsKey(appDomain)) |
1297 | { | 1301 | { |
1298 | try | 1302 | try |
1299 | { | 1303 | { |
1300 | AppDomainSetup appSetup = new AppDomainSetup(); | 1304 | AppDomain sandbox; |
1301 | appSetup.PrivateBinPath = Path.Combine( | 1305 | if (m_AppDomainLoading) |
1306 | { | ||
1307 | AppDomainSetup appSetup = new AppDomainSetup(); | ||
1308 | appSetup.PrivateBinPath = Path.Combine( | ||
1302 | m_ScriptEnginesPath, | 1309 | m_ScriptEnginesPath, |
1303 | m_Scene.RegionInfo.RegionID.ToString()); | 1310 | m_Scene.RegionInfo.RegionID.ToString()); |
1304 | 1311 | ||
1305 | Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; | 1312 | Evidence baseEvidence = AppDomain.CurrentDomain.Evidence; |
1306 | Evidence evidence = new Evidence(baseEvidence); | 1313 | Evidence evidence = new Evidence(baseEvidence); |
1307 | 1314 | ||
1308 | AppDomain sandbox; | ||
1309 | if (m_AppDomainLoading) | ||
1310 | { | ||
1311 | sandbox = AppDomain.CreateDomain( | 1315 | sandbox = AppDomain.CreateDomain( |
1312 | m_Scene.RegionInfo.RegionID.ToString(), | 1316 | m_Scene.RegionInfo.RegionID.ToString(), |
1313 | evidence, appSetup); | 1317 | evidence, appSetup); |
@@ -1472,9 +1476,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1472 | startParam, postOnRez, | 1476 | startParam, postOnRez, |
1473 | m_MaxScriptQueue); | 1477 | m_MaxScriptQueue); |
1474 | 1478 | ||
1475 | if ( | 1479 | if(!instance.Load(scriptObj, coopSleepHandle, assemblyPath, |
1476 | !instance.Load( | ||
1477 | scriptObj, coopSleepHandle, assemblyPath, | ||
1478 | Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource, coopTerminationForThisScript)) | 1480 | Path.Combine(ScriptEnginePath, World.RegionInfo.RegionID.ToString()), stateSource, coopTerminationForThisScript)) |
1479 | return false; | 1481 | return false; |
1480 | 1482 | ||
@@ -1506,11 +1508,12 @@ namespace OpenSim.Region.ScriptEngine.XEngine | |||
1506 | m_PrimObjects[localID].Add(itemID); | 1508 | m_PrimObjects[localID].Add(itemID); |
1507 | } | 1509 | } |
1508 | 1510 | ||
1509 | if (!m_Assemblies.ContainsKey(assetID)) | ||
1510 | m_Assemblies[assetID] = assemblyPath; | ||
1511 | 1511 | ||
1512 | lock (m_AddingAssemblies) | 1512 | lock (m_AddingAssemblies) |
1513 | { | 1513 | { |
1514 | if (!m_Assemblies.ContainsKey(assetID)) | ||
1515 | m_Assemblies[assetID] = assemblyPath; | ||
1516 | |||
1514 | m_AddingAssemblies[assemblyPath]--; | 1517 | m_AddingAssemblies[assemblyPath]--; |
1515 | } | 1518 | } |
1516 | 1519 | ||