diff options
Diffstat (limited to 'OpenSim')
3 files changed, 191 insertions, 2 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index ebefdce..eafb882 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs | |||
@@ -2012,6 +2012,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
2012 | // If we have children | 2012 | // If we have children |
2013 | lock (m_parts) | 2013 | lock (m_parts) |
2014 | { | 2014 | { |
2015 | foreach (SceneObjectPart parts in m_parts.Values) | ||
2016 | { | ||
2017 | if(part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0) | ||
2018 | { | ||
2019 | data[47] = 0; // Reset physics | ||
2020 | break; | ||
2021 | } | ||
2022 | } | ||
2023 | |||
2015 | if (m_parts.Count > 1) | 2024 | if (m_parts.Count > 1) |
2016 | { | 2025 | { |
2017 | foreach (SceneObjectPart parts in m_parts.Values) | 2026 | foreach (SceneObjectPart parts in m_parts.Values) |
@@ -2100,12 +2109,28 @@ namespace OpenSim.Region.Environment.Scenes | |||
2100 | /// <param name="localID"></param> | 2109 | /// <param name="localID"></param> |
2101 | public void Resize(LLVector3 scale, uint localID) | 2110 | public void Resize(LLVector3 scale, uint localID) |
2102 | { | 2111 | { |
2112 | if(scale.X > 65536.0f) | ||
2113 | scale.X = 65536.0f; | ||
2114 | if(scale.Y > 65536.0f) | ||
2115 | scale.Y = 65536.0f; | ||
2116 | if(scale.Z > 65536.0f) | ||
2117 | scale.Z = 65536.0f; | ||
2118 | |||
2103 | SceneObjectPart part = GetChildPart(localID); | 2119 | SceneObjectPart part = GetChildPart(localID); |
2104 | if (part != null) | 2120 | if (part != null) |
2105 | { | 2121 | { |
2106 | part.Resize(scale); | 2122 | part.Resize(scale); |
2107 | if (part.PhysActor != null) | 2123 | if (part.PhysActor != null) |
2108 | { | 2124 | { |
2125 | if(part.PhysActor.IsPhysical) | ||
2126 | { | ||
2127 | if(scale.X > 10.0f) | ||
2128 | scale.X = 10.0f; | ||
2129 | if(scale.Y > 10.0f) | ||
2130 | scale.Y = 10.0f; | ||
2131 | if(scale.Z > 10.0f) | ||
2132 | scale.Z = 10.0f; | ||
2133 | } | ||
2109 | part.PhysActor.Size = | 2134 | part.PhysActor.Size = |
2110 | new PhysicsVector(scale.X, scale.Y, scale.Z); | 2135 | new PhysicsVector(scale.X, scale.Y, scale.Z); |
2111 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 2136 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); |
@@ -2132,10 +2157,102 @@ namespace OpenSim.Region.Environment.Scenes | |||
2132 | SceneObjectPart part = GetChildPart(localID); | 2157 | SceneObjectPart part = GetChildPart(localID); |
2133 | if (part != null) | 2158 | if (part != null) |
2134 | { | 2159 | { |
2160 | if(scale.X > 65536.0f) | ||
2161 | scale.X = 65536.0f; | ||
2162 | if(scale.Y > 65536.0f) | ||
2163 | scale.Y = 65536.0f; | ||
2164 | if(scale.Z > 65536.0f) | ||
2165 | scale.Z = 65536.0f; | ||
2166 | if(part.PhysActor != null && part.PhysActor.IsPhysical) | ||
2167 | { | ||
2168 | if(scale.X > 10.0f) | ||
2169 | scale.X = 10.0f; | ||
2170 | if(scale.Y > 10.0f) | ||
2171 | scale.Y = 10.0f; | ||
2172 | if(scale.Z > 10.0f) | ||
2173 | scale.Z = 10.0f; | ||
2174 | } | ||
2135 | float x = (scale.X / part.Scale.X); | 2175 | float x = (scale.X / part.Scale.X); |
2136 | float y = (scale.Y / part.Scale.Y); | 2176 | float y = (scale.Y / part.Scale.Y); |
2137 | float z = (scale.Z / part.Scale.Z); | 2177 | float z = (scale.Z / part.Scale.Z); |
2138 | part.Resize(scale); | 2178 | |
2179 | lock (m_parts) | ||
2180 | { | ||
2181 | if(x > 1.0f || y > 1.0f || z > 1.0f) | ||
2182 | { | ||
2183 | foreach (SceneObjectPart obPart in m_parts.Values) | ||
2184 | { | ||
2185 | if (obPart.UUID != m_rootPart.UUID) | ||
2186 | { | ||
2187 | LLVector3 oldSize = new LLVector3(obPart.Scale); | ||
2188 | |||
2189 | float f = 1.0f; | ||
2190 | float a = 1.0f; | ||
2191 | |||
2192 | if(part.PhysActor != null && part.PhysActor.IsPhysical) | ||
2193 | { | ||
2194 | if(oldSize.X*x > 10.0f) | ||
2195 | { | ||
2196 | f = 10.0f / oldSize.X; | ||
2197 | a = f / x; | ||
2198 | x *= a; | ||
2199 | y *= a; | ||
2200 | z *= a; | ||
2201 | } | ||
2202 | if(oldSize.Y*y > 10.0f) | ||
2203 | { | ||
2204 | f = 10.0f / oldSize.Y; | ||
2205 | a = f / y; | ||
2206 | x *= a; | ||
2207 | y *= a; | ||
2208 | z *= a; | ||
2209 | } | ||
2210 | if(oldSize.Z*z > 10.0f) | ||
2211 | { | ||
2212 | f = 10.0f / oldSize.Z; | ||
2213 | a = f / z; | ||
2214 | x *= a; | ||
2215 | y *= a; | ||
2216 | z *= a; | ||
2217 | } | ||
2218 | } | ||
2219 | else | ||
2220 | { | ||
2221 | if(oldSize.X*x > 65536.0f) | ||
2222 | { | ||
2223 | f = 65536.0f / oldSize.X; | ||
2224 | a = f / x; | ||
2225 | x *= a; | ||
2226 | y *= a; | ||
2227 | z *= a; | ||
2228 | } | ||
2229 | if(oldSize.Y*y > 65536.0f) | ||
2230 | { | ||
2231 | f = 65536.0f / oldSize.Y; | ||
2232 | a = f / y; | ||
2233 | x *= a; | ||
2234 | y *= a; | ||
2235 | z *= a; | ||
2236 | } | ||
2237 | if(oldSize.Z*z > 65536.0f) | ||
2238 | { | ||
2239 | f = 65536.0f / oldSize.Z; | ||
2240 | a = f / z; | ||
2241 | x *= a; | ||
2242 | y *= a; | ||
2243 | z *= a; | ||
2244 | } | ||
2245 | } | ||
2246 | } | ||
2247 | } | ||
2248 | } | ||
2249 | } | ||
2250 | |||
2251 | LLVector3 prevScale = part.Scale; | ||
2252 | prevScale.X *= x; | ||
2253 | prevScale.Y *= y; | ||
2254 | prevScale.Z *= z; | ||
2255 | part.Resize(prevScale); | ||
2139 | 2256 | ||
2140 | lock (m_parts) | 2257 | lock (m_parts) |
2141 | { | 2258 | { |
@@ -2160,7 +2277,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
2160 | if (part.PhysActor != null) | 2277 | if (part.PhysActor != null) |
2161 | { | 2278 | { |
2162 | part.PhysActor.Size = | 2279 | part.PhysActor.Size = |
2163 | new PhysicsVector(scale.X, scale.Y, scale.Z); | 2280 | new PhysicsVector(prevScale.X, prevScale.Y, prevScale.Z); |
2164 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); | 2281 | m_scene.PhysicsScene.AddPhysicsActorTaint(part.PhysActor); |
2165 | } | 2282 | } |
2166 | 2283 | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 2b986be..2538246 100644 --- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -831,7 +831,24 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
831 | if ((status & BuiltIn_Commands_BaseClass.STATUS_PHYSICS) == BuiltIn_Commands_BaseClass.STATUS_PHYSICS) | 831 | if ((status & BuiltIn_Commands_BaseClass.STATUS_PHYSICS) == BuiltIn_Commands_BaseClass.STATUS_PHYSICS) |
832 | { | 832 | { |
833 | if (value == 1) | 833 | if (value == 1) |
834 | { | ||
835 | SceneObjectGroup group = m_host.ParentGroup; | ||
836 | if(group == null) | ||
837 | return; | ||
838 | bool allow = true; | ||
839 | foreach(SceneObjectPart part in group.Children.Values) | ||
840 | { | ||
841 | if(part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0) | ||
842 | { | ||
843 | allow = false; | ||
844 | break; | ||
845 | } | ||
846 | } | ||
847 | |||
848 | if(!allow) | ||
849 | return; | ||
834 | m_host.ScriptSetPhysicsStatus(true); | 850 | m_host.ScriptSetPhysicsStatus(true); |
851 | } | ||
835 | else | 852 | else |
836 | m_host.ScriptSetPhysicsStatus(false); | 853 | m_host.ScriptSetPhysicsStatus(false); |
837 | 854 | ||
@@ -948,6 +965,25 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
948 | private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale) | 965 | private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale) |
949 | { | 966 | { |
950 | // TODO: this needs to trigger a persistance save as well | 967 | // TODO: this needs to trigger a persistance save as well |
968 | |||
969 | if(part == null || part.ParentGroup == null || part.ParentGroup.RootPart == null) | ||
970 | return; | ||
971 | |||
972 | if(part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical) | ||
973 | { | ||
974 | if(scale.x > 10.0) | ||
975 | scale.x = 10.0; | ||
976 | if(scale.y > 10.0) | ||
977 | scale.y = 10.0; | ||
978 | if(scale.z > 10.0) | ||
979 | scale.z = 10.0; | ||
980 | } | ||
981 | if(scale.x > 65536.0) | ||
982 | scale.x = 65536.0; | ||
983 | if(scale.y > 65536.0) | ||
984 | scale.y = 65536.0; | ||
985 | if(scale.z > 65536.0) | ||
986 | scale.z = 65536.0; | ||
951 | LLVector3 tmp = part.Scale; | 987 | LLVector3 tmp = part.Scale; |
952 | tmp.X = (float)scale.x; | 988 | tmp.X = (float)scale.x; |
953 | tmp.Y = (float)scale.y; | 989 | tmp.Y = (float)scale.y; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 57f9141..4bf3e93 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -671,7 +671,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
671 | if ((status & ScriptBaseClass.STATUS_PHYSICS) == ScriptBaseClass.STATUS_PHYSICS) | 671 | if ((status & ScriptBaseClass.STATUS_PHYSICS) == ScriptBaseClass.STATUS_PHYSICS) |
672 | { | 672 | { |
673 | if (value == 1) | 673 | if (value == 1) |
674 | { | ||
675 | SceneObjectGroup group = m_host.ParentGroup; | ||
676 | if(group == null) | ||
677 | return; | ||
678 | bool allow = true; | ||
679 | foreach(SceneObjectPart part in group.Children.Values) | ||
680 | { | ||
681 | if(part.Scale.X > 10.0 || part.Scale.Y > 10.0 || part.Scale.Z > 10.0) | ||
682 | { | ||
683 | allow = false; | ||
684 | break; | ||
685 | } | ||
686 | } | ||
687 | |||
688 | if(!allow) | ||
689 | return; | ||
674 | m_host.ScriptSetPhysicsStatus(true); | 690 | m_host.ScriptSetPhysicsStatus(true); |
691 | } | ||
675 | else | 692 | else |
676 | m_host.ScriptSetPhysicsStatus(false); | 693 | m_host.ScriptSetPhysicsStatus(false); |
677 | } | 694 | } |
@@ -802,6 +819,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
802 | private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale) | 819 | private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale) |
803 | { | 820 | { |
804 | // TODO: this needs to trigger a persistance save as well | 821 | // TODO: this needs to trigger a persistance save as well |
822 | |||
823 | if(part == null || part.ParentGroup == null || part.ParentGroup.RootPart == null) | ||
824 | return; | ||
825 | |||
826 | if(part.ParentGroup.RootPart.PhysActor != null && part.ParentGroup.RootPart.PhysActor.IsPhysical) | ||
827 | { | ||
828 | if(scale.x > 10.0) | ||
829 | scale.x = 10.0; | ||
830 | if(scale.y > 10.0) | ||
831 | scale.y = 10.0; | ||
832 | if(scale.z > 10.0) | ||
833 | scale.z = 10.0; | ||
834 | } | ||
835 | if(scale.x > 65536.0) | ||
836 | scale.x = 65536.0; | ||
837 | if(scale.y > 65536.0) | ||
838 | scale.y = 65536.0; | ||
839 | if(scale.z > 65536.0) | ||
840 | scale.z = 65536.0; | ||
805 | LLVector3 tmp = part.Scale; | 841 | LLVector3 tmp = part.Scale; |
806 | tmp.X = (float)scale.x; | 842 | tmp.X = (float)scale.x; |
807 | tmp.Y = (float)scale.y; | 843 | tmp.Y = (float)scale.y; |