Пример #1
0
        private static SaveableData ToSaveableData(DarkRendererSettings settings, DarkKn5ObjectRenderer renderer)
        {
            var data = SaveHelper <SaveableData> .LoadSerialized(settings.ExportToPresetData());

            if (data == null)
            {
                Logging.Unexpected();
                return(null);
            }

            data.CameraPosition          = Coordinates.Create(renderer.Camera.Position).ToArray();
            data.CameraLookAt            = Coordinates.Create(renderer.CameraOrbit?.Target ?? renderer.Camera.Look).ToArray();
            data.CameraFov               = renderer.Camera.FovY.ToDegrees();
            data.AlignCar                = false;
            data.AlignCameraHorizontally = false;
            data.AlignCameraVertically   = false;

            var car = renderer.CarNode;

            if (car != null)
            {
                data.SteerDeg           = car.SteerDeg;
                data.LeftDoorOpen       = car.LeftDoorOpen;
                data.RightDoorOpen      = car.RightDoorOpen;
                data.HeadlightsEnabled  = car.HeadlightsEnabled;
                data.BrakeLightsEnabled = car.BrakeLightsEnabled;
                data.ShowDriver         = car.IsDriverVisible;
            }

            return(data);
        }
Пример #2
0
        private void EnableRenderer(bool cameraHigher)
        {
            try {
                if (_imageEx != null)
                {
                    return;
                }

                var renderer = new DarkKn5ObjectRenderer(Model.Car);
                renderer.SelectSkin(null);
                renderer.Initialize();
                renderer.SetCameraHigher = cameraHigher;
                SetRendererSize(renderer);
                renderer.Draw();
                Model.Renderer = renderer;

                _imageEx     = new D3DImageEx();
                Scene.Source = _imageEx;
                _setCount    = 0;
                _lastTarget  = IntPtr.Zero;

                CompositionTarget.Rendering += OnRendering;
                VisibilityAnimation.SetVisible(Scene, true);
            } catch (Exception e) {
                MessageBox.Show(e.ToString());
            }
        }
Пример #3
0
        public CmPreviewsSettings(DarkKn5ObjectRenderer renderer) : base(renderer, DefaultPresetableKeyValue)
        {
            CameraPosition.PropertyChanged += OnCameraCoordinatePropertyChanged;
            CameraLookAt.PropertyChanged   += OnCameraCoordinatePropertyChanged;
            Renderer.CameraMoved           += OnCameraMoved;

            if (LockCamera)
            {
                Renderer.LockCamera = true;
            }
        }
Пример #4
0
        public CmPreviewsSettings(DarkKn5ObjectRenderer renderer) : base(renderer, CmPreviewsSettingsValues.DefaultPresetableKeyValue)
        {
            renderer.VisibleUi = false;
            if (LockCamera)
            {
                Renderer.LockCamera = true;
            }

            SetCarAnimationsListeners();
            ExtraAnimationEntries.ItemPropertyChanged += OnItemPropertyChanged;
        }
Пример #5
0
        public static void Transfer(DarkRendererSettings settings, DarkKn5ObjectRenderer renderer)
        {
            var data = ToSaveableData(settings, renderer);

            var filename = UserPresetsControl.GetCurrentFilename(DarkRendererSettings.DefaultPresetableKeyValue);

            if (filename != null)
            {
                var relative = FileUtils.GetRelativePath(filename, PresetsManager.Instance.Combine(DarkRendererSettings.DefaultPresetableKeyValue));
                filename = relative == filename ? null : Path.Combine(PresetsManager.Instance.Combine(DefaultPresetableKeyValue), relative);
            }

            PresetsManager.Instance.SavePresetUsingDialog(null, DefaultPresetableKeyValue, SaveHelper <SaveableData> .Serialize(data), filename);
        }
Пример #6
0
        public CmPreviewsTools(DarkKn5ObjectRenderer renderer, CarObject car, string skinId, string presetFilename)
        {
            _loadPreset = presetFilename;

            DataContext = new ViewModel(renderer, car, skinId);
            InputBindings.AddRange(new[] {
                new InputBinding(Model.PreviewSkinCommand, new KeyGesture(Key.PageUp)),
                new InputBinding(Model.NextSkinCommand, new KeyGesture(Key.PageDown)),
                new InputBinding(Model.OpenSkinDirectoryCommand, new KeyGesture(Key.F, ModifierKeys.Control))
            });
            InitializeComponent();
            Buttons = new Button[0];

            this.OnActualUnload(() => Model.Dispose());
        }
Пример #7
0
        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            _cameraControl = new Kn5WrapperCameraControlHelper();
            EnableRenderer(true);

            if (MainExecutingFile.Name.IndexOf("simple", StringComparison.OrdinalIgnoreCase) != -1)
            {
                using (var renderer = new DarkKn5ObjectRenderer(Model.Car)) {
                    new BaseKn5FormWrapper(renderer, "Simple Mode", 1000, 800).Run();
                }

                if (MainExecutingFile.Name.IndexOf("exit", StringComparison.OrdinalIgnoreCase) != -1)
                {
                    Environment.Exit(0);
                }
            }
        }
Пример #8
0
        private static async Task <IReadOnlyList <UpdatePreviewError> > Run([NotNull] CarObject car, [CanBeNull] string skinId,
                                                                            [CanBeNull] IReadOnlyList <ToUpdatePreview> toUpdate, [CanBeNull] string presetFilename)
        {
            var carKn5 = FileUtils.GetMainCarFilename(car.Location, car.AcdData);

            if (!File.Exists(carKn5))
            {
                ModernDialog.ShowMessage("Model not found");
                return(null);
            }

            await PrepareAsync();

            Kn5 kn5;

            using (var waiting = new WaitingDialog()) {
                waiting.Report("Loading model…");
                kn5 = await Task.Run(() => Kn5.FromFile(carKn5));
            }

            using (var renderer = new DarkKn5ObjectRenderer(CarDescription.FromKn5(kn5, car.Location, car.AcdData))
            {
                AutoRotate = false,
                AutoAdjustTarget = false,
                AsyncTexturesLoading = true,
                AsyncOverridesLoading = true,
                AutoloadCarLights = false,
                AutoloadShowroomLights = false
            }) {
                var wrapper = new CmPreviewsFormWrapper(car, renderer, skinId, presetFilename);

                if (toUpdate != null)
                {
                    wrapper.SetToUpdate(toUpdate);
                }

                wrapper.Form.Icon = AppIconService.GetAppIcon();
                wrapper.Run();

                return(wrapper.GetErrors());
            }
        }
Пример #9
0
            public ViewModel([NotNull] DarkKn5ObjectRenderer renderer, [NotNull] CarObject carObject, string skinId)
            {
                if (renderer == null)
                {
                    throw new ArgumentNullException(nameof(renderer));
                }

                Renderer = renderer;
                Settings = new CmPreviewsSettings(renderer);

                renderer.PropertyChanged += Renderer_PropertyChanged;
                Renderer_CarNodeUpdated();
                renderer.Tick += Renderer_Tick;

                Car  = carObject;
                Skin = skinId == null ? Car.SelectedSkin : Car.GetSkinById(skinId);
                Car.SkinsManager.EnsureLoadedAsync().Forget();

                Saveable = new SaveHelper <SaveableData>("__CmPreviewsTools", () => new SaveableData(), o => {
                }, () => {
                    Reset(false);
                });
            }
Пример #10
0
 private CmPreviewsFormWrapper(CarObject car, DarkKn5ObjectRenderer renderer, string skinId, string presetFilename)
     : base(renderer, "Previews Params", CommonAcConsts.PreviewWidth, CommonAcConsts.PreviewHeight)
 {
     _tools  = new CmPreviewsTools(renderer, car, skinId, presetFilename);
     _helper = new AttachedHelper(this, _tools);
 }
Пример #11
0
        public async Task LamborghiniTest()
        {
            var path = Path.Combine(AcRootFinder.Find(), @"content\cars");

            if (!Directory.Exists(path))
            {
                Debug.WriteLine("REQUIRED ASSET IS MISSING, TEST CANNOT BE DONE");
                return;
            }

            var cars = Directory.GetDirectories(path, "ks_lamborghini_*").Select(x => new {
                CarId        = Path.GetFileName(x),
                CarDirectory = x,
                Kn5          = FileUtils.GetMainCarFilename(x)
            }).ToList();

            var sw = Stopwatch.StartNew();
            var i  = 0;

            using (var e = cars.GetEnumerator()) {
                if (!e.MoveNext())
                {
                    return;
                }

                var first = e.Current;
                if (first == null)
                {
                    return;
                }

                using (var renderer = new DarkKn5ObjectRenderer(new CarDescription(first.Kn5, first.CarDirectory))) {
                    renderer.UseMsaa    = false;
                    renderer.UseFxaa    = false;
                    renderer.AutoRotate = false;
                    renderer.SetCamera(new Vector3(3.867643f, 1.42359f, 4.70381f), new Vector3(0.0f, 0.7f, 0.5f), (float)(Math.PI / 180d * 30f));
                    renderer.BackgroundColor = Color.FromArgb(220, 220, 220);

                    renderer.Initialize();
                    renderer.Width  = CommonAcConsts.PreviewWidth;
                    renderer.Height = CommonAcConsts.PreviewHeight;

                    do
                    {
                        if (e.Current != first)
                        {
                            first = e.Current;
                            if (first == null)
                            {
                                return;
                            }

                            await renderer.SetCarAsync(new CarDescription(first.Kn5, first.CarDirectory));
                        }

                        Console.WriteLine(first.CarId);

                        foreach (var skinDirectory in Directory.GetDirectories(Path.Combine(first.CarDirectory, "skins")))
                        {
                            // Console.WriteLine(skinDirectory);

                            renderer.Shot(4d, 1d, true)
                            .HighQualityResize(new Size(CommonAcConsts.PreviewWidth, CommonAcConsts.PreviewHeight))
                            .Save(Path.Combine(skinDirectory, "preview_new.jpg"));
                            renderer.SelectNextSkin();
                            i++;
                        }
                    } while (e.MoveNext());
                }
            }

            Console.WriteLine($"Done: {i} skins ({sw.Elapsed.TotalMilliseconds / i:F1} ms per skin)");
        }
Пример #12
0
        private async Task EnableRenderer()
        {
            if (!_loaded)
            {
                await DisableRenderer();

                return;
            }

            try {
                _carId = ValuesStorage.Storage.GetObject <JObject>("__QuickDrive_Main")?.GetStringValueOnly("CarId") ?? @"abarth500";

                var car = CarsManager.Instance.GetById(_carId);
                if (_imageEx != null || car == null)
                {
                    return;
                }

                Progress.IsActive = true;
                var panoramaBg = new Uri("pack://application:,,,/Content Manager;component/Assets/Img/ShowroomPanoramaExample.jpg", UriKind.Absolute);
                var renderer   = new DarkKn5ObjectRenderer(CarDescription.FromDirectory(car.Location, car.AcdData))
                {
                    WpfMode              = true,
                    UseMsaa              = false,
                    VisibleUi            = false,
                    TryToGuessCarLights  = false,
                    LoadCarLights        = false,
                    AnyGround            = true,
                    BackgroundColor      = System.Drawing.Color.FromArgb(0x444444),
                    BackgroundBrightness = 1f,
                    LightBrightness      = 0f,
                    AmbientDown          = System.Drawing.Color.FromArgb(0x444444),
                    AmbientUp            = System.Drawing.Color.FromArgb(0xffffff),
                    AmbientBrightness    = 4f,
                    Light                       = Vector3.Normalize(new Vector3(-0.1f, 10, -0.1f)),
                    ShadowMapSize               = 512,
                    EnableShadows               = false,
                    AutoRotate                  = false,
                    AutoAdjustTarget            = false,
                    UseDof                      = true,
                    UseAccumulationDof          = true,
                    AccumulationDofApertureSize = 0f,
                    AccumulationDofIterations   = 20,
                    AccumulationDofBokeh        = false,
                    UseFxaa                     = false,
                    UseSslr                     = true,
                    UseAo                       = false,
                    UseDither                   = true,
                    MaterialsReflectiveness     = 1.5f,
                    UseCustomReflectionCubemap  = true,
                    CustomReflectionCubemap     = Application.GetResourceStream(panoramaBg)?.Stream.ReadAsBytesAndDispose(),
                    CubemapAmbientWhite         = false,
                    CubemapAmbient              = 0.6f,
                };

                var data = car.AcdData;
                if (data != null)
                {
                    var carBasic = data.GetIniFile("car.ini")["BASIC"];
                    _carLength = carBasic.GetVector3F("INERTIA").ToVector3().Z;

                    var suspensions      = data.GetIniFile("suspensions.ini");
                    var suspensionsBasic = suspensions["BASIC"];
                    var go     = carBasic.GetVector3F("GRAPHICS_OFFSET").ToVector3();
                    var center = suspensionsBasic.GetFloat("WHEELBASE", 2.5f) * suspensionsBasic.GetFloat("CG_LOCATION", 0.5f);
                    _carOffset = new Vector3(go.X, go.Y - suspensions["REAR"].GetFloat("BASEY", 0.25f), go.Z + center);
                    _lookAt    = new Vector3(go.X, go.Y - suspensions["FRONT"].GetFloat("BASEY", 0.25f), go.Z + center);
                }

                await Task.Run(() => renderer.Initialize());

                renderer.SetCameraHigher = false;
                SetRendererSize(renderer);

                if (renderer.CarNode != null)
                {
                    // renderer.SelectSkin(car.SelectedSkin?.Id);
                    renderer.CarNode.BrakeLightsEnabled = true;
                    renderer.CarNode.CockpitLrActive    = true;
                    renderer.CarNode.CurrentLod         = renderer.CarNode.LodsCount > 1 ? 1 : 0;
                }

                await Task.Run(() => renderer.Draw());

                _renderer = renderer;

                _imageEx     = new D3DImageEx();
                Scene.Source = _imageEx;

                _setCount   = 0;
                _lastTarget = IntPtr.Zero;

                CompositionTargetEx.Rendering += OnRendering;
                UpdateCamera();
            } catch (Exception e) {
                NonfatalError.Notify("Can’t display chase camera preview", e);
            } finally {
                Progress.IsActive = false;
            }
        }
Пример #13
0
 protected DarkRendererCars(DarkKn5ObjectRenderer renderer, string presetableKeyValue)
 {
     _presetableKeyValue = presetableKeyValue;
     Renderer            = renderer;
 }
Пример #14
0
        private static int MainInner(string[] args)
        {
            var options = new Options();

            if (!Parser.Default.ParseArguments(args, options) || options.Help)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                var form = new Form {
                    Width           = 640,
                    Height          = 480,
                    FormBorderStyle = FormBorderStyle.FixedToolWindow,
                    StartPosition   = FormStartPosition.CenterScreen
                };

                var message = new TextBox {
                    Multiline   = true,
                    ReadOnly    = true,
                    BackColor   = Control.DefaultBackColor,
                    BorderStyle = BorderStyle.None,
                    Text        = options.GetUsage(),
                    Location    = new Point(20, 8),
                    Size        = new Size(form.ClientSize.Width - 40, form.ClientSize.Height - 16),
                    Padding     = new Padding(20),
                    Font        = new Font("Consolas", 9f),
                    TabStop     = false
                };

                var button = new Button {
                    Text     = "OK",
                    Location = new Point(form.ClientSize.Width / 2 - 80, form.ClientSize.Height - 40),
                    Size     = new Size(160, 32)
                };

                button.Click += (sender, eventArgs) => form.Close();

                form.Controls.Add(button);
                form.Controls.Add(message);
                form.ShowDialog();

                return(1);
            }

            var filename = Assembly.GetEntryAssembly().Location;

            if (options.Verbose || filename?.IndexOf("log", StringComparison.OrdinalIgnoreCase) != -1 ||
                filename.IndexOf("debug", StringComparison.OrdinalIgnoreCase) != -1)
            {
                var log = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location) ?? "", "Log.txt");
                try {
                    File.WriteAllBytes(log, new byte[0]);
                    RenderLogging.Initialize(log);
                } catch (Exception e) {
                    MessageBox.Show("Can’t setup logging: " + e, @"Oops!", MessageBoxButtons.OK);
                }
            }

            var inputItems = options.Items;

#if DEBUG
            inputItems = inputItems.Any() ? inputItems : new[] { DebugHelper.GetCarKn5(), DebugHelper.GetShowroomKn5() };
#endif

            if (inputItems.Count == 0)
            {
                var dialog = new OpenFileDialog {
                    Title  = @"Select KN5",
                    Filter = @"KN5 Files (*.kn5)|*.kn5"
                };
                if (dialog.ShowDialog() != DialogResult.OK)
                {
                    return(2);
                }

                inputItems = new[] { dialog.FileName };
            }

            var kn5File = inputItems.ElementAtOrDefault(0);
            if (kn5File == null || !File.Exists(kn5File))
            {
                MessageBox.Show(@"File is missing", @"Custom Showroom", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(3);
            }

            if (options.Mode == Mode.UpdateAmbientShadows)
            {
                MessageBox.Show("Started");
                var sw = Stopwatch.StartNew();
                UpdateAmbientShadows(kn5File);
                MessageBox.Show($@"Time taken: {sw.Elapsed.TotalSeconds:F2}s");
                return(0);
            }

            if (options.Mode == Mode.ExtractUv)
            {
                if (string.IsNullOrWhiteSpace(options.ExtractUvTexture))
                {
                    MessageBox.Show(@"Texture to extract is not specified", @"Custom Showroom", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return(4);
                }
                ExtractUv(kn5File, options.ExtractUvTexture);
                return(0);
            }

            var showroomKn5File = inputItems.ElementAtOrDefault(1);
            if (showroomKn5File == null && options.ShowroomId != null)
            {
                showroomKn5File = Path.Combine(
                    Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(kn5File))) ?? "",
                    "showroom", options.ShowroomId, options.ShowroomId + ".kn5");
            }

            if (!File.Exists(showroomKn5File))
            {
                showroomKn5File = null;
            }

            if (options.Mode == Mode.Lite)
            {
                using (var renderer = new ToolsKn5ObjectRenderer(new CarDescription(kn5File))) {
                    renderer.UseMsaa        = options.UseMsaa;
                    renderer.UseFxaa        = options.UseFxaa;
                    renderer.UseSsaa        = options.UseSsaa;
                    renderer.MagickOverride = options.MagickOverride;
                    new LiteShowroomWrapper(renderer).Run();
                }
            }
            else if (options.Mode == Mode.Dark)
            {
                using (var renderer = new DarkKn5ObjectRenderer(new CarDescription(kn5File), showroomKn5File)) {
                    renderer.UseSprite = true;
                    renderer.VisibleUi = true;

                    // renderer.FlatMirror = true;
                    renderer.UseMsaa = options.UseMsaa;
                    renderer.UseFxaa = options.UseFxaa;
                    renderer.UseSsaa = options.UseSsaa;

                    renderer.UseAo   = true;
                    renderer.UseSslr = true;
                    renderer.AoDebug = true;
                    renderer.AoType  = AoType.SsaoAlt;

                    renderer.MagickOverride = options.MagickOverride;
                    new LiteShowroomWrapper(renderer)
                    {
                        ReplaceableShowroom = true
                    }.Run();
                }
            }
            else if (options.Mode == Mode.TrackMap)
            {
                using (var renderer = new TrackMapPreparationRenderer(kn5File)) {
                    renderer.UseFxaa = options.UseFxaa;
                    renderer.SetFilter(new TrackMapRendererFilter());
                    new BaseKn5FormWrapper(renderer, "Track", 800, 800).Run();
                }
            }
            else
            {
                using (var renderer = new Kn5ObjectRenderer(kn5File, showroomKn5File)) {
                    renderer.UseFxaa = options.UseFxaa;
                    new FancyShowroomWrapper(renderer).Run();
                }
            }

            GC.Collect();
            GC.WaitForPendingFinalizers();
            return(0);
        }
Пример #15
0
        private static async Task ShowCarInShowroomAsync(string carId)
        {
            if (_showingCarInShowroom)
            {
                return;
            }
            _showingCarInShowroom = true;

            try {
                var temporaryDirectory = FilesStorage.Instance.GetTemporaryDirectory("Workshop", "Showroom", carId);
                var temporaryFilename  = Path.Combine(temporaryDirectory, "data.zip");

                byte[] modelData  = null;
                string mainSkidId = null;
                var    carData    = new VirtualDataWrapper();

                using (var waiting = WaitingDialog.Create("Loading showroom…")) {
                    await WorkshopHolder.Client.DownloadFileAsync($"/cars/{carId}/download-showroom", temporaryFilename, false,
                                                                  waiting, waiting.CancellationToken);

                    waiting.Report(AsyncProgressEntry.FromStringIndetermitate("Loading…"));

                    await Task.Run(() => {
                        using (var stream = File.OpenRead(temporaryFilename))
                            using (var archive = new ZipArchive(stream)) {
                                foreach (var entry in archive.Entries)
                                {
                                    if (entry.Length == 0)
                                    {
                                        continue;
                                    }
                                    if (entry.FullName == @"model.kn5")
                                    {
                                        modelData = entry.Open().ReadAsBytesAndDispose();
                                    }
                                    else if (entry.FullName.StartsWith(@"data"))
                                    {
                                        carData.Data[Path.GetFileName(entry.FullName)] = entry.Open().ReadAsStringAndDispose();
                                    }
                                    else
                                    {
                                        if (mainSkidId == null && entry.FullName.StartsWith(@"skins"))
                                        {
                                            mainSkidId = Path.GetFileName(Path.GetDirectoryName(entry.FullName));
                                        }
                                        var newFilename = Path.Combine(temporaryDirectory, entry.FullName);
                                        FileUtils.EnsureFileDirectoryExists(newFilename);
                                        entry.ExtractToFile(newFilename, true);
                                    }
                                    waiting.CancellationToken.ThrowIfCancellationRequested();
                                }
                            }
                    });

                    waiting.CancellationToken.ThrowIfCancellationRequested();
                }

                if (modelData == null)
                {
                    throw new Exception("Model is missing");
                }

                if (mainSkidId == null)
                {
                    throw new Exception("Skins are missing");
                }

                var description = CarDescription.FromKn5(Kn5.FromBytes(modelData), temporaryDirectory, carData);
                var renderer    = new DarkKn5ObjectRenderer(description)
                {
                    FlatMirror = true,
                    FlatMirrorReflectiveness = 0.3f,
                    FlatMirrorReflectedLight = true,
                    BackgroundColor          = Color.White,
                    BackgroundBrightness     = 0.05f,
                    LightBrightness          = 2f,
                    AmbientBrightness        = 2f,
                    AmbientUp                   = Color.FromArgb(0xEEEEEE),
                    AmbientDown                 = Color.FromArgb(0x333333),
                    UseDof                      = true,
                    UseAccumulationDof          = true,
                    AccumulationDofIterations   = 40,
                    AccumulationDofApertureSize = 0f,
                    UseSslr                     = true,
                    VisibleUi                   = false,
                    UseSprite                   = false,
                    AnyGround                   = false,
                    ToneMapping                 = ToneMappingFn.Uncharted2,
                    ToneExposure                = 1.2f,
                    ToneGamma                   = 1f,
                    ToneWhitePoint              = 2.2f,
                };
                renderer.SelectSkin(mainSkidId);
                await FormWrapperBase.PrepareAsync();

                var wrapper = new LiteShowroomFormWrapper(renderer);
                wrapper.Form.Icon = AppIconService.GetAppIcon();
                CustomShowroomWrapper.SetProperties(wrapper, renderer);
                wrapper.Run();
            } catch (Exception e) when(!e.IsCancelled())
            {
                Logging.Warning(e);
                NonfatalError.Notify("Failed to load showroom", e);
            } finally {
                _showingCarInShowroom = false;
            }
        }
Пример #16
0
        private static int MainInner(string[] args)
        {
            Acd.Factory = new AcdFactory();

            var argsFile = Path.Combine(Path.GetDirectoryName(Assembly.GetEntryAssembly()?.Location) ?? "", "Arguments.txt");

            if (File.Exists(argsFile))
            {
                args = File.ReadAllLines(argsFile).Concat(args).ToArray();
            }

            var options = new Options();

            if (!Parser.Default.ParseArguments(args, options) || options.Help)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                var form = new Form {
                    Width           = 640,
                    Height          = 480,
                    FormBorderStyle = FormBorderStyle.FixedToolWindow,
                    StartPosition   = FormStartPosition.CenterScreen
                };

                var message = new TextBox {
                    Multiline   = true,
                    ReadOnly    = true,
                    BackColor   = Control.DefaultBackColor,
                    BorderStyle = BorderStyle.None,
                    Text        = options.GetUsage(),
                    Location    = new Point(20, 8),
                    Size        = new Size(form.ClientSize.Width - 40, form.ClientSize.Height - 16),
                    Padding     = new Padding(20),
                    Font        = new Font("Consolas", 9f),
                    TabStop     = false
                };

                var button = new Button {
                    Text     = "OK",
                    Location = new Point(form.ClientSize.Width / 2 - 80, form.ClientSize.Height - 40),
                    Size     = new Size(160, 32)
                };

                button.Click += (sender, eventArgs) => form.Close();

                form.Controls.Add(button);
                form.Controls.Add(message);
                form.ShowDialog();

                return(1);
            }

            var filename = Assembly.GetEntryAssembly()?.Location;

            if (options.Verbose || filename.IndexOf("log", StringComparison.OrdinalIgnoreCase) != -1 ||
                filename.IndexOf("debug", StringComparison.OrdinalIgnoreCase) != -1)
            {
                // TODO
            }

            var inputItems = options.Items;

#if DEBUG
            inputItems             = inputItems.Any() ? inputItems : new[] { DebugHelper.GetCarKn5(), DebugHelper.GetShowroomKn5() };
            options.MagickOverride = true;
#endif

            if (inputItems.Count == 0)
            {
                var dialog = new OpenFileDialog {
                    Title  = @"Select KN5",
                    Filter = @"KN5 Files (*.kn5)|*.kn5"
                };
                if (dialog.ShowDialog() != DialogResult.OK)
                {
                    return(2);
                }

                inputItems = new[] { dialog.FileName };
            }

            var kn5File = inputItems.ElementAtOrDefault(0);
            if (kn5File == null || !File.Exists(kn5File))
            {
                MessageBox.Show(@"File is missing", @"Custom Showroom", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return(3);
            }

            if (options.Mode == Mode.UpdateAmbientShadows)
            {
                MessageBox.Show("Started");
                var sw = Stopwatch.StartNew();
                UpdateAmbientShadows(kn5File);
                MessageBox.Show($@"Time taken: {sw.Elapsed.TotalSeconds:F2}s");
                return(0);
            }

            if (options.Mode == Mode.ExtractUv)
            {
                if (string.IsNullOrWhiteSpace(options.ExtractUvTexture))
                {
                    MessageBox.Show(@"Texture to extract is not specified", @"Custom Showroom", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    return(4);
                }
                ExtractUv(kn5File, options.ExtractUvTexture);
                return(0);
            }

            var showroomKn5File = inputItems.ElementAtOrDefault(1);
            if (showroomKn5File == null && options.ShowroomId != null)
            {
                showroomKn5File = Path.Combine(
                    Path.GetDirectoryName(Path.GetDirectoryName(Path.GetDirectoryName(kn5File))) ?? "",
                    "showroom", options.ShowroomId, options.ShowroomId + ".kn5");
            }

            if (!File.Exists(showroomKn5File))
            {
                showroomKn5File = null;
            }

            if (options.Mode == Mode.Lite)
            {
                using (var renderer = new ToolsKn5ObjectRenderer(new CarDescription(kn5File))) {
                    renderer.UseMsaa        = options.UseMsaa;
                    renderer.UseFxaa        = options.UseFxaa;
                    renderer.UseSsaa        = options.UseSsaa;
                    renderer.MagickOverride = options.MagickOverride;
                    new LiteShowroomFormWrapper(renderer).Run();
                }
            }
            else if (options.Mode == Mode.Dark)
            {
                using (var renderer = new DarkKn5ObjectRenderer(new CarDescription(kn5File), showroomKn5File)) {
                    // UI
                    renderer.UseSprite = true;
                    renderer.VisibleUi = true;

                    /*renderer.UseDof = true;
                     * renderer.UseAccumulationDof = true;
                     * renderer.AccumulationDofApertureSize = 0f;
                     * renderer.AccumulationDofBokeh = false;
                     * renderer.AccumulationDofIterations = 100;*/

#if DEBUG
                    renderer.AoOpacity = 0.9f;
                    renderer.AoDebug   = true;
                    renderer.UseAo     = true;
                    renderer.AoType    = AoType.Hbao;

                    /*renderer.BackgroundColor = Color.Black;
                     * renderer.LightBrightness = 0.2f;
                     * renderer.AmbientBrightness = 0.2f;
                     * /*renderer.BackgroundBrightness = 0.02f;
                     * renderer.FlatMirror = true;*/
                    /*renderer.FlatMirrorReflectedLight = true;
                     * renderer.TryToGuessCarLights = true;
                     *
                     * renderer.FlatMirrorBlurred = true;
                     * renderer.FlatMirror = true;*/

                    //renderer.AddCar(new CarDescription(@"D:\Games\Assetto Corsa\content\cars\ferrari_f40\ferrari_f40.kn5"));
#else
                    // renderer.FlatMirror = true;
                    renderer.UseMsaa = options.UseMsaa;
                    renderer.UseFxaa = options.UseFxaa;
                    renderer.UseSsaa = options.UseSsaa;
#endif

                    renderer.MagickOverride = options.MagickOverride;
                    new LiteShowroomFormWrapper(renderer)
                    {
                        ReplaceableShowroom = true
                    }.Run(() => {
                        // ReSharper disable once AccessToDisposedClosure
                        var r = renderer;

                        if (r.CarNode != null)
                        {
                            // r.CarNode.AlignWheelsByData = true;
                        }
                    });
                }
            }
            else if (options.Mode == Mode.TrackMap)
            {
                using (var renderer = new TrackMapPreparationRenderer(kn5File)) {
                    renderer.UseFxaa = options.UseFxaa;
                    renderer.SetFilter(new TrackMapRendererFilter());
                    new BaseKn5FormWrapper(renderer, "Track", 800, 800).Run();
                }
            }

            GCHelper.CleanUp();
            return(0);
        }
Пример #17
0
 public DarkRendererCars(DarkKn5ObjectRenderer renderer) : this(renderer, DefaultPresetableKeyValue)
 {
     Initialize(false);
 }