diff options
-rw-r--r-- | OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | 58 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 |
3 files changed, 38 insertions, 35 deletions
diff --git a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs index 42e3860..e4e6f2c 100644 --- a/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs +++ b/OpenSim/Region/Framework/Scenes/KeyframeMotion.cs | |||
@@ -112,20 +112,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
112 | public bool Selected | 112 | public bool Selected |
113 | { | 113 | { |
114 | set | 114 | set |
115 | { | 115 | { |
116 | if (!value) | 116 | if (m_group != null) |
117 | { | ||
118 | // Once we're let go, recompute positions | ||
119 | if (m_selected) | ||
120 | UpdateSceneObject(m_group); | ||
121 | } | ||
122 | else | ||
123 | { | 117 | { |
124 | // Save selection position in case we get moved | 118 | if (!value) |
125 | if (!m_selected) | ||
126 | { | 119 | { |
127 | StopTimer(); | 120 | // Once we're let go, recompute positions |
128 | m_serializedPosition = m_group.AbsolutePosition; | 121 | if (m_selected) |
122 | UpdateSceneObject(m_group); | ||
123 | } | ||
124 | else | ||
125 | { | ||
126 | // Save selection position in case we get moved | ||
127 | if (!m_selected) | ||
128 | { | ||
129 | StopTimer(); | ||
130 | m_serializedPosition = m_group.AbsolutePosition; | ||
131 | } | ||
129 | } | 132 | } |
130 | } | 133 | } |
131 | m_isCrossing = false; | 134 | m_isCrossing = false; |
@@ -199,6 +202,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
199 | m_waitingCrossing = false; | 202 | m_waitingCrossing = false; |
200 | StopTimer(); | 203 | StopTimer(); |
201 | 204 | ||
205 | if (grp == null) | ||
206 | return; | ||
207 | |||
202 | m_group = grp; | 208 | m_group = grp; |
203 | Vector3 grppos = grp.AbsolutePosition; | 209 | Vector3 grppos = grp.AbsolutePosition; |
204 | Vector3 offset = grppos - m_serializedPosition; | 210 | Vector3 offset = grppos - m_serializedPosition; |
@@ -228,14 +234,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
228 | m_mode = mode; | 234 | m_mode = mode; |
229 | m_data = data; | 235 | m_data = data; |
230 | 236 | ||
231 | m_onTimerLock = new object(); | ||
232 | |||
233 | m_group = grp; | 237 | m_group = grp; |
234 | if (grp != null) | 238 | if (grp != null) |
235 | { | 239 | { |
236 | m_basePosition = grp.AbsolutePosition; | 240 | m_basePosition = grp.AbsolutePosition; |
237 | m_baseRotation = grp.GroupRotation; | 241 | m_baseRotation = grp.GroupRotation; |
238 | } | 242 | } |
243 | |||
244 | m_onTimerLock = new object(); | ||
245 | m_timerStopped = true; | ||
246 | m_inOnTimer = false; | ||
239 | m_isCrossing = false; | 247 | m_isCrossing = false; |
240 | m_waitingCrossing = false; | 248 | m_waitingCrossing = false; |
241 | } | 249 | } |
@@ -249,18 +257,23 @@ namespace OpenSim.Region.Framework.Scenes | |||
249 | { | 257 | { |
250 | StopTimer(); | 258 | StopTimer(); |
251 | 259 | ||
252 | KeyframeMotion newmotion = new KeyframeMotion(newgrp, m_mode, m_data); | 260 | KeyframeMotion newmotion = new KeyframeMotion(null, m_mode, m_data); |
253 | 261 | ||
254 | if (newgrp != null && newgrp.IsSelected) | 262 | newmotion.m_group = newgrp; |
255 | newmotion.m_selected = true; | ||
256 | 263 | ||
257 | if (m_keyframes != null) | 264 | if (m_keyframes != null) |
265 | { | ||
266 | newmotion.m_keyframes = new Keyframe[m_keyframes.Length]; | ||
258 | m_keyframes.CopyTo(newmotion.m_keyframes, 0); | 267 | m_keyframes.CopyTo(newmotion.m_keyframes, 0); |
268 | } | ||
259 | 269 | ||
260 | newmotion.m_frames = new List<Keyframe>(m_frames); | 270 | newmotion.m_frames = new List<Keyframe>(m_frames); |
271 | |||
272 | newmotion.m_basePosition = m_basePosition; | ||
273 | newmotion.m_baseRotation = m_baseRotation; | ||
274 | |||
261 | newmotion.m_currentFrame = m_currentFrame; | 275 | newmotion.m_currentFrame = m_currentFrame; |
262 | 276 | ||
263 | newmotion.m_nextPosition = m_nextPosition; | ||
264 | if (m_selected) | 277 | if (m_selected) |
265 | newmotion.m_serializedPosition = m_serializedPosition; | 278 | newmotion.m_serializedPosition = m_serializedPosition; |
266 | else | 279 | else |
@@ -272,12 +285,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
272 | } | 285 | } |
273 | 286 | ||
274 | newmotion.m_iterations = m_iterations; | 287 | newmotion.m_iterations = m_iterations; |
275 | 288 | newmotion.m_running = m_running; | |
276 | newmotion.m_onTimerLock = new object(); | ||
277 | newmotion.m_timerStopped = false; | ||
278 | newmotion.m_inOnTimer = false; | ||
279 | newmotion.m_isCrossing = false; | ||
280 | newmotion.m_waitingCrossing = false; | ||
281 | 289 | ||
282 | if (m_running && !m_waitingCrossing) | 290 | if (m_running && !m_waitingCrossing) |
283 | StartTimer(); | 291 | StartTimer(); |
@@ -299,7 +307,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
299 | { | 307 | { |
300 | m_isCrossing = false; | 308 | m_isCrossing = false; |
301 | m_waitingCrossing = false; | 309 | m_waitingCrossing = false; |
302 | if (m_keyframes.Length > 0) | 310 | if (m_keyframes != null && m_group != null && m_keyframes.Length > 0) |
303 | { | 311 | { |
304 | if (m_timer == null) | 312 | if (m_timer == null) |
305 | { | 313 | { |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 834d27b..fe34ad4 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -2062,6 +2062,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2062 | HasGroupChangedDueToDelink = false; | 2062 | HasGroupChangedDueToDelink = false; |
2063 | 2063 | ||
2064 | m_scene.EventManager.TriggerOnSceneObjectPreSave(backup_group, this); | 2064 | m_scene.EventManager.TriggerOnSceneObjectPreSave(backup_group, this); |
2065 | /* | ||
2065 | backup_group.ForEachPart(delegate(SceneObjectPart part) | 2066 | backup_group.ForEachPart(delegate(SceneObjectPart part) |
2066 | { | 2067 | { |
2067 | if (part.KeyframeMotion != null) | 2068 | if (part.KeyframeMotion != null) |
@@ -2070,7 +2071,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2070 | // part.KeyframeMotion.UpdateSceneObject(this); | 2071 | // part.KeyframeMotion.UpdateSceneObject(this); |
2071 | } | 2072 | } |
2072 | }); | 2073 | }); |
2073 | 2074 | */ | |
2074 | datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); | 2075 | datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); |
2075 | 2076 | ||
2076 | backup_group.ForEachPart(delegate(SceneObjectPart part) | 2077 | backup_group.ForEachPart(delegate(SceneObjectPart part) |
@@ -4415,15 +4416,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
4415 | public virtual ISceneObject CloneForNewScene() | 4416 | public virtual ISceneObject CloneForNewScene() |
4416 | { | 4417 | { |
4417 | SceneObjectGroup sog = Copy(false); | 4418 | SceneObjectGroup sog = Copy(false); |
4418 | sog.ForEachPart(delegate(SceneObjectPart part) | ||
4419 | { | ||
4420 | if (part.KeyframeMotion != null) | ||
4421 | { | ||
4422 | part.KeyframeMotion = KeyframeMotion.FromData(sog, part.KeyframeMotion.Serialize()); | ||
4423 | // this is called later | ||
4424 | // part.KeyframeMotion.UpdateSceneObject(this); | ||
4425 | } | ||
4426 | }); | ||
4427 | sog.IsDeleted = false; | 4419 | sog.IsDeleted = false; |
4428 | return sog; | 4420 | return sog; |
4429 | } | 4421 | } |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index bf5fc99..4788a24 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -2110,6 +2110,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2110 | Array.Copy(Shape.ExtraParams, extraP, extraP.Length); | 2110 | Array.Copy(Shape.ExtraParams, extraP, extraP.Length); |
2111 | dupe.Shape.ExtraParams = extraP; | 2111 | dupe.Shape.ExtraParams = extraP; |
2112 | 2112 | ||
2113 | if (KeyframeMotion != null) | ||
2114 | dupe.KeyframeMotion = KeyframeMotion.Copy(null); | ||
2115 | |||
2113 | if (userExposed) | 2116 | if (userExposed) |
2114 | { | 2117 | { |
2115 | if (dupe.m_shape.SculptEntry && dupe.m_shape.SculptTexture != UUID.Zero) | 2118 | if (dupe.m_shape.SculptEntry && dupe.m_shape.SculptTexture != UUID.Zero) |