diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPart.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 300 |
1 files changed, 124 insertions, 176 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 165dd85..2191cfa 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -790,7 +790,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
790 | } | 790 | } |
791 | catch (Exception e) | 791 | catch (Exception e) |
792 | { | 792 | { |
793 | m_log.Error("[SCENEOBJECTPART]: GROUP POSITION. " + e.Message); | 793 | m_log.ErrorFormat("[SCENEOBJECTPART]: GROUP POSITION. {0}", e); |
794 | } | 794 | } |
795 | } | 795 | } |
796 | } | 796 | } |
@@ -2864,6 +2864,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
2864 | SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd); | 2864 | SendLandCollisionEvent(scriptEvents.land_collision_end, ParentGroup.Scene.EventManager.TriggerScriptLandCollidingEnd); |
2865 | } | 2865 | } |
2866 | 2866 | ||
2867 | // The Collision sounds code calls this | ||
2868 | public void SendCollisionSound(UUID soundID, double volume, Vector3 position) | ||
2869 | { | ||
2870 | if (soundID == UUID.Zero) | ||
2871 | return; | ||
2872 | |||
2873 | ISoundModule soundModule = ParentGroup.Scene.RequestModuleInterface<ISoundModule>(); | ||
2874 | if (soundModule == null) | ||
2875 | return; | ||
2876 | |||
2877 | if (volume > 1) | ||
2878 | volume = 1; | ||
2879 | if (volume < 0) | ||
2880 | volume = 0; | ||
2881 | |||
2882 | int now = Util.EnvironmentTickCount(); | ||
2883 | if(Util.EnvironmentTickCountSubtract(now,LastColSoundSentTime) <200) | ||
2884 | return; | ||
2885 | |||
2886 | LastColSoundSentTime = now; | ||
2887 | |||
2888 | UUID ownerID = OwnerID; | ||
2889 | UUID objectID = ParentGroup.RootPart.UUID; | ||
2890 | UUID parentID = ParentGroup.UUID; | ||
2891 | ulong regionHandle = ParentGroup.Scene.RegionInfo.RegionHandle; | ||
2892 | |||
2893 | soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, 0 ); | ||
2894 | } | ||
2895 | |||
2867 | public void PhysicsOutOfBounds(Vector3 pos) | 2896 | public void PhysicsOutOfBounds(Vector3 pos) |
2868 | { | 2897 | { |
2869 | m_log.Error("[PHYSICS]: Physical Object went out of bounds."); | 2898 | m_log.Error("[PHYSICS]: Physical Object went out of bounds."); |
@@ -2895,38 +2924,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2895 | ScheduleTerseUpdate(); | 2924 | ScheduleTerseUpdate(); |
2896 | } | 2925 | } |
2897 | 2926 | ||
2898 | public void PreloadSound(string sound) | ||
2899 | { | ||
2900 | // UUID ownerID = OwnerID; | ||
2901 | UUID objectID = ParentGroup.RootPart.UUID; | ||
2902 | UUID soundID = UUID.Zero; | ||
2903 | |||
2904 | if (!UUID.TryParse(sound, out soundID)) | ||
2905 | { | ||
2906 | //Trys to fetch sound id from prim's inventory. | ||
2907 | //Prim's inventory doesn't support non script items yet | ||
2908 | |||
2909 | TaskInventory.LockItemsForRead(true); | ||
2910 | |||
2911 | foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) | ||
2912 | { | ||
2913 | if (item.Value.Name == sound) | ||
2914 | { | ||
2915 | soundID = item.Value.ItemID; | ||
2916 | break; | ||
2917 | } | ||
2918 | } | ||
2919 | |||
2920 | TaskInventory.LockItemsForRead(false); | ||
2921 | } | ||
2922 | |||
2923 | ParentGroup.Scene.ForEachRootScenePresence(delegate(ScenePresence sp) | ||
2924 | { | ||
2925 | if (!(Util.GetDistanceTo(sp.AbsolutePosition, AbsolutePosition) >= 100)) | ||
2926 | sp.ControllingClient.SendPreLoadSound(objectID, objectID, soundID); | ||
2927 | }); | ||
2928 | } | ||
2929 | |||
2930 | public void RemFlag(PrimFlags flag) | 2927 | public void RemFlag(PrimFlags flag) |
2931 | { | 2928 | { |
2932 | // PrimFlags prevflag = Flags; | 2929 | // PrimFlags prevflag = Flags; |
@@ -2979,17 +2976,20 @@ namespace OpenSim.Region.Framework.Scenes | |||
2979 | /// <param name="scale"></param> | 2976 | /// <param name="scale"></param> |
2980 | public void Resize(Vector3 scale) | 2977 | public void Resize(Vector3 scale) |
2981 | { | 2978 | { |
2982 | scale.X = Math.Min(scale.X, ParentGroup.Scene.m_maxNonphys); | ||
2983 | scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxNonphys); | ||
2984 | scale.Z = Math.Min(scale.Z, ParentGroup.Scene.m_maxNonphys); | ||
2985 | |||
2986 | PhysicsActor pa = PhysActor; | 2979 | PhysicsActor pa = PhysActor; |
2987 | 2980 | ||
2988 | if (pa != null && pa.IsPhysical) | 2981 | if (ParentGroup.Scene != null) |
2989 | { | 2982 | { |
2990 | scale.X = Math.Min(scale.X, ParentGroup.Scene.m_maxPhys); | 2983 | scale.X = Math.Max(ParentGroup.Scene.m_minNonphys, Math.Min(ParentGroup.Scene.m_maxNonphys, scale.X)); |
2991 | scale.Y = Math.Min(scale.Y, ParentGroup.Scene.m_maxPhys); | 2984 | scale.Y = Math.Max(ParentGroup.Scene.m_minNonphys, Math.Min(ParentGroup.Scene.m_maxNonphys, scale.Y)); |
2992 | scale.Z = Math.Min(scale.Z, ParentGroup.Scene.m_maxPhys); | 2985 | scale.Z = Math.Max(ParentGroup.Scene.m_minNonphys, Math.Min(ParentGroup.Scene.m_maxNonphys, scale.Z)); |
2986 | |||
2987 | if (pa != null && pa.IsPhysical) | ||
2988 | { | ||
2989 | scale.X = Math.Max(ParentGroup.Scene.m_minPhys, Math.Min(ParentGroup.Scene.m_maxPhys, scale.X)); | ||
2990 | scale.Y = Math.Max(ParentGroup.Scene.m_minPhys, Math.Min(ParentGroup.Scene.m_maxPhys, scale.Y)); | ||
2991 | scale.Z = Math.Max(ParentGroup.Scene.m_minPhys, Math.Min(ParentGroup.Scene.m_maxPhys, scale.Z)); | ||
2992 | } | ||
2993 | } | 2993 | } |
2994 | 2994 | ||
2995 | // m_log.DebugFormat("[SCENE OBJECT PART]: Resizing {0} {1} to {2}", Name, LocalId, scale); | 2995 | // m_log.DebugFormat("[SCENE OBJECT PART]: Resizing {0} {1} to {2}", Name, LocalId, scale); |
@@ -3086,7 +3086,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3086 | // UUID, Name, TimeStampFull); | 3086 | // UUID, Name, TimeStampFull); |
3087 | 3087 | ||
3088 | if (ParentGroup.Scene != null) | 3088 | if (ParentGroup.Scene != null) |
3089 | ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); | 3089 | ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this, true); |
3090 | } | 3090 | } |
3091 | 3091 | ||
3092 | /// <summary> | 3092 | /// <summary> |
@@ -3120,7 +3120,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
3120 | } | 3120 | } |
3121 | 3121 | ||
3122 | if (ParentGroup.Scene != null) | 3122 | if (ParentGroup.Scene != null) |
3123 | ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this); | 3123 | ParentGroup.Scene.EventManager.TriggerSceneObjectPartUpdated(this, false); |
3124 | } | 3124 | } |
3125 | 3125 | ||
3126 | public void ScriptSetPhysicsStatus(bool UsePhysics) | 3126 | public void ScriptSetPhysicsStatus(bool UsePhysics) |
@@ -3295,126 +3295,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
3295 | } | 3295 | } |
3296 | 3296 | ||
3297 | /// <summary> | 3297 | /// <summary> |
3298 | /// Trigger or play an attached sound in this part's inventory. | ||
3299 | /// </summary> | ||
3300 | /// <param name="sound"></param> | ||
3301 | /// <param name="volume"></param> | ||
3302 | /// <param name="triggered"></param> | ||
3303 | /// <param name="flags"></param> | ||
3304 | public void SendSound(string sound, double volume, bool triggered, byte flags, float radius, bool useMaster, bool isMaster) | ||
3305 | { | ||
3306 | if (volume > 1) | ||
3307 | volume = 1; | ||
3308 | if (volume < 0) | ||
3309 | volume = 0; | ||
3310 | |||
3311 | UUID ownerID = OwnerID; | ||
3312 | UUID objectID = ParentGroup.RootPart.UUID; | ||
3313 | UUID parentID = ParentGroup.UUID; | ||
3314 | |||
3315 | UUID soundID = UUID.Zero; | ||
3316 | Vector3 position = AbsolutePosition; // region local | ||
3317 | ulong regionHandle = ParentGroup.Scene.RegionInfo.RegionHandle; | ||
3318 | |||
3319 | if (!UUID.TryParse(sound, out soundID)) | ||
3320 | { | ||
3321 | // search sound file from inventory | ||
3322 | TaskInventory.LockItemsForRead(true); | ||
3323 | foreach (KeyValuePair<UUID, TaskInventoryItem> item in TaskInventory) | ||
3324 | { | ||
3325 | if (item.Value.Name == sound && item.Value.Type == (int)AssetType.Sound) | ||
3326 | { | ||
3327 | soundID = item.Value.ItemID; | ||
3328 | break; | ||
3329 | } | ||
3330 | } | ||
3331 | TaskInventory.LockItemsForRead(false); | ||
3332 | } | ||
3333 | |||
3334 | if (soundID == UUID.Zero) | ||
3335 | return; | ||
3336 | |||
3337 | ISoundModule soundModule = ParentGroup.Scene.RequestModuleInterface<ISoundModule>(); | ||
3338 | if (soundModule != null) | ||
3339 | { | ||
3340 | if (useMaster) | ||
3341 | { | ||
3342 | if (isMaster) | ||
3343 | { | ||
3344 | if (triggered) | ||
3345 | soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); | ||
3346 | else | ||
3347 | soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); | ||
3348 | ParentGroup.PlaySoundMasterPrim = this; | ||
3349 | ownerID = OwnerID; | ||
3350 | objectID = ParentGroup.RootPart.UUID; | ||
3351 | parentID = ParentGroup.UUID; | ||
3352 | position = AbsolutePosition; // region local | ||
3353 | regionHandle = ParentGroup.Scene.RegionInfo.RegionHandle; | ||
3354 | if (triggered) | ||
3355 | soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); | ||
3356 | else | ||
3357 | soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); | ||
3358 | foreach (SceneObjectPart prim in ParentGroup.PlaySoundSlavePrims) | ||
3359 | { | ||
3360 | ownerID = prim.OwnerID; | ||
3361 | objectID = prim.ParentGroup.RootPart.UUID; | ||
3362 | parentID = prim.ParentGroup.UUID; | ||
3363 | position = prim.AbsolutePosition; // region local | ||
3364 | regionHandle = prim.ParentGroup.Scene.RegionInfo.RegionHandle; | ||
3365 | if (triggered) | ||
3366 | soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); | ||
3367 | else | ||
3368 | soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); | ||
3369 | } | ||
3370 | ParentGroup.PlaySoundSlavePrims.Clear(); | ||
3371 | ParentGroup.PlaySoundMasterPrim = null; | ||
3372 | } | ||
3373 | else | ||
3374 | { | ||
3375 | ParentGroup.PlaySoundSlavePrims.Add(this); | ||
3376 | } | ||
3377 | } | ||
3378 | else | ||
3379 | { | ||
3380 | if (triggered) | ||
3381 | soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, radius); | ||
3382 | else | ||
3383 | soundModule.PlayAttachedSound(soundID, ownerID, objectID, volume, position, flags, radius); | ||
3384 | } | ||
3385 | } | ||
3386 | } | ||
3387 | |||
3388 | public void SendCollisionSound(UUID soundID, double volume, Vector3 position) | ||
3389 | { | ||
3390 | if (soundID == UUID.Zero) | ||
3391 | return; | ||
3392 | |||
3393 | ISoundModule soundModule = ParentGroup.Scene.RequestModuleInterface<ISoundModule>(); | ||
3394 | if (soundModule == null) | ||
3395 | return; | ||
3396 | |||
3397 | if (volume > 1) | ||
3398 | volume = 1; | ||
3399 | if (volume < 0) | ||
3400 | volume = 0; | ||
3401 | |||
3402 | int now = Util.EnvironmentTickCount(); | ||
3403 | if(Util.EnvironmentTickCountSubtract(now,LastColSoundSentTime) <200) | ||
3404 | return; | ||
3405 | |||
3406 | LastColSoundSentTime = now; | ||
3407 | |||
3408 | UUID ownerID = OwnerID; | ||
3409 | UUID objectID = ParentGroup.RootPart.UUID; | ||
3410 | UUID parentID = ParentGroup.UUID; | ||
3411 | ulong regionHandle = ParentGroup.Scene.RegionInfo.RegionHandle; | ||
3412 | |||
3413 | soundModule.TriggerSound(soundID, ownerID, objectID, parentID, volume, position, regionHandle, 0 ); | ||
3414 | } | ||
3415 | |||
3416 | |||
3417 | /// <summary> | ||
3418 | /// Send a terse update to all clients | 3298 | /// Send a terse update to all clients |
3419 | /// </summary> | 3299 | /// </summary> |
3420 | public void SendTerseUpdateToAllClients() | 3300 | public void SendTerseUpdateToAllClients() |
@@ -3575,23 +3455,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
3575 | } | 3455 | } |
3576 | 3456 | ||
3577 | /// <summary> | 3457 | /// <summary> |
3578 | /// Set the color of prim faces | 3458 | /// Set the color & alpha of prim faces |
3579 | /// </summary> | 3459 | /// </summary> |
3580 | /// <param name="color"></param> | ||
3581 | /// <param name="face"></param> | 3460 | /// <param name="face"></param> |
3582 | public void SetFaceColor(Vector3 color, int face) | 3461 | /// <param name="color"></param> |
3462 | /// <param name="alpha"></param> | ||
3463 | public void SetFaceColorAlpha(int face, Vector3 color, double ?alpha) | ||
3583 | { | 3464 | { |
3465 | Vector3 clippedColor = Util.Clip(color, 0.0f, 1.0f); | ||
3466 | float clippedAlpha = alpha.HasValue ? | ||
3467 | Util.Clip((float)alpha.Value, 0.0f, 1.0f) : 0; | ||
3468 | |||
3584 | // The only way to get a deep copy/ If we don't do this, we can | 3469 | // The only way to get a deep copy/ If we don't do this, we can |
3585 | // mever detect color changes further down. | 3470 | // never detect color changes further down. |
3586 | Byte[] buf = Shape.Textures.GetBytes(); | 3471 | Byte[] buf = Shape.Textures.GetBytes(); |
3587 | Primitive.TextureEntry tex = new Primitive.TextureEntry(buf, 0, buf.Length); | 3472 | Primitive.TextureEntry tex = new Primitive.TextureEntry(buf, 0, buf.Length); |
3588 | Color4 texcolor; | 3473 | Color4 texcolor; |
3589 | if (face >= 0 && face < GetNumberOfSides()) | 3474 | if (face >= 0 && face < GetNumberOfSides()) |
3590 | { | 3475 | { |
3591 | texcolor = tex.CreateFace((uint)face).RGBA; | 3476 | texcolor = tex.CreateFace((uint)face).RGBA; |
3592 | texcolor.R = Util.Clip((float)color.X, 0.0f, 1.0f); | 3477 | texcolor.R = clippedColor.X; |
3593 | texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f); | 3478 | texcolor.G = clippedColor.Y; |
3594 | texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); | 3479 | texcolor.B = clippedColor.Z; |
3480 | if (alpha.HasValue) | ||
3481 | { | ||
3482 | texcolor.A = clippedAlpha; | ||
3483 | } | ||
3595 | tex.FaceTextures[face].RGBA = texcolor; | 3484 | tex.FaceTextures[face].RGBA = texcolor; |
3596 | UpdateTextureEntry(tex.GetBytes()); | 3485 | UpdateTextureEntry(tex.GetBytes()); |
3597 | return; | 3486 | return; |
@@ -3603,15 +3492,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
3603 | if (tex.FaceTextures[i] != null) | 3492 | if (tex.FaceTextures[i] != null) |
3604 | { | 3493 | { |
3605 | texcolor = tex.FaceTextures[i].RGBA; | 3494 | texcolor = tex.FaceTextures[i].RGBA; |
3606 | texcolor.R = Util.Clip((float)color.X, 0.0f, 1.0f); | 3495 | texcolor.R = clippedColor.X; |
3607 | texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f); | 3496 | texcolor.G = clippedColor.Y; |
3608 | texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); | 3497 | texcolor.B = clippedColor.Z; |
3498 | if (alpha.HasValue) | ||
3499 | { | ||
3500 | texcolor.A = clippedAlpha; | ||
3501 | } | ||
3609 | tex.FaceTextures[i].RGBA = texcolor; | 3502 | tex.FaceTextures[i].RGBA = texcolor; |
3610 | } | 3503 | } |
3611 | texcolor = tex.DefaultTexture.RGBA; | 3504 | texcolor = tex.DefaultTexture.RGBA; |
3612 | texcolor.R = Util.Clip((float)color.X, 0.0f, 1.0f); | 3505 | texcolor.R = clippedColor.X; |
3613 | texcolor.G = Util.Clip((float)color.Y, 0.0f, 1.0f); | 3506 | texcolor.G = clippedColor.Y; |
3614 | texcolor.B = Util.Clip((float)color.Z, 0.0f, 1.0f); | 3507 | texcolor.B = clippedColor.Z; |
3508 | if (alpha.HasValue) | ||
3509 | { | ||
3510 | texcolor.A = clippedAlpha; | ||
3511 | } | ||
3615 | tex.DefaultTexture.RGBA = texcolor; | 3512 | tex.DefaultTexture.RGBA = texcolor; |
3616 | } | 3513 | } |
3617 | UpdateTextureEntry(tex.GetBytes()); | 3514 | UpdateTextureEntry(tex.GetBytes()); |
@@ -4899,6 +4796,57 @@ namespace OpenSim.Region.Framework.Scenes | |||
4899 | ScheduleFullUpdate(); | 4796 | ScheduleFullUpdate(); |
4900 | } | 4797 | } |
4901 | 4798 | ||
4799 | public void UpdateSlice(float begin, float end) | ||
4800 | { | ||
4801 | if (end < begin) | ||
4802 | { | ||
4803 | float temp = begin; | ||
4804 | begin = end; | ||
4805 | end = temp; | ||
4806 | } | ||
4807 | end = Math.Min(1f, Math.Max(0f, end)); | ||
4808 | begin = Math.Min(Math.Min(1f, Math.Max(0f, begin)), end - 0.02f); | ||
4809 | if (begin < 0.02f && end < 0.02f) | ||
4810 | { | ||
4811 | begin = 0f; | ||
4812 | end = 0.02f; | ||
4813 | } | ||
4814 | |||
4815 | ushort uBegin = (ushort)(50000.0 * begin); | ||
4816 | ushort uEnd = (ushort)(50000.0 * (1f - end)); | ||
4817 | bool updatePossiblyNeeded = false; | ||
4818 | PrimType primType = GetPrimType(); | ||
4819 | if (primType == PrimType.SPHERE || primType == PrimType.TORUS || primType == PrimType.TUBE || primType == PrimType.RING) | ||
4820 | { | ||
4821 | if (m_shape.ProfileBegin != uBegin || m_shape.ProfileEnd != uEnd) | ||
4822 | { | ||
4823 | m_shape.ProfileBegin = uBegin; | ||
4824 | m_shape.ProfileEnd = uEnd; | ||
4825 | updatePossiblyNeeded = true; | ||
4826 | } | ||
4827 | } | ||
4828 | else if (m_shape.PathBegin != uBegin || m_shape.PathEnd != uEnd) | ||
4829 | { | ||
4830 | m_shape.PathBegin = uBegin; | ||
4831 | m_shape.PathEnd = uEnd; | ||
4832 | updatePossiblyNeeded = true; | ||
4833 | } | ||
4834 | |||
4835 | if (updatePossiblyNeeded && ParentGroup != null) | ||
4836 | { | ||
4837 | ParentGroup.HasGroupChanged = true; | ||
4838 | } | ||
4839 | if (updatePossiblyNeeded && PhysActor != null) | ||
4840 | { | ||
4841 | PhysActor.Shape = m_shape; | ||
4842 | ParentGroup.Scene.PhysicsScene.AddPhysicsActorTaint(PhysActor); | ||
4843 | } | ||
4844 | if (updatePossiblyNeeded) | ||
4845 | { | ||
4846 | ScheduleFullUpdate(); | ||
4847 | } | ||
4848 | } | ||
4849 | |||
4902 | /// <summary> | 4850 | /// <summary> |
4903 | /// If the part is a sculpt/mesh, retrieve the mesh data and reinsert it into the shape so that the physics | 4851 | /// If the part is a sculpt/mesh, retrieve the mesh data and reinsert it into the shape so that the physics |
4904 | /// engine can use it. | 4852 | /// engine can use it. |