--- trunk/ModularRex/RexParts/ModrexObjects.cs 2009/02/11 08:15:15 65 +++ trunk/ModularRex/RexParts/ModrexObjects.cs 2010/01/20 11:43:30 323 @@ -9,12 +9,13 @@ using OpenMetaverse; using OpenSim.Region.Framework.Interfaces; using OpenSim.Region.Framework.Scenes; -using OpenSim.Data.NHibernate; using OpenSim.Framework; +using ModularRex.NHibernate; +using OpenSim.Framework.Communications.Cache; namespace ModularRex.RexParts { - public class ModrexObjects : IRegionModule, IRexObjectPropertiesEventManager + public class ModrexObjects : IRegionModule, IRexObjectPropertiesEventManager, IModrexObjectsProvider { private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); @@ -32,10 +33,13 @@ { m_scenes.Add(scene); + scene.RegisterModuleInterface(this); + scene.RegisterModuleInterface(this); scene.EventManager.OnClientConnect += EventManager_OnClientConnect; - scene.m_sceneGraph.OnObjectDuplicate += SceneGraph_OnObjectDuplicate; - scene.m_sceneGraph.OnObjectRemove += SceneGraph_OnObjectRemove; + scene.SceneContents.OnObjectDuplicate += SceneGraph_OnObjectDuplicate; + scene.SceneContents.OnObjectRemove += SceneGraph_OnObjectRemove; + scene.AddCommand(this, "modreximport", "load 0.4 rex database ", "conn string example: SQLiteDialect;SQLite20Driver;Data Source=beneath_the_waves.db;Version=3", HandleLoadRexLegacyData); if (m_db == null) { @@ -63,14 +67,60 @@ void EventManager_OnClientConnect(OpenSim.Framework.Client.IClientCore client) { - RexClientView rcv; + RexClientViewBase rcv; if (client.TryGet(out rcv)) { rcv.OnRexObjectProperties += rcv_OnRexObjectProperties; + rcv.OnPrimFreeData += rcv_OnPrimFreeData; //rcv.OnChatFromClient += rcv_OnChatFromClient; // Send them the current Scene. SendAllPropertiesToUser(rcv); + } + } + + private void rcv_OnPrimFreeData(IClientAPI sender, List parameters) + { + m_log.Info("[REXOBJS] Received Prim free data"); + if (parameters.Count >= 2) + { + UUID primID = new UUID(parameters[0]); + string data = String.Empty; + if(parameters.Count == 2) + { + data = parameters[1]; + }else + { + for (int i = 1; i < parameters.Count; i++) + { + data += parameters[i]; + } + } + + RexObjectProperties props = GetObject(primID); + props.RexData = data; + + SendPrimFreeDataToAllUsers(primID, data); + } + else + { + m_log.Warn("[REXOBJS] unexpected number of parameters"); + } + } + + void SendPrimFreeDataToAllUsers(UUID id, string data) + { + foreach (Scene scene in m_scenes) + { + scene.ForEachScenePresence( + delegate(ScenePresence avatar) + { + RexClientViewBase rex; + if (avatar.ClientView.TryGet(out rex)) + { + rex.SendRexPrimFreeData(id, data); + } + }); } } @@ -110,7 +160,7 @@ scene.ForEachScenePresence( delegate(ScenePresence avatar) { - RexClientView rex; + RexClientViewBase rex; if (avatar.ClientView.TryGet(out rex)) { rex.SendRexObjectProperties(id,props); @@ -119,15 +169,50 @@ } } - void SendAllPropertiesToUser(RexClientView user) + private void SendPreloadAssetsToUser(RexClientViewBase user) { + try + { + Scene ourScene = null; + foreach (Scene s in m_scenes) + { + if (user.Scene.RegionInfo.RegionHandle == s.RegionInfo.RegionHandle) + ourScene = s; + } + + if (ourScene != null) + { + if (ourScene.Modules.ContainsKey("RexAssetPreload")) + { + RexAssetPreload module = (RexAssetPreload)ourScene.Modules["RexAssetPreload"]; + if (module.PreloadAssetDictionary.Count > 0) + { + user.SendRexPreloadAssets(module.PreloadAssetDictionary); + } + } + } + } + catch (Exception e) + { + m_log.Error("[MODREXOBJECTS]: Sending preload assets failed.", e); + } + } + + void SendAllPropertiesToUser(RexClientViewBase user) + { + SendPreloadAssetsToUser(user); + foreach (RexObjectProperties p in GetObjects()) { user.SendRexObjectProperties(p.ParentObjectID, p); + if (p.RexData.Length > 0) //send rex data also if exists + { + user.SendRexPrimFreeData(p.ParentObjectID, p.RexData); + } } } - void rcv_OnRexObjectProperties(RexClientView sender, UUID id, RexObjectProperties props) + void rcv_OnRexObjectProperties(IClientAPI sender, UUID id, RexObjectProperties props) { m_log.Info("[REXOBJS] Received RexObjData for " + id); if (props.ParentObjectID == UUID.Zero) @@ -182,7 +267,17 @@ // return; RexObjectProperties p = GetObject(id); - SceneObjectPart sop = m_scenes[0].GetSceneObjectPart(id); + SceneObjectPart sop = null;// = m_scenes[0].GetSceneObjectPart(id); + foreach (Scene scene in m_scenes) + { + SceneObjectPart part = scene.GetSceneObjectPart(id); + if (part != null) + { + sop = part; + break; + } + } + if (sop == null) { m_log.Error("[REXOBJS] TriggerOnChangeCollisionMesh, no SceneObjectPart for id:" + id.ToString()); @@ -223,8 +318,10 @@ { RexObjectProperties props = GetObject(id); - m_db.StoreObject(props); + //instead of saving right away, set timer to save after a sec. + //m_db.StoreObject(props); SendPropertiesToAllUsers(id,props); + props.ScheduleSave(); } public void TriggerOnChangeRexObjectMetaData(UUID id) @@ -244,7 +341,17 @@ // return; RexObjectProperties p = GetObject(id); - SceneObjectPart sop = m_scenes[0].GetSceneObjectPart(id); + SceneObjectPart sop = null;// m_scenes[0].GetSceneObjectPart(id); + foreach (Scene s in m_scenes) + { + SceneObjectPart part = s.GetSceneObjectPart(id); + if (part != null) + { + sop = part; + break; + } + } + if (sop == null) { m_log.Error("[REXOBJS] RexUpdateCollisionMesh, no SceneObjectPart for id:" + id.ToString()); @@ -253,23 +360,30 @@ if (p.RexCollisionMeshUUID != UUID.Zero && sop.PhysActor is IRexPhysicsActor) { - AssetBase tempmodel = sop.ParentGroup.Scene.AssetCache.GetAsset(p.RexCollisionMeshUUID, false); + AssetBase tempmodel = sop.ParentGroup.Scene.AssetService.Get(p.RexCollisionMeshUUID.ToString()); if (tempmodel != null) - ((IRexPhysicsActor)sop.PhysActor).SetCollisionMesh(tempmodel.Data, tempmodel.Metadata.Name, p.RexScaleToPrim); + ((IRexPhysicsActor)sop.PhysActor).SetCollisionMesh(tempmodel.Data, tempmodel.Name, p.RexScaleToPrim); } } public byte GetAssetType(UUID assetid) { - AssetBase tempmodel = m_scenes[0].AssetCache.GetAsset(assetid, true); + AssetBase tempmodel = m_scenes[0].AssetService.Get(assetid.ToString()); if (tempmodel == null) - m_scenes[0].AssetCache.GetAsset(assetid, false); + m_scenes[0].AssetService.Get(assetid.ToString()); if (tempmodel != null) - return(byte)(tempmodel.Metadata.Type); + return(byte)(tempmodel.Type); else return 0; } + + + public void TriggerOnSaveObject(UUID id) + { + RexObjectProperties props = GetObject(id); + m_db.StoreObject(props); + } #endregion @@ -322,7 +436,13 @@ RexObjectProperties props = RexObjectPropertiesCache[id]; if (props == null) { - props = new RexObjectProperties(id, this); + //Objects that are not in the scene can't be found from cache. + //So before we create new properties, we try to find them from db + props = m_db.LoadObject(id); + if (props == null) + { + props = new RexObjectProperties(id, this); + } RexObjectPropertiesCache.Add(id, props); } return props; @@ -344,8 +464,38 @@ return false; } - #endregion + + public void HandleLoadRexLegacyData(string module, string[] args) + { + NHibernateRexLegacyData legacydata = new NHibernateRexLegacyData(); + + legacydata.Initialise(args[1]); + if(!legacydata.Inizialized) + { + m_log.Info("[MODREXOBJECTS]: Legacy database failed to initialize."); + return; + } + + List rexprimdata = legacydata.LoadAllRexPrimData(); + m_log.Info("[MODREXOBJECTS]: Legacy rexprimdata objects loaded:" + rexprimdata.Count.ToString()); + + List rexprimmaterialdata = legacydata.LoadAllRexPrimMaterialData(); + m_log.Info("[MODREXOBJECTS]: Legacy rexprimmaterialdata objects loaded:" + rexprimmaterialdata.Count.ToString()); + + foreach (RexLegacyPrimData prim in rexprimdata) + { + RexObjectProperties p = GetObject(prim.UUID); + p.SetRexPrimDataFromLegacyData(prim); + } + + foreach (RexLegacyPrimMaterialData primmat in rexprimmaterialdata) + { + RexObjectProperties p = GetObject(primmat.UUID); + p.RexMaterials.AddMaterial((uint)primmat.MaterialIndex,primmat.MaterialUUID); + } + } + } }