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)); }
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(); }
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")); }
public static CarDescription FromKn5(Kn5 kn5) { return(new CarDescription(kn5.OriginalFilename) { Kn5Loaded = kn5 }); }
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(); } }
private static void FixFrensel(Kn5 kn5) { foreach (var property in GetFresnelProperties(kn5).Where(x => x.ValueA <= 0.4)) { property.ValueA *= 2f; } }
public static CarDescription FromKn5(Kn5 kn5, string carDirectory, DataWrapper data = null) { return(new CarDescription(kn5.OriginalFilename, carDirectory, data) { Kn5Loaded = kn5 }); }
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")); }
private static IEnumerable <PaintableItem> GuessPaintableItems([CanBeNull] Kn5 kn5) { foreach (var item in GuessPaintableItemsInner(kn5).NonNull()) { item.Guessed = true; yield return(item); } }
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); } }
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; }
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; * }*/ }
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); }
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); } }
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; * }*/ }
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); }
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))); }
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)); }
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; } }
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); } }
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); }
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))); }
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; } }
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), }); }
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))); }
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)); }
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); }
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; }
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); } }
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(); } }