store kfm on inventory. this may still be a bit confusing on rez

0.9.0-post-fixes
UbitUmarov 2017-07-16 05:19:27 +01:00
parent 04b97be71e
commit 9ae26fc5af
5 changed files with 42 additions and 11 deletions

View File

@ -412,7 +412,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>(); Dictionary<UUID, Vector3> originalPositions = new Dictionary<UUID, Vector3>();
Dictionary<UUID, Quaternion> originalRotations = new Dictionary<UUID, Quaternion>(); Dictionary<UUID, Quaternion> originalRotations = new Dictionary<UUID, Quaternion>();
// this possible is not needed if keyframes are saved // this possible is not needed if keyframes are saved
Dictionary<UUID, KeyframeMotion> originalKeyframes = new Dictionary<UUID, KeyframeMotion>(); // Dictionary<UUID, KeyframeMotion> originalKeyframes = new Dictionary<UUID, KeyframeMotion>();
foreach (SceneObjectGroup objectGroup in objlist) foreach (SceneObjectGroup objectGroup in objlist)
{ {
@ -423,8 +423,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
objectGroup.RootPart.SetForce(Vector3.Zero); objectGroup.RootPart.SetForce(Vector3.Zero);
objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false); objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false);
originalKeyframes[objectGroup.UUID] = objectGroup.RootPart.KeyframeMotion; // originalKeyframes[objectGroup.UUID] = objectGroup.RootPart.KeyframeMotion;
objectGroup.RootPart.KeyframeMotion = null; // objectGroup.RootPart.KeyframeMotion = null;
Vector3 inventoryStoredPosition = objectGroup.AbsolutePosition; Vector3 inventoryStoredPosition = objectGroup.AbsolutePosition;
originalPositions[objectGroup.UUID] = inventoryStoredPosition; originalPositions[objectGroup.UUID] = inventoryStoredPosition;
@ -476,7 +476,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
{ {
objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID]; objectGroup.AbsolutePosition = originalPositions[objectGroup.UUID];
objectGroup.RootPart.RotationOffset = originalRotations[objectGroup.UUID]; objectGroup.RootPart.RotationOffset = originalRotations[objectGroup.UUID];
objectGroup.RootPart.KeyframeMotion = originalKeyframes[objectGroup.UUID]; // objectGroup.RootPart.KeyframeMotion = originalKeyframes[objectGroup.UUID];
if (objectGroup.RootPart.KeyframeMotion != null) if (objectGroup.RootPart.KeyframeMotion != null)
objectGroup.RootPart.KeyframeMotion.Resume(); objectGroup.RootPart.KeyframeMotion.Resume();
} }
@ -989,11 +989,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
// one full update during the attachment // one full update during the attachment
// process causes some clients to fail to display the // process causes some clients to fail to display the
// attachment properly. // attachment properly.
m_Scene.AddNewSceneObject(group, true, false);
if (!attachment) if (!attachment)
{ {
group.AbsolutePosition = pos + veclist[i]; group.AbsolutePosition = pos + veclist[i];
m_Scene.AddNewSceneObject(group, true, false);
// Fire on_rez // Fire on_rez
group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1); group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 1);
@ -1001,6 +1001,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
group.ScheduleGroupForFullUpdate(); group.ScheduleGroupForFullUpdate();
} }
else
m_Scene.AddNewSceneObject(group, true, false);
// m_log.DebugFormat( // m_log.DebugFormat(
// "[INVENTORY ACCESS MODULE]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", // "[INVENTORY ACCESS MODULE]: Rezzed {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}",

View File

@ -755,7 +755,8 @@ namespace OpenSim.Region.Framework.Scenes
} }
else else
{ {
bool lastSteps = remainingSteps < 4; // bool lastSteps = remainingSteps < 4;
Vector3 currentPosition = m_group.AbsolutePosition; Vector3 currentPosition = m_group.AbsolutePosition;
Vector3 motionThisFrame = (Vector3)m_currentFrame.Position - currentPosition; Vector3 motionThisFrame = (Vector3)m_currentFrame.Position - currentPosition;
motionThisFrame /= (float)remainingSteps; motionThisFrame /= (float)remainingSteps;
@ -776,13 +777,13 @@ namespace OpenSim.Region.Framework.Scenes
} }
m_group.AbsolutePosition = m_nextPosition; m_group.AbsolutePosition = m_nextPosition;
if(lastSteps) // if(lastSteps)
m_group.RootPart.Velocity = Vector3.Zero; // m_group.RootPart.Velocity = Vector3.Zero;
else // else
m_group.RootPart.Velocity = m_currentVel; m_group.RootPart.Velocity = m_currentVel;
if(!update && ( if(!update && (
lastSteps || // lastSteps ||
m_skippedUpdates * tickDuration > 0.5 || m_skippedUpdates * tickDuration > 0.5 ||
Math.Abs(m_nextPosition.X - currentPosition.X) > 5f || Math.Abs(m_nextPosition.X - currentPosition.X) > 5f ||
Math.Abs(m_nextPosition.Y - currentPosition.Y) > 5f || Math.Abs(m_nextPosition.Y - currentPosition.Y) > 5f ||

View File

@ -1651,10 +1651,11 @@ namespace OpenSim.Region.Framework.Scenes
physicsMS2 = (float)(tmpMS2 - tmpMS); physicsMS2 = (float)(tmpMS2 - tmpMS);
tmpMS = tmpMS2; tmpMS = tmpMS2;
/*
// Apply any pending avatar force input to the avatar's velocity // Apply any pending avatar force input to the avatar's velocity
if (Frame % m_update_entitymovement == 0) if (Frame % m_update_entitymovement == 0)
m_sceneGraph.UpdateScenePresenceMovement(); m_sceneGraph.UpdateScenePresenceMovement();
*/
if (Frame % (m_update_coarse_locations) == 0 && !m_sendingCoarseLocations) if (Frame % (m_update_coarse_locations) == 0 && !m_sendingCoarseLocations)
{ {
m_sendingCoarseLocations = true; m_sendingCoarseLocations = true;

View File

@ -657,6 +657,9 @@ namespace OpenSim.Region.Framework.Scenes
} }
} }
if(!m_scene.IsRunning)
return sog;
if (root.KeyframeMotion != null) if (root.KeyframeMotion != null)
root.KeyframeMotion.StartCrossingCheck(); root.KeyframeMotion.StartCrossingCheck();

View File

@ -112,9 +112,22 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
while (reader.ReadToNextSibling("Part")); while (reader.ReadToNextSibling("Part"));
} }
reader.ReadEndElement();
if (reader.Name == "KeyframeMotion" && reader.NodeType == XmlNodeType.Element)
{
string innerkeytxt = reader.ReadElementContentAsString();
sceneObject.RootPart.KeyframeMotion =
KeyframeMotion.FromData(sceneObject, Convert.FromBase64String(innerkeytxt));
}
else
sceneObject.RootPart.KeyframeMotion = null;
// Script state may, or may not, exist. Not having any, is NOT // Script state may, or may not, exist. Not having any, is NOT
// ever a problem. // ever a problem.
sceneObject.LoadScriptState(reader); sceneObject.LoadScriptState(reader);
sceneObject.InvalidateDeepEffectivePerms(); sceneObject.InvalidateDeepEffectivePerms();
return sceneObject; return sceneObject;
} }
@ -211,9 +224,19 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
writer.WriteEndElement(); // OtherParts writer.WriteEndElement(); // OtherParts
if (sceneObject.RootPart.KeyframeMotion != null)
{
Byte[] data = sceneObject.RootPart.KeyframeMotion.Serialize();
writer.WriteStartElement(String.Empty, "KeyframeMotion", String.Empty);
writer.WriteBase64(data, 0, data.Length);
writer.WriteEndElement();
}
if (doScriptStates) if (doScriptStates)
sceneObject.SaveScriptedState(writer); sceneObject.SaveScriptedState(writer);
if (!noRootElement) if (!noRootElement)
writer.WriteEndElement(); // SceneObjectGroup writer.WriteEndElement(); // SceneObjectGroup