Esempio n. 1
0
        public static Task FixMissingKsSkyBoxShader(string filename, CancellationToken cancellation)
        {
            return(Task.Run(() => {
                var backup = FileUtils.EnsureUnique(filename + @".bak");
                File.Move(filename, backup);
                cancellation.ThrowIfCancellationRequested();

                var kn5 = Kn5.FromFile(backup);
                cancellation.ThrowIfCancellationRequested();

                var changed = false;
                foreach (var material in kn5.Materials.Values)
                {
                    if (material.ShaderName == @"ksSkyBox")
                    {
                        material.ShaderName = @"ksSky";
                        material.TextureMappings = new Kn5Material.TextureMapping[0];
                        changed = true;
                    }
                }

                if (!changed)
                {
                    throw new InformativeException("Nothing to fix", "None of materials is using ksSkyBox shader");
                }

                cancellation.ThrowIfCancellationRequested();
                kn5.SaveRecyclingOriginal(filename);
            }, cancellation));
        }
Esempio n. 2
0
        public BakedShadowsRendererViewModel([CanBeNull] BaseRenderer renderer, [NotNull] Kn5 kn5, [NotNull] string textureName,
                                             [CanBeNull] CarObject car)
        {
            _renderer    = renderer;
            _kn5         = kn5;
            _textureName = textureName;
            _car         = car;
            _saveable    = new SaveHelper <SaveableData>("_carTextureDialog", () => new SaveableData {
                From       = From,
                To         = To,
                Brightness = Brightness,
                Gamma      = Gamma,
                Ambient    = Ambient,
                Iterations = Iterations,
                ShadowBias = ShadowBias,
            }, o => {
                From       = o.From;
                To         = o.To;
                Brightness = o.Brightness;
                Gamma      = o.Gamma;
                Ambient    = o.Ambient;
                Iterations = o.Iterations;
                ShadowBias = o.ShadowBias;
            });

            _saveable.Initialize();
        }
Esempio n. 3
0
        public void ExportMultiplyMaterialsColladaTest()
        {
            var kn5 = Kn5.FromFile(TestDir + "/kn5/multiply_materials.kn5");

            kn5.ExportCollada(TestDir + "/kn5/multiply_materials-out.dae");
            Assert.AreEqual(LoadColladaData(TestDir + "/kn5/multiply_materials-ref.dae"), LoadColladaData(TestDir + "/kn5/multiply_materials-out.dae"));
        }
Esempio n. 4
0
 public static CarDescription FromKn5(Kn5 kn5)
 {
     return(new CarDescription(kn5.OriginalFilename)
     {
         Kn5Loaded = kn5
     });
 }
Esempio n. 5
0
        public static async Task Run(TrackObjectBase track)
        {
            var modelsFilename = track.ModelsFilename;

            Logging.Debug(modelsFilename);

            string kn5Filename = null;

            if (!File.Exists(modelsFilename))
            {
                modelsFilename = null;
                kn5Filename    = Path.Combine(track.Location, track.Id + ".kn5");
                if (!File.Exists(kn5Filename))
                {
                    ModernDialog.ShowMessage("Model not found");
                    return;
                }
            }

            TrackMapPreparationRenderer renderer = null;

            try {
                using (WaitingDialog.Create("Loading model…")) {
                    renderer = modelsFilename == null ?
                               new TrackMapPreparationRenderer(await Task.Run(() => Kn5.FromFile(kn5Filename))) :
                               new TrackMapPreparationRenderer(await Task.Run(() => TrackComplexModelDescription.CreateLoaded(modelsFilename)));
                }

                var wrapper = new TrackMapRendererWrapper(track, renderer);
                wrapper.Form.Icon = AppIconService.GetAppIcon();
                wrapper.Run();
            } finally {
                renderer?.Dispose();
            }
        }
Esempio n. 6
0
 private static void FixFrensel(Kn5 kn5)
 {
     foreach (var property in GetFresnelProperties(kn5).Where(x => x.ValueA <= 0.4))
     {
         property.ValueA *= 2f;
     }
 }
Esempio n. 7
0
 public static CarDescription FromKn5(Kn5 kn5, string carDirectory, DataWrapper data = null)
 {
     return(new CarDescription(kn5.OriginalFilename, carDirectory, data)
     {
         Kn5Loaded = kn5
     });
 }
Esempio n. 8
0
        public void ExportBonesColladaTest()
        {
            var kn5 = Kn5.FromFile(TestDir + "/kn5/bones.kn5");

            kn5.ExportCollada(TestDir + "/kn5/bones-out.dae");
            Assert.AreEqual(LoadColladaData(TestDir + "/kn5/bones-ref.dae"), LoadColladaData(TestDir + "/kn5/bones-out.dae"));
        }
Esempio n. 9
0
 private static IEnumerable <PaintableItem> GuessPaintableItems([CanBeNull] Kn5 kn5)
 {
     foreach (var item in GuessPaintableItemsInner(kn5).NonNull())
     {
         item.Guessed = true;
         yield return(item);
     }
 }
Esempio n. 10
0
 public Kn5RenderableCollider(Kn5 kn5, Matrix matrix, bool asyncTexturesLoading = true, bool allowSkinnedObjects = false)
     : base(kn5, matrix, asyncTexturesLoading, allowSkinnedObjects)
 {
     foreach (var mesh in Meshes)
     {
         mesh.SetTransparent(true);
     }
 }
Esempio n. 11
0
 public void GetTexture(string textureName, Func <int, Stream> writer)
 {
     _textureName = textureName;
     _fn          = writer;
     Kn5.FromFile(_kn5, this, SkippingMaterialLoader.Instance, SkippingNodeLoader.Instance);
     _textureName = null;
     _fn          = null;
 }
Esempio n. 12
0
 public Kn5RenderableDriver(Kn5 kn5, Matrix matrix, string overridesDirectory, bool asyncTexturesLoading = true,
                            bool asyncOverrideTexturesLoading = false, IKn5ToRenderableConverter converter = null)
     : base(kn5, matrix, overridesDirectory, asyncTexturesLoading, asyncOverrideTexturesLoading, converter)
 {
     /*foreach (var dummy in this.GetAllChildren().OfType<RenderableList>()) {
      *  dummy.HighlightBoundingBoxes = true;
      * }*/
 }
Esempio n. 13
0
        private static PaintableItem FindQuery([NotNull] Kn5 kn5, Func <string, PaintableItem> prepare, params string[] query)
        {
            var texture = query.Select(x => RegexFromQuery.IsQuery(x)
                    ? kn5.Textures.Keys.FirstOrDefault(RegexFromQuery.Create(x, StringMatchMode.CompleteMatch, false).IsMatch)
                    : kn5.Textures.Keys.Contains(x) ? x : null).FirstOrDefault(x => x != null);

            return(texture != null?prepare(texture) : null);
        }
Esempio n. 14
0
 public Kn5RenderableCollider(Kn5 kn5, Matrix matrix, bool asyncTexturesLoading = true, IKn5ToRenderableConverter converter = null)
     : base(kn5, matrix, asyncTexturesLoading, converter)
 {
     foreach (var mesh in Meshes)
     {
         mesh.SetTransparent(true);
     }
 }
Esempio n. 15
0
 public Kn5RenderableDriver(Kn5 kn5, Matrix matrix, string overridesDirectory, bool asyncTexturesLoading = true,
                            bool asyncOverrideTexturesLoading = false, bool allowSkinnedObjects = false)
     : base(kn5, matrix, overridesDirectory, asyncTexturesLoading, asyncOverrideTexturesLoading, allowSkinnedObjects)
 {
     /*foreach (var dummy in this.GetAllChildren().OfType<RenderableList>()) {
      *  dummy.HighlightBoundingBoxes = true;
      * }*/
 }
Esempio n. 16
0
        private static async Task <ArgumentHandleResult> ProcessInputFile(string filename)
        {
            bool isDirectory;

            try {
                if (!FileUtils.Exists(filename))
                {
                    return(ArgumentHandleResult.Failed);
                }
                isDirectory = FileUtils.IsDirectory(filename);
            } catch (Exception) {
                return(ArgumentHandleResult.Failed);
            }

            if (!isDirectory && filename.EndsWith(@".acreplay", StringComparison.OrdinalIgnoreCase) ||
                Path.GetDirectoryName(filename)?.Equals(AcPaths.GetReplaysDirectory(), StringComparison.OrdinalIgnoreCase) == true)
            {
                await GameWrapper.StartReplayAsync(new Game.StartProperties(new Game.ReplayProperties {
                    Filename = filename
                }));

                return(ArgumentHandleResult.Successful);
            }

            if (!isDirectory && filename.EndsWith(@".kn5", StringComparison.OrdinalIgnoreCase))
            {
                if ((Keyboard.Modifiers == ModifierKeys.Alt || Keyboard.Modifiers == ModifierKeys.Shift) && SettingsHolder.Common.DeveloperMode)
                {
                    try {
                        Kn5.FbxConverterLocation = PluginsManager.Instance.GetPluginFilename("FbxConverter", "FbxConverter.exe");
                        var kn5         = Kn5.FromFile(filename);
                        var destination = FileUtils.EnsureUnique(Path.Combine(Path.GetDirectoryName(filename) ?? @".",
                                                                              $"unpacked-{Path.GetFileName(filename)}"));
                        var name = kn5.RootNode.Name.StartsWith(@"FBX: ") ? kn5.RootNode.Name.Substring(5) :
                                   @"model.fbx";
                        Directory.CreateDirectory(destination);
                        await kn5.ExportFbxWithIniAsync(Path.Combine(destination, name));

                        var textures = Path.Combine(destination, "texture");
                        Directory.CreateDirectory(textures);
                        await kn5.ExportTexturesAsync(textures);

                        Process.Start(destination);
                    } catch (Exception e) {
                        Logging.Error(e);
                        return(ArgumentHandleResult.FailedShow);
                    }
                }
                else
                {
                    await CustomShowroomWrapper.StartAsync(filename);
                }

                return(ArgumentHandleResult.Successful);
            }

            return(ArgumentHandleResult.FailedShow);
        }
Esempio n. 17
0
        public void SkipTexturesTest()
        {
            var f = @"D:\Games\Assetto Corsa\content\cars\peugeot_504\peugeot_504.kn5";

            var normal         = Kn5.FromFile(f);
            var withoutTexture = Kn5.FromFile(f, SkippingTextureLoader.Instance);

            Assert.IsTrue(normal.Nodes.Select(x => x.Name).SequenceEqual(withoutTexture.Nodes.Select(x => x.Name)));
        }
Esempio n. 18
0
 private static IEnumerable <Kn5Material.ShaderProperty> GetFresnelProperties(Kn5 kn5)
 {
     return(kn5.Materials.Values
            .Where(value => value.ShaderName.Contains(@"MultiMap") &&
                   value.GetPropertyByName("sunSpecular")?.ValueA > 0.5f &&
                   value.GetPropertyByName("useDetail")?.ValueA >= 1f)
            .Select(x => x.GetPropertyByName("fresnelMaxLevel"))
            .Where(x => x != null && x.ValueA >= 0.2));
 }
Esempio n. 19
0
        private void LoadDriverModel()
        {
            if (_driver != null)
            {
                return;
            }

            var driverDescription = _carData.GetDriverDescription();

            if (driverDescription == null || !File.Exists(_driverModelFilename))
            {
                return;
            }

            var driver = new Kn5RenderableDriver(Kn5.FromFile(_driverModelFilename), Matrix.Translation(driverDescription.Offset),
                                                 _currentSkin == null ? null : Path.Combine(_skinsDirectory, _currentSkin),
                                                 AsyncTexturesLoading, _asyncOverrideTexturesLoading, _converter)
            {
                LiveReload     = LiveReload,
                MagickOverride = MagickOverride
            };

            _driver = driver;

            if (File.Exists(_driverHierarchyFilename))
            {
                driver.AlignNodes(Knh.FromFile(_driverHierarchyFilename));
            }

            _driverSteerAnimator = Lazier.Create(() => {
                var animator = CreateAnimator(RootDirectory, driverDescription.SteerAnimation,
                                              clampEnabled: false, skipFixed: false);
                if (animator == null)
                {
                    return(null);
                }

                animator.Reset += OnSteerAnimatorReset;
                return(animator);
            });
            _driverSteerLock = driverDescription.SteerAnimationLock;

            driver.LocalMatrix = RootObject.LocalMatrix;
            Add(driver);
            ObjectsChanged?.Invoke(this, EventArgs.Empty);

            if (_steerDeg != 0 || OptionFixKnh)
            {
                UpdateDriverSteerAnimation(GetSteerOffset());
            }

            if (DebugMode)
            {
                driver.DebugMode = true;
            }
        }
Esempio n. 20
0
        public static void FixLighting(ShowroomObject showroom)
        {
            var kn5Filename = showroom.Kn5Filename;

            using (var newFile = FileUtils.RecycleOriginal(kn5Filename)) {
                var kn5 = Kn5.FromFile(kn5Filename);
                FixVertices(kn5.RootNode, Matrix.Identity);
                kn5.Save(newFile.Filename);
            }
        }
Esempio n. 21
0
        public static bool FixBlurredWheels(string acRoot, string carName)
        {
            var kn5File = FileUtils.GetMainCarFilename(acRoot, carName);

            var kn5    = Kn5.FromFile(kn5File);
            var wheels = 0;

            string[] normalRims;
            string[] blurredRims;
            try {
                var normalRimsList  = new List <string>();
                var blurredRimsList = new List <string>();
                foreach (var section in new IniFile(FileUtils.GetCarDirectory(acRoot, carName), "blurred_objects.ini").Values)
                {
                    if (Math.Abs(section.GetDouble("MIN_SPEED", 0d)) < 0.001)
                    {
                        normalRimsList.Add(section.GetPossiblyEmpty("NAME"));
                    }
                    else
                    {
                        blurredRimsList.Add(section.GetPossiblyEmpty("NAME"));
                    }
                }

                normalRims  = normalRimsList.ToArray();
                blurredRims = blurredRimsList.ToArray();
            } catch (Exception) {
                normalRims  = new [] { "RIM_LF", "RIM_RF", "RIM_LR", "RIM_RR" };
                blurredRims = new [] { "RIM_BLUR_LF", "RIM_BLUR_RF", "RIM_BLUR_LR", "RIM_BLUR_RR" };
            }

            foreach (var node in kn5.Nodes.Where(node => node.NodeClass == Kn5NodeClass.Base))
            {
                if (!node.Active && normalRims.Contains(node.Name))
                {
                    node.Active = true;
                    wheels++;
                }
                else if (node.Active && blurredRims.Contains(node.Name))
                {
                    node.Active = false;
                    wheels++;
                }
            }

            if (wheels == 0)
            {
                return(false);
            }

            FileUtils.Recycle(kn5File);
            kn5.SaveAll(kn5File);
            return(true);
        }
Esempio n. 22
0
        private ContentRepairSuggestion TestSuspensionNodes(CarObject car, Kn5 kn5)
        {
            if (SuspensionNodes.All(name => kn5.FirstByName(name) != null))
            {
                return(null);
            }

            return(new ContentObsoleteSuggestion("Suspension nodes missing",
                                                 "Might cause crashes, especially in showroom.",
                                                 (p, c) => FixAsync(car, FixSuspensionNodes, p, c)));
        }
Esempio n. 23
0
        public static Kn5RenderableShowroom Load(Device device, string filename, Matrix matrix, bool allowSkinnedObjects = false)
        {
            var loader = new TextureLoader(device);

            try {
                return(new Kn5RenderableShowroom(Kn5.FromFile(filename, loader), matrix, loader, allowSkinnedObjects));
            } catch {
                loader.Dispose();
                throw;
            }
        }
Esempio n. 24
0
        private IEnumerable <TrackComplexModelEntry> LoadModels()
        {
            var directory = Path.GetDirectoryName(_modelsIniFilename) ?? "";

            return(from section in new IniFile(_modelsIniFilename).GetSections("MODEL")
                   let rot = section.GetSlimVector3("ROTATION")
                             select new TrackComplexModelEntry {
                Kn5 = Kn5.FromFile(Path.Combine(directory, section.GetNonEmpty("FILE") ?? "")),
                Matrix = Matrix.Translation(section.GetSlimVector3("POSITION")) * Matrix.RotationYawPitchRoll(rot.X, rot.Y, rot.Z),
            });
        }
Esempio n. 25
0
        private ObsoletableAspect TestSuspensionNodes(CarObject car, Kn5 kn5)
        {
            if (SuspensionNodes.All(name => kn5.FirstByName(name) != null))
            {
                return(null);
            }

            return(new ObsoletableAspect("Suspension nodes missing",
                                         "Might cause crashes, especially in showroom.",
                                         (p, c) => FixAsync(car, FixSuspensionNodes, true, p, c)));
        }
Esempio n. 26
0
        public static IEnumerable <PaintableItem> GetPaintableItems(string carId, [CanBeNull] Kn5 kn5)
        {
            if (!PluginsManager.Instance.IsPluginEnabled(MagickPluginHelper.PluginId))
            {
                return(new PaintableItem[0]);
            }

            var result = GetPaintableItems(carId, kn5, new List <string>(2), true).ToList();

            result.Sort(PaintableItemComparer.Instance);
            return(result.Distinct(PaintableItemComparer.Instance));
        }
Esempio n. 27
0
        public Kn5RenderableFile(Kn5 kn5, Matrix matrix, bool asyncTexturesLoading = true, bool allowSkinnedObjects = false) : base(kn5.OriginalFilename, matrix)
        {
            AllowSkinnedObjects  = allowSkinnedObjects;
            OriginalFile         = kn5;
            AsyncTexturesLoading = asyncTexturesLoading;

            var obj = Convert(kn5.RootNode, AllowSkinnedObjects);

            RootObject = obj as RenderableList ?? new RenderableList {
                obj
            };
            Add(RootObject);
        }
Esempio n. 28
0
            public CarTextureDialogViewModel([CanBeNull] BaseRenderer renderer, [CanBeNull] CarSkinObject activeSkin, [NotNull] Kn5 kn5, [NotNull] string textureName)
            {
                _renderer   = renderer;
                _activeSkin = activeSkin;
                _kn5        = kn5;
                TextureName = textureName;

                var format = Regex.Match(textureName, @"(?<=\.)([a-zA-Z]{3,4})$").Value;

                TextureFormat = string.IsNullOrWhiteSpace(format) ? null : format.ToUpperInvariant();

                byte[] data;
                Data = kn5.TexturesData.TryGetValue(textureName, out data) ? data : null;
            }
Esempio n. 29
0
        private static void FixSuspensionNodes(Kn5 kn5)
        {
            foreach (var name in SuspensionNodes.Where(name => kn5.FirstByName(name) == null))
            {
                var node  = Kn5Node.CreateBaseNode(name);
                var wheel = kn5.FirstByName(name.Replace("SUSP", "WHEEL"))?.Transform;
                if (wheel != null)
                {
                    node.Transform = wheel;
                }

                kn5.RootNode.Children.Add(node);
            }
        }
Esempio n. 30
0
        private static async Task RunInner(TrackObjectBase track, bool aiLane)
        {
            string modelsFilename = null, kn5Filename = null, aiLaneFilename = null;

            if (!aiLane)
            {
                modelsFilename = track.ModelsFilename;
                if (!File.Exists(modelsFilename))
                {
                    modelsFilename = null;
                    kn5Filename    = Path.Combine(track.Location, track.Id + ".kn5");
                    if (!File.Exists(kn5Filename))
                    {
                        ModernDialog.ShowMessage("Model not found");
                        return;
                    }
                }
            }
            else
            {
                aiLaneFilename = track.AiLaneFastFilename;
                if (!File.Exists(aiLaneFilename))
                {
                    ModernDialog.ShowMessage("AI lane not found");
                    return;
                }
            }

            await PrepareAsync();

            TrackMapPreparationRenderer renderer = null;

            try {
                using (WaitingDialog.Create("Loading model…")) {
                    renderer = aiLaneFilename == null ?
                               modelsFilename == null ?
                               new TrackMapPreparationRenderer(await Task.Run(() => Kn5.FromFile(kn5Filename))) :
                               new TrackMapPreparationRenderer(await Task.Run(() => TrackComplexModelDescription.CreateLoaded(modelsFilename))) :
                               new TrackMapPreparationRenderer(await Task.Run(() => AiSpline.FromFile(aiLaneFilename)));
                }

                var wrapper = new TrackMapRendererWrapper(track, renderer);
                wrapper.Form.Icon = AppIconService.GetAppIcon();
                wrapper.Run();
            } catch (Exception e) {
                NonfatalError.Notify("Can’t update map", e);
            } finally {
                renderer?.Dispose();
            }
        }