public AppParameters() { m_defaultParams = new ParameterSet(); m_iniParams = new ParameterSet(); m_userParams = new ParameterSet(); m_overrideParams = new ParameterSet(); AddDefaultParameter("Settings.Directory", Utilities.GetDefaultApplicationStorageDir(null), "Directory that holds the user configuration files"); AddDefaultParameter("Settings.File", "LookingGlass.json", "Persistant settings configuration file"); AddDefaultParameter("Settings.Modules", "Modules.json", "Modules configuration file"); }
// ========================================================================== public override bool AfterAllModulesLoaded() { // allow others to get our statistics m_restHandler = new RestHandler("/stats/" + m_moduleName + "/detailStats", m_stats); #region OGRE STATS // Setup the shared piece of memory that Ogre can place statistics in m_ogreStatsPinned = new int[Ogr.StatSize]; for (int ii = 0; ii < Ogr.StatSize; ii++) m_ogreStatsPinned[ii] = 0; if (ModuleParams.ParamBool("Renderer.Ogre.CollectOgreStats")) { m_ogreStatsHandle = GCHandle.Alloc(m_ogreStatsPinned, GCHandleType.Pinned); Ogr.SetStatsBlock(m_ogreStatsHandle.AddrOfPinnedObject()); // m_ogreStatsPinned = (int[])Marshal.AllocHGlobal(Ogr.StatSize * 4); // Ogr.SetStatsBlock(m_ogreStatsPinned); } // Create a ParameterSet that can be read externally via REST/JSON m_ogreStats = new ParameterSet(); // add an initial parameter that calculates frames per sec m_ogreStats.Add("FramesPerSecond", delegate(string xx) { // Ogre passed the number *1000 so there can be some decimal points float fps = (float)m_ogreStatsPinned[Ogr.StatFramesPerSec] / 1000f; return new OMVSD.OSDString(fps.ToString()); }, "Frames per second" ); m_ogreStats.Add("LastFrameMS", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatLastFrameMs].ToString()); }, "Milliseconds used rendering last frame"); m_ogreStats.Add("TotalFrames", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatTotalFrames].ToString()); }, "Number of frames rendered"); m_ogreStats.Add("VisibleToVisible", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatVisibleToVisible].ToString()); }, "Meshes at were visible that are still visible in last frame"); m_ogreStats.Add("InvisibleToVisible", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatInvisibleToVisible].ToString()); }, "Meshes that were invisible that are now visible in last frame"); m_ogreStats.Add("VisibleToInvisible", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatVisibleToInvisible].ToString()); }, "Meshes that were visible that are now invisible in last frame"); m_ogreStats.Add("InvisibleToInvisible", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatInvisibleToInvisible].ToString()); }, "Meshes that were invisible that are still invisible in last frame"); m_ogreStats.Add("CullMeshesLoaded", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatCullMeshesLoaded].ToString()); }, "Total meshes loaded due to unculling"); m_ogreStats.Add("CullTexturesLoaded", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatCullTexturesLoaded].ToString()); }, "Total textures loaded due to unculling"); m_ogreStats.Add("CullMeshesUnloaded", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatCullMeshesUnloaded].ToString()); }, "Total meshes unloaded due to culling"); m_ogreStats.Add("CullTexturesUnloaded", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatCullTexturesUnloaded].ToString()); }, "Total textures unloaded due to culling"); m_ogreStats.Add("CullMeshesQueuedToLoad", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatCullMeshesQueuedToLoad].ToString()); }, "Meshes currently queued to load due to unculling"); // between frame work m_ogreStats.Add("BetweenFrameworkItems", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameWorkItems].ToString()); }, "Number of between frame work items waiting"); m_ogreStats.Add("BetweenFrameworkDiscardedDups", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameDiscardedDups].ToString()); }, "Between frame work requests which duplicated existing requests"); m_ogreStats.Add("TotalBetweenFrameRefreshResource", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameRefreshResource].ToString()); }, "Number of 'refresh resource' work items queued"); m_ogreStats.Add("TotalBetweenFrameRemoveSceneNode", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameRemoveSceneNode].ToString()); }, "Number of 'remove scene node' work items queued"); m_ogreStats.Add("TotalBetweenFrameCreateMaterialResource", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameCreateMaterialResource].ToString()); }, "Number of 'create material resource' work items queued"); m_ogreStats.Add("TotalBetweenFrameCreateMeshResource", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameCreateMeshResource].ToString()); }, "Number of 'create mesh resource' work items queued"); m_ogreStats.Add("TotalBetweenFrameCreateMeshScenenode", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameCreateMeshSceneNode].ToString()); }, "Number of 'create mesh scene node' work items queued"); m_ogreStats.Add("TotalBetweenFrameAddLoadedMesh", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameAddLoadedMesh].ToString()); }, "Number of 'add loaded mesh' work items queued"); m_ogreStats.Add("TotalBetweenframeupdatescenenode", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameUpdateSceneNode].ToString()); }, "Number of 'update scene node' work items queued"); m_ogreStats.Add("TotalBetweenFrameUnknownProcess", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameUnknownProcess].ToString()); }, "Number of work items with unknow process codes"); m_ogreStats.Add("TotalBetweenFrameTotalProcessed", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatBetweenFrameTotalProcessed].ToString()); }, "Total number of work items actually processed"); // material processing queues m_ogreStats.Add("MaterialUpdatesRemaining", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatMaterialUpdatesRemaining].ToString()); }, "Number of material updates waiting"); // mesh processing queues m_ogreStats.Add("MeshTrackerLoadQueued", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatMeshTrackerLoadQueued].ToString()); }, "Number of mesh loads queued"); m_ogreStats.Add("MeshTrackerUnloadQueued", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatMeshTrackerUnloadQueued].ToString()); }, "Number of mesh unloads queued"); m_ogreStats.Add("MeshTrackerSerializedQueued", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatMeshTrackerSerializedQueued].ToString()); }, "Number of mesh serializations queued"); m_ogreStats.Add("MeshTrackerTotalQueued", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatMeshTrackerTotalQueued].ToString()); }, "Total mesh tracker requests queued"); m_ogreStats.Add("LockParity", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatLockParity].ToString()); }, "Parity of LG locks"); m_ogreStats.Add("RoutineInOut", delegate(string xx) { return new OMVSD.OSDString(m_ogreStatsPinned[Ogr.StatInOut].ToString()); }, "Entry and exit of routines"); // make the values accessable from outside m_ogreStatsHandler = new RestHandler("/stats/" + m_moduleName + "/ogreStats", m_ogreStats); #endregion OGRE STATS // Load the input system we're supposed to be using // The input system is a module tha we get given the name of. Go find it and link it in. String uiModule = ModuleParams.ParamString(m_moduleName + ".Ogre.InputSystem.Name"); if (uiModule != null && uiModule.Length > 0) { try { m_log.Log(LogLevel.DRENDER, "Loading UI processor '{0}'", uiModule); m_userInterface = (IUserInterfaceProvider)ModuleManager.Instance.Module(uiModule); if (m_userInterface == null) { m_log.Log(LogLevel.DBADERROR, "FATAL: Could not find user interface class {0}", uiModule); return false; } } catch (Exception e) { m_log.Log(LogLevel.DBADERROR, "FATAL: Could not load user interface class {0}: {1}", uiModule, e.ToString()); return false; } } else { m_log.Log(LogLevel.DBADERROR, "Using null user interfare"); m_userInterface = new UserInterfaceNull(); } // if we are doing detail logging, enable logging by the LookingGlassOgre code if (m_log.WouldLog(LogLevel.DOGREDETAIL)) { m_log.Log(LogLevel.DRENDER, "Logging detail high enough to enable unmanaged code log messages"); debugLogCallbackHandle = new Ogr.DebugLogCallback(OgrLogger); Ogr.SetDebugLogCallback(debugLogCallbackHandle); } // push the callback pointers into the LookingGlassOgre code fetchParameterCallbackHandle = new Ogr.FetchParameterCallback(GetAParameter); Ogr.SetFetchParameterCallback(fetchParameterCallbackHandle); checkKeepRunningCallbackHandle = new Ogr.CheckKeepRunningCallback(CheckKeepRunning); Ogr.SetCheckKeepRunningCallback(checkKeepRunningCallbackHandle); // link the input devices to and turn on low level IO reception if (m_userInterface.NeedsRendererLinkage()) { userIOCallbackHandle = new Ogr.UserIOCallback(ReceiveUserIOConv); Ogr.SetUserIOCallback(userIOCallbackHandle); } // handles so unmanaged code can call back to managed code requestResourceCallbackHandle = new Ogr.RequestResourceCallback(RequestResource); Ogr.SetRequestResourceCallback(requestResourceCallbackHandle); betweenFramesCallbackHandle = new Ogr.BetweenFramesCallback(ProcessBetweenFrames); Ogr.SetBetweenFramesCallback(betweenFramesCallbackHandle); m_sceneMagnification = float.Parse(ModuleParams.ParamString(m_moduleName + ".Ogre.LL.SceneMagnification")); m_shouldForceMeshRebuild = ModuleParams.ParamBool(m_moduleName + ".Ogre.ForceMeshRebuild"); m_shouldRenderOnMainThread = ModuleParams.ParamBool(m_moduleName + ".ShouldRenderOnMainThread"); m_shouldPrebuildMesh = ModuleParams.ParamBool(ModuleName + ".Ogre.PrebuildMesh"); // pick up a bunch of parameterized values m_betweenFrameTotalCost = ModuleParams.ParamInt(m_moduleName + ".Ogre.BetweenFrame.Costs.Total"); // start up the Ogre renderer try { Ogr.InitializeOgre(); } catch (Exception e) { m_log.Log(LogLevel.DBADERROR, "EXCEPTION INITIALIZING OGRE: {0}", e.ToString()); return false; } m_sceneMgr = new OgreSceneMgr(Ogr.GetSceneMgr()); // if we get here, rendering is set up and running return true; }
public override bool Connect(ParameterSet parms) { return false; }
// ICommProvider.Connect() public virtual bool Connect(ParameterSet parms) { // Are we already logged in? if (m_isLoggedIn || m_isLoggingIn) { return false; } m_loginFirst = parms.ParamString(FIELDFIRST); m_loginLast = parms.ParamString(FIELDLAST); m_loginPassword = parms.ParamString(FIELDPASS); m_loginGrid = parms.ParamString(FIELDGRID); m_loginSim = parms.ParamString(FIELDSIM); // put it in the connection parameters so it shows up in status m_connectionParams.UpdateSilent(FIELDFIRST, m_loginFirst); m_connectionParams.UpdateSilent(FIELDLAST, m_loginLast); m_connectionParams.UpdateSilent(FIELDGRID, m_loginGrid); m_connectionParams.UpdateSilent(FIELDSIM, m_loginSim); // push some back to the user params so it can be persisted for next session ModuleParams.AddUserParameter("User.FirstName", m_loginFirst, null); ModuleParams.AddUserParameter("User.LastName", m_loginLast, null); ModuleParams.AddUserParameter("User.Grid", m_loginGrid, null); ModuleParams.AddUserParameter("User.Sim", m_loginGrid, null); m_shouldBeLoggedIn = true; return true; }
protected void InitVariables() { m_moduleName = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.Name; m_isConnected = false; m_isLoggedIn = false; m_isLoggingIn = false; m_isLoggingOut = false; m_connectionParams = new ParameterSet(); m_regionList = new Dictionary<OMV.UUID, LLRegionContext>(); m_waitTilOnline = new List<ParamBlock>(); m_commStatistics = new ParameterSet(); m_waitTilLater = new BasicWorkQueue("CommDoTilLater"); m_loginGrid = "Unknown"; }
private OMVSD.OSDMap PostActionTeleport(OMVSD.OSD body) { OMVSD.OSDMap ret = new OMVSD.OSDMap(); ParameterSet loginParams = new ParameterSet(); try { OMVSD.OSDMap paramMap = (OMVSD.OSDMap)body; string dest = paramMap["DESTINATION"].AsString(); m_log.Log(LogLevel.DCOMMDETAIL, "Request to teleport to {0}", dest); m_comm.DoTeleport(dest); } catch (Exception e) { m_log.Log(LogLevel.DBADERROR, "CONNECT EXCEPTION: " + e.ToString()); ret.Add(RestHandler.RESTREQUESTERRORCODE, new OMVSD.OSDInteger(1)); ret.Add(RestHandler.RESTREQUESTERRORMSG, new OMVSD.OSDString("Connection threw exception: " + e.ToString())); return ret; } return ret; }
private OMVSD.OSDMap PostActionLogin(OMVSD.OSD body) { OMVSD.OSDMap ret = new OMVSD.OSDMap(); ParameterSet loginParams = new ParameterSet(); try { OMVSD.OSDMap paramMap = (OMVSD.OSDMap)body; loginParams.Add(CommLLLP.FIELDFIRST, paramMap["LOGINFIRST"].AsString()); loginParams.Add(CommLLLP.FIELDLAST, paramMap["LOGINLAST"].AsString()); loginParams.Add(CommLLLP.FIELDPASS, paramMap["LOGINPASS"].AsString()); loginParams.Add(CommLLLP.FIELDGRID, paramMap["LOGINGRID"].AsString()); loginParams.Add(CommLLLP.FIELDSIM, paramMap["LOGINSIM"].AsString()); } catch { m_log.Log(LogLevel.DBADERROR, "MISFORMED POST REQUEST: "); ret.Add(RestHandler.RESTREQUESTERRORCODE, new OMVSD.OSDInteger(1)); ret.Add(RestHandler.RESTREQUESTERRORMSG, new OMVSD.OSDString("Misformed POST request")); return ret; } try { if (!m_comm.Connect(loginParams)) { m_log.Log(LogLevel.DBADERROR, "CONNECT FAILED"); ret.Add(RestHandler.RESTREQUESTERRORCODE, new OMVSD.OSDInteger(1)); ret.Add(RestHandler.RESTREQUESTERRORMSG, new OMVSD.OSDString("Could not log in")); return ret; } } catch (Exception e) { m_log.Log(LogLevel.DBADERROR, "CONNECT EXCEPTION: " + e.ToString()); ret.Add(RestHandler.RESTREQUESTERRORCODE, new OMVSD.OSDInteger(1)); ret.Add(RestHandler.RESTREQUESTERRORMSG, new OMVSD.OSDString("Connection threw exception: " + e.ToString())); return ret; } return ret; }
/// <summary> /// Setup a REST handler that returns the values from a ParameterSet. /// </summary> /// <param name="urlBase">base of the url for this parameter set</param> /// <param name="parms">the parameter set to read and write</param> /// <param name="writable">if 'true', it allows POST operations to change the parameter set</param> public RestHandler(string urlBase, ref ParameterSet parms, bool writable) { m_baseUrl = urlBase; m_parameterSet = parms; m_parameterSetWritable = writable; m_processGet = ProcessGetParam; if (writable) { m_processPost = ProcessPostParam; } m_prefix = APINAME + urlBase; RestManager.Instance.RegisterListener(this); m_log.Log(LogLevel.DRESTDETAIL, "RestHandler: parameterset, p={0}", m_prefix); }
// see that the grid info is read in. Called at the beginning of every data access method private void CheckInit() { if (m_gridInfo == null) { string gridsFilename = ""; try { m_gridInfo = new ParameterSet(); gridsFilename = Path.Combine(LookingGlassBase.Instance.AppParams.ParamString("Grids.Filename.Directory"), LookingGlassBase.Instance.AppParams.ParamString("Grids.Filename")); if (!File.Exists(gridsFilename)) { // if the user copy of the config file doesn't exist, copy the default into place string gridsDefaultFilename = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory, LookingGlassBase.Instance.AppParams.ParamString("Grids.Filename")); if (File.Exists(gridsDefaultFilename)) { File.Copy(gridsDefaultFilename, gridsFilename); } else { LogManager.Log.Log(LogLevel.DBADERROR, "GridManager: GRIDS FILE DOES NOT EXIST: {0}", gridsFilename); gridsFilename = null; } } if (gridsFilename != null) { m_gridInfo.AddFromFile(gridsFilename); } } catch (Exception e) { LogManager.Log.Log(LogLevel.DBADERROR, "GridManager: FAILED READING GRIDS FILE '{0}': {1}", gridsFilename, e.ToString()); } } }
// cause the grid information to be reloaded public void Reload() { m_gridInfo = null; }