private void SwitchModeButton_OnButtonClick(UIElement button) { if (GraphicsModeControl.Mode == LotView.Model.GlobalGraphicsMode.Hybrid2D) { GraphicsModeControl.ChangeMode(LotView.Model.GlobalGraphicsMode.Full3D); } else if (GraphicsModeControl.Mode == LotView.Model.GlobalGraphicsMode.Full3D) { GraphicsModeControl.ChangeMode(LotView.Model.GlobalGraphicsMode.Hybrid2D); } }
public override void Update(FSO.Common.Rendering.Framework.Model.UpdateState state) { GameFacade.Game.IsFixedTimeStep = (vm == null || vm.Ready); Visible = World?.Visible != false && World?.State.Cameras.HideUI != true; GameFacade.Game.IsMouseVisible = Visible; if (state.NewKeys.Contains(Keys.D1)) { ChangeSpeedTo(1); } if (state.NewKeys.Contains(Keys.D2)) { ChangeSpeedTo(2); } if (state.NewKeys.Contains(Keys.D3)) { ChangeSpeedTo(3); } if (state.NewKeys.Contains(Keys.P)) { ChangeSpeedTo(0); } if (state.NewKeys.Contains(Keys.D0)) { //frame advance ChangeSpeedTo(1); GameThread.NextUpdate((FSO.Common.Rendering.Framework.Model.UpdateState ustate) => ChangeSpeedTo(0)); } base.Update(state); if (state.NewKeys.Contains(Microsoft.Xna.Framework.Input.Keys.F12) && GraphicsModeControl.Mode != GlobalGraphicsMode.Full2D) { GraphicsModeControl.ChangeMode((GraphicsModeControl.Mode == GlobalGraphicsMode.Full3D) ? GlobalGraphicsMode.Hybrid2D : GlobalGraphicsMode.Full3D); } /* * if (state.NewKeys.Contains(Keys.F12)) * { * ChangeSpeedTo(1); * //running 10000 ticks * var timer = new System.Diagnostics.Stopwatch(); * timer.Start(); * * for (int i=0; i<10000; i++) * { * vm.Tick(); * } * * timer.Stop(); * UIScreen.GlobalShowDialog(new UIMobileAlert(new UIAlertOptions() { * Title = "Benchmark", * Message = "10000 ticks took " + timer.ElapsedMilliseconds + "ms." * }), true); * } */ if (World != null) { //stub smooth zoom? } if (SwitchLot > 0) { if (!Downtown) { SavedLot = vm.Save(); } if (SwitchLot == ActiveFamily.HouseNumber && SavedLot != null) { Downtown = false; InitializeLot(SavedLot); SavedLot = null; } else { Downtown = true; InitializeLot(Content.Get().Neighborhood.GetHousePath(SwitchLot), false); } SwitchLot = -1; } //vm.Context.Clock.Hours = 12; if (vm != null) { vm.Update(); } //SaveHouseButton_OnButtonClick(null); }
/// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() { System.Net.ServicePointManager.DefaultConnectionLimit = 32; var kernel = new StandardKernel( new RegulatorsModule(), new NetworkModule(), new CacheModule() ); FSOFacade.Kernel = kernel; var settings = GlobalSettings.Default; if (FSOEnvironment.SoftwareDepth) { settings.GraphicsWidth = (int)(GraphicsDevice.Viewport.Width / FSOEnvironment.DPIScaleFactor); settings.GraphicsHeight = (int)(GraphicsDevice.Viewport.Height / FSOEnvironment.DPIScaleFactor); } //manage settings if (settings.LightingMode == -1) { if (settings.Lighting) { if (settings.Shadows3D) { settings.LightingMode = 2; } else { settings.LightingMode = 1; } } else { settings.LightingMode = 0; } settings.Save(); } var initialMode = (GlobalGraphicsMode)settings.GlobalGraphicsMode; if (FSOEnvironment.Enable3D) { if (initialMode == GlobalGraphicsMode.Full2D) { initialMode = GlobalGraphicsMode.Full3D; } } else { initialMode = GlobalGraphicsMode.Full2D; } GraphicsModeControl.ChangeMode(initialMode); GraphicsModeControl.ModeChanged += SaveGraphicsModePreference; FeatureLevelTest.UpdateFeatureLevel(GraphicsDevice); if (!FSOEnvironment.MSAASupport) { settings.AntiAlias = 0; } LotView.WorldConfig.Current = new LotView.WorldConfig() { LightingMode = settings.LightingMode, SmoothZoom = settings.SmoothZoom, SurroundingLots = settings.SurroundingLotMode, AA = settings.AntiAlias, Weather = settings.Weather, Directional = settings.DirectionalLight3D, Complex = settings.ComplexShaders, EnableTransitions = settings.EnableTransitions }; if (!FSOEnvironment.TexCompressSupport) { settings.TexCompression = 0; } else if ((settings.TexCompression & 2) == 0) { settings.TexCompression = 1; } FSOEnvironment.TexCompress = (!IffFile.RETAIN_CHUNK_DATA) && (settings.TexCompression & 1) > 0; //end settings management OperatingSystem os = Environment.OSVersion; PlatformID pid = os.Platform; GameFacade.Linux = (pid == PlatformID.MacOSX || pid == PlatformID.Unix); FSO.Content.Content.TS1Hybrid = GlobalSettings.Default.TS1HybridEnable; FSO.Content.Content.TS1HybridBasePath = GlobalSettings.Default.TS1HybridPath; FSO.Content.Content.InitBasic(GlobalSettings.Default.StartupPath, GraphicsDevice); FSO.SimAntics.VMAvatar.MissingIconProvider = FSO.Client.UI.Model.UIIconCache.GetObject; FSO.SimAntics.VM.TestBinding = "Value"; //VMContext.InitVMConfig(); base.Initialize(); GameFacade.GameThread = Thread.CurrentThread; SceneMgr = new _3DLayer(); SceneMgr.Initialize(GraphicsDevice); FSOFacade.Controller = kernel.Get <GameController>(); FSOFacade.Hints = new UI.Hints.UIHintManager(); GameFacade.Screens = uiLayer; GameFacade.Scenes = SceneMgr; GameFacade.GraphicsDevice = GraphicsDevice; GameFacade.GraphicsDeviceManager = Graphics; GameFacade.Emojis = new Common.Rendering.Emoji.EmojiProvider(GraphicsDevice); CurLoader.BmpLoaderFunc = Files.ImageLoader.FromStream; GameFacade.Cursor = new CursorManager(GraphicsDevice); if (!GameFacade.Linux) { GameFacade.Cursor.Init(FSO.Content.Content.Get().GetPath(""), false); } /** Init any computed values **/ GameFacade.Init(); //init audio now HITVM.Init(); var hit = HITVM.Get(); hit.SetMasterVolume(HITVolumeGroup.FX, GlobalSettings.Default.FXVolume / 10f); hit.SetMasterVolume(HITVolumeGroup.MUSIC, GlobalSettings.Default.MusicVolume / 10f); hit.SetMasterVolume(HITVolumeGroup.VOX, GlobalSettings.Default.VoxVolume / 10f); hit.SetMasterVolume(HITVolumeGroup.AMBIENCE, GlobalSettings.Default.AmbienceVolume / 10f); GameFacade.Strings = new ContentStrings(); FSOFacade.Controller.Start(); GraphicsDevice.RasterizerState = new RasterizerState() { CullMode = CullMode.None }; try { var audioTest = new SoundEffect(new byte[2], 44100, AudioChannels.Mono); //initialises XAudio. audioTest.CreateInstance().Play(); } catch (Exception e) { FSOProgram.ShowDialog("Failed to initialize audio: \r\n\r\n" + e.StackTrace); } this.IsMouseVisible = true; this.IsFixedTimeStep = true; WorldContent.Init(this.Services, Content.RootDirectory); DGRP3DMesh.InitRCWorkers(); if (!(FSOEnvironment.SoftwareKeyboard && FSOEnvironment.SoftwareDepth)) { AddTextInput(); } base.Screen.Layers.Add(SceneMgr); base.Screen.Layers.Add(uiLayer); GameFacade.LastUpdateState = base.Screen.State; //Bind ninject objects kernel.Bind <FSO.Content.Content>().ToConstant(FSO.Content.Content.Get()); kernel.Load(new ClientDomainModule()); //Have to be eager with this, it sets a singleton instance on itself to avoid packets having //to be created using Ninject for performance reasons kernel.Get <cTSOSerializer>(); var ds = kernel.Get <DataService>(); ds.AddProvider(new ClientAvatarProvider()); this.Window.Title = "FreeSO"; DiscordRpcEngine.Init(); if (!GlobalSettings.Default.Windowed && !GameFacade.GraphicsDeviceManager.IsFullScreen) { GameFacade.GraphicsDeviceManager.ToggleFullScreen(); } if (GameFacade.Linux) { MP3Player.NewMode = false; } //(new Utils.PalMapper()).DoIt(); }
public override void Update(FSO.Common.Rendering.Framework.Model.UpdateState state) { GameFacade.Game.IsFixedTimeStep = (vm == null || vm.Ready); Visible = World?.Visible == true && World?.State.Cameras.HideUI == false; GameFacade.Game.IsMouseVisible = Visible; if (state.WindowFocused && state.NewKeys.Contains(Microsoft.Xna.Framework.Input.Keys.F1) && state.CtrlDown) { FSOFacade.Controller.ToggleDebugMenu(); } base.Update(state); if (state.WindowFocused && state.InputManager.GetFocus() == null) { if (state.NewKeys.Contains(Keys.D1) || (state.KeyboardState.NumLock && state.NewKeys.Contains(Keys.NumPad1))) { ChangeSpeedTo(1); } else if (state.NewKeys.Contains(Keys.D2) || (state.KeyboardState.NumLock && state.NewKeys.Contains(Keys.NumPad2))) { ChangeSpeedTo(2); } else if (state.NewKeys.Contains(Keys.D3) || (state.KeyboardState.NumLock && state.NewKeys.Contains(Keys.NumPad3))) { ChangeSpeedTo(3); } else if (state.NewKeys.Contains(Keys.P) || state.NewKeys.Contains(Keys.D0) || (state.KeyboardState.NumLock && state.NewKeys.Contains(Keys.NumPad0))) { ChangeSpeedTo(0); } } if (World != null) { //stub smooth zoom? if (state.NewKeys.Contains(Keys.F11)) { //render lot thumbnail test var thumb = World.GetLotThumb(GameFacade.GraphicsDevice, null); var alert = UIAlert.Alert("Thumbnail Test", ".", false); alert.SetIcon(thumb, thumb.Width, thumb.Height); alert.SetSize(thumb.Width + 100, thumb.Height + 100); } } lock (StateChanges) { while (StateChanges.Count > 0) { var e = StateChanges.Dequeue(); ClientStateChangeProcess(e.State, e.Progress); } } if (SwitchLot > 0) { InitializeLot(Path.Combine(Content.Content.Get().TS1BasePath, "UserData/Houses/House" + SwitchLot.ToString().PadLeft(2, '0') + ".iff"), false); SwitchLot = -1; } if (vm != null) { vm.Update(); } if (state.NewKeys.Contains(Microsoft.Xna.Framework.Input.Keys.F12) && GraphicsModeControl.Mode != GlobalGraphicsMode.Full2D) { GraphicsModeControl.ChangeMode((GraphicsModeControl.Mode == GlobalGraphicsMode.Full3D) ? GlobalGraphicsMode.Hybrid2D : GlobalGraphicsMode.Full3D); } }
public override void Update(FSO.Common.Rendering.Framework.Model.UpdateState state) { //GameFacade.Game.IsFixedTimeStep = (vm == null || vm.Ready); Visible = ((World?.Visible == false || World?.State.Cameras.HideUI != true) && !CityRenderer.Camera.HideUI); GameFacade.Game.IsMouseVisible = Visible; base.Update(state); if (state.NewKeys.Contains(Microsoft.Xna.Framework.Input.Keys.F1) && state.CtrlDown) { FSOFacade.Controller.ToggleDebugMenu(); } if (CityRenderer != null) { if (ZoomLevel > 3 && (CityRenderer.m_Zoomed == TerrainZoomMode.Near) != (ZoomLevel == 4)) { ZoomLevel = (CityRenderer.m_Zoomed == TerrainZoomMode.Near) ? 4 : 5; } if (World != null) { if (CityRenderer.m_Zoomed == TerrainZoomMode.Lot) { if (World.FrameCounter < 3) { //wait until the draw stage has stabalized a bit. tends to be like this // 1. heavy singular draw // 2. update * 30 // 3. normal draws CityRenderer.m_LotZoomProgress = 0; World.Visible = true; World.Opacity = 0; } else if (World.FrameCounter == 5 && GlobalSettings.Default.CompatState < GlobalSettings.TARGET_COMPAT_STATE) { GlobalSettings.Default.CompatState = GlobalSettings.TARGET_COMPAT_STATE; GlobalSettings.Default.Save(); } else { CityRenderer.InheritPosition(World, FindController <CoreGameScreenController>(), false); } } if (CityRenderer.m_LotZoomProgress > 0f && CityRenderer.m_LotZoomProgress < 1f) { if (CityRenderer.m_Zoomed == TerrainZoomMode.Lot) { if (CityRenderer.m_LotZoomProgress > 0.9999f) { CityRenderer.m_LotZoomProgress = 1f; CityRenderer.Visible = false; } } else { if (CityRenderer.m_LotZoomProgress < 0.0001f) { CityRenderer.m_LotZoomProgress = 0f; World.Visible = false; } } World.Opacity = Math.Max(0, (CityRenderer.m_LotZoomProgress - 0.5f) * 2); float scale = 1; if (CityRenderer.Camera is CityCamera2D) { var cam = (CityCamera2D)CityRenderer.Camera; scale = 1 / ((cam.LotZoomProgress * (1 / cam.m_LotZoomSize) + (1 - cam.LotZoomProgress) * (1 / (Terrain.NEAR_ZOOM_SIZE * cam.m_WheelZoom)))) / cam.m_LotZoomSize; } World.State.PreciseZoom = scale; } else { World.Opacity = (CityRenderer.m_Zoomed == TerrainZoomMode.Lot)?1f:0f; } } if (InLot) //if we're in a lot, use the VM's more accurate time! { CityRenderer.SetTimeOfDay((vm.Context.Clock.Hours / 24.0) + (vm.Context.Clock.Minutes / 1440.0) + (vm.Context.Clock.Seconds / 86400.0)); } else { var time = DateTime.UtcNow; var tsoTime = TSOTime.FromUTC(time); CityRenderer.SetTimeOfDay((tsoTime.Item1 / 24.0) + (tsoTime.Item2 / 1440.0) + (tsoTime.Item3 / 86400.0)); } } lock (StateChanges) { while (StateChanges.Count > 0) { var e = StateChanges.Dequeue(); ClientStateChangeProcess(e.State, e.Progress); } } if (vm != null) { if (vm.FSOVAsyncLoading) { if (vm.FSOVObjTotal != 0) { ClientStateChange(4, vm.FSOVObjLoaded / (float)vm.FSOVObjTotal); } } else { vm.Update(); } } var joinAttempt = DiscordRpcEngine.Secret; if (joinAttempt != null) { var split = joinAttempt.Split('#'); uint lotID; if (uint.TryParse(split[0], out lotID)) { FindController <CoreGameScreenController>()?.JoinLot(lotID); } DiscordRpcEngine.Secret = null; } if (state.NewKeys.Contains(Microsoft.Xna.Framework.Input.Keys.F12) && GraphicsModeControl.Mode != GlobalGraphicsMode.Full2D) { GraphicsModeControl.ChangeMode((GraphicsModeControl.Mode == GlobalGraphicsMode.Full3D) ? GlobalGraphicsMode.Hybrid2D : GlobalGraphicsMode.Full3D); } }
static void Main(string[] args) { FSO.Windows.Program.InitWindows(); TimedReferenceController.SetMode(CacheType.PERMANENT); Console.WriteLine("Loading Config..."); try { var configString = File.ReadAllText("facadeconfig.json"); Config = Newtonsoft.Json.JsonConvert.DeserializeObject <FacadeConfig>(configString); } catch (Exception e) { Console.WriteLine("Could not find configuration file 'facadeconfig.json'. Please ensure it is valid and present in the same folder as this executable."); return; } Console.WriteLine("Locating The Sims Online..."); string baseDir = AppDomain.CurrentDomain.BaseDirectory; Directory.SetCurrentDirectory(baseDir); //Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); OperatingSystem os = Environment.OSVersion; PlatformID pid = os.Platform; ILocator gameLocator; bool linux = pid == PlatformID.MacOSX || pid == PlatformID.Unix; if (linux && Directory.Exists("/Users")) { gameLocator = new MacOSLocator(); } else if (linux) { gameLocator = new LinuxLocator(); } else { gameLocator = new WindowsLocator(); } bool useDX = true; FSOEnvironment.Enable3D = true; GraphicsModeControl.ChangeMode(FSO.LotView.Model.GlobalGraphicsMode.Full3D); GameThread.NoGame = true; GameThread.UpdateExecuting = true; var path = Config.Game_Path ?? gameLocator.FindTheSimsOnline(); if (path != null) { FSOEnvironment.ContentDir = "Content/"; FSOEnvironment.GFXContentDir = "Content/" + (useDX ? "DX/" : "OGL/"); FSOEnvironment.Linux = linux; FSOEnvironment.DirectX = useDX; FSOEnvironment.TexCompress = FSOEnvironment.TexCompressSupport; FSOEnvironment.GameThread = Thread.CurrentThread; FSO.HIT.HITVM.Init(); FSO.HIT.HITVM.Get().SetMasterVolume(FSO.HIT.Model.HITVolumeGroup.AMBIENCE, 0); FSO.HIT.HITVM.Get().SetMasterVolume(FSO.HIT.Model.HITVolumeGroup.FX, 0); FSO.HIT.HITVM.Get().SetMasterVolume(FSO.HIT.Model.HITVolumeGroup.MUSIC, 0); FSO.HIT.HITVM.Get().SetMasterVolume(FSO.HIT.Model.HITVolumeGroup.VOX, 0); FSO.Files.Formats.IFF.Chunks.STR.DefaultLangCode = FSO.Files.Formats.IFF.Chunks.STRLangCode.EnglishUS; } Console.WriteLine("Creating Graphics Device..."); var gds = new GraphicsDeviceServiceMock(); var gd = gds.GraphicsDevice; //set up some extra stuff like the content manager var services = new GameServiceContainer(); var content = new ContentManager(services); content.RootDirectory = FSOEnvironment.GFXContentDir; services.AddService <IGraphicsDeviceService>(gds); var vitaboyEffect = content.Load <Effect>("Effects/Vitaboy"); FSO.Vitaboy.Avatar.setVitaboyEffect(vitaboyEffect); WorldConfig.Current = new WorldConfig() { LightingMode = 3, SmoothZoom = true, SurroundingLots = 0 }; DGRP3DMesh.Sync = true; Console.WriteLine("Looks like that worked. Loading FSO Content!"); VMContext.InitVMConfig(false); Content.Init(path, gd); WorldContent.Init(services, content.RootDirectory); VMAmbientSound.ForceDisable = true; Layer = new _3DLayer(); Layer.Initialize(gd); GD = gd; if (args.FirstOrDefault() == "debug") { DebugLot = uint.Parse(args[1]); } Console.WriteLine("Starting Worker Loop!"); WorkerLoop(); Console.WriteLine("Exiting."); GameThread.SetKilled(); gds.Release(); }
/// <summary> /// Allows the game to perform any initialization it needs to before starting to run. /// This is where it can query for any required services and load any non-graphic /// related content. Calling base.Initialize will enumerate through any components /// and initialize them as well. /// </summary> protected override void Initialize() { var settings = GlobalSettings.Default; if (FSOEnvironment.DPIScaleFactor != 1 || FSOEnvironment.SoftwareDepth) { settings.GraphicsWidth = (int)(GraphicsDevice.Viewport.Width / FSOEnvironment.DPIScaleFactor); settings.GraphicsHeight = (int)(GraphicsDevice.Viewport.Height / FSOEnvironment.DPIScaleFactor); } var initialMode = (GlobalGraphicsMode)settings.GlobalGraphicsMode; if (FSOEnvironment.Enable3D) { if (initialMode == GlobalGraphicsMode.Full2D) { initialMode = GlobalGraphicsMode.Full3D; } } else { initialMode = GlobalGraphicsMode.Full2D; } GraphicsModeControl.ChangeMode(initialMode); GraphicsModeControl.ModeChanged += SaveGraphicsModePreference; FSO.LotView.WorldConfig.Current = new FSO.LotView.WorldConfig() { LightingMode = settings.LightingMode, SmoothZoom = settings.SmoothZoom, SurroundingLots = settings.SurroundingLotMode, AA = settings.AntiAlias, Directional = settings.DirectionalLight3D, Complex = settings.ComplexShaders, EnableTransitions = settings.EnableTransitions }; OperatingSystem os = Environment.OSVersion; PlatformID pid = os.Platform; GameFacade.Linux = (pid == PlatformID.MacOSX || pid == PlatformID.Unix); FSO.Content.Content.Target = FSO.Content.FSOEngineMode.TS1; FSO.Content.Content.TS1HybridBasePath = GlobalSettings.Default.TS1HybridPath; if (FSOEnvironment.Enable3D) { FSO.Files.RC.DGRP3DMesh.InitRCWorkers(); } //FSO.Content.Content.Init(GlobalSettings.Default.StartupPath, GraphicsDevice); FSO.SimAntics.VMAvatar.MissingIconProvider = Simitone.Client.UI.Model.UIIconCache.GetObject; base.Initialize(); GameFacade.GameThread = Thread.CurrentThread; SceneMgr = new _3DLayer(); SceneMgr.Initialize(GraphicsDevice); GameFacade.Scenes = SceneMgr; GameFacade.GraphicsDevice = GraphicsDevice; GameFacade.GraphicsDeviceManager = Graphics; GameFacade.Cursor = new CursorManager(GraphicsDevice); if (!GameFacade.Linux) { CurLoader.BmpLoaderFunc = ImageLoader.BaseFunction; GameFacade.Cursor.Init(GlobalSettings.Default.TS1HybridPath, true); } /** Init any computed values **/ GameFacade.Init(); //init audio now HITVM.Init(); var hit = HITVM.Get(); hit.SetMasterVolume(HITVolumeGroup.FX, GlobalSettings.Default.FXVolume / 10f); hit.SetMasterVolume(HITVolumeGroup.MUSIC, GlobalSettings.Default.MusicVolume / 10f); hit.SetMasterVolume(HITVolumeGroup.VOX, GlobalSettings.Default.VoxVolume / 10f); hit.SetMasterVolume(HITVolumeGroup.AMBIENCE, GlobalSettings.Default.AmbienceVolume / 10f); ContentStrings.TS1 = true; GameFacade.Strings = new ContentStrings(); GraphicsDevice.RasterizerState = new RasterizerState() { CullMode = CullMode.None }; try { var audioTest = new SoundEffect(new byte[2], 44100, AudioChannels.Mono); //initialises XAudio. audioTest.CreateInstance().Play(); } catch (Exception e) { //MessageBox.Show("Failed to initialize audio: \r\n\r\n" + e.StackTrace); } this.IsFixedTimeStep = true; WorldContent.Init(this.Services, Content.RootDirectory); base.Screen.Layers.Add(SceneMgr); base.Screen.Layers.Add(uiLayer); GameFacade.LastUpdateState = base.Screen.State; if (!GlobalSettings.Default.Windowed && !GameFacade.GraphicsDeviceManager.IsFullScreen) { GameFacade.GraphicsDeviceManager.ToggleFullScreen(); } }