private void AddComponent(dynamic componentsNode, YamlMappingNode node, Guid id) { // New format (1.9) DynamicYamlMapping mapping = (DynamicYamlMapping)componentsNode; mapping.AddChild(new YamlScalarNode(Guid.NewGuid().ToString("N")), node); node.Add("Id", id.ToString("D")); }
protected override void UpgradeAsset(AssetMigrationContext context, PackageVersion currentVersion, PackageVersion targetVersion, dynamic asset, PackageLoadingAssetFile assetFile, OverrideUpgraderHint overrideHint) { // SerializedVersion format changed during renaming upgrade. However, before this was merged back in master, some asset upgrader still with older version numbers were developed. var proceduralType = asset.Type; if (proceduralType.Node.Tag == "!ConeProceduralModel" && currentVersion != PackageVersion.Parse("0.0.6")) { if (proceduralType.LocalOffset == null) { dynamic offset = new DynamicYamlMapping(new YamlMappingNode()); offset.AddChild("X", 0.0f); offset.AddChild("Y", 0.5f); offset.AddChild("Z", 0.0f); proceduralType.AddChild("LocalOffset", offset); } } }
protected override void UpgradeAsset(AssetMigrationContext context, PackageVersion currentVersion, PackageVersion targetVersion, dynamic asset, PackageLoadingAssetFile assetFile, OverrideUpgraderHint overrideHint) { var hierarchy = asset.Hierarchy; var entities = (DynamicYamlArray)hierarchy.Parts; foreach (dynamic entityDesign in entities) { var entity = entityDesign.Entity; foreach (var component in entity.Components) { var componentTag = component.Node.Tag; if (componentTag == "!CharacterComponent") { var rads = component.MaxSlope; var angle = new DynamicYamlMapping(new YamlMappingNode()); angle.AddChild("Radians", rads); component.MaxSlope = angle; } } } }
protected override void UpgradeAsset(AssetMigrationContext context, PackageVersion currentVersion, PackageVersion targetVersion, dynamic asset, PackageLoadingAssetFile assetFile, OverrideUpgraderHint overrideHint) { // Replace ComputeCurveSamplerVector4 with ComputeCurveSamplerColor4. // Replace ComputeAnimationCurveVector4 with ComputeAnimationCurveColor4. // Replace Vector4 with Color4. Action <dynamic> updateSampler = sampler => { if (sampler == null || sampler.Node.Tag != "!ComputeCurveSamplerVector4") { return; } sampler.Node.Tag = "!ComputeCurveSamplerColor4"; var curve = sampler.Curve; curve.Node.Tag = "!ComputeAnimationCurveColor4"; foreach (var kf in curve.KeyFrames) { var colorValue = new DynamicYamlMapping(new YamlMappingNode()); colorValue.AddChild("R", kf.Value.X); colorValue.AddChild("G", kf.Value.Y); colorValue.AddChild("B", kf.Value.Z); colorValue.AddChild("A", kf.Value.W); kf.Value = colorValue; } }; var hierarchy = asset.Hierarchy; var entities = hierarchy.Entities; foreach (var entityAndDesign in entities) { var entity = entityAndDesign.Entity; foreach (var component in entity.Components) { var componentTag = component.Node.Tag; if (componentTag != "!ParticleSystemComponent") { continue; } var particleSystem = component.ParticleSystem; if (particleSystem == null) { continue; } foreach (var emitter in particleSystem.Emitters) { // Updaters foreach (var updater in emitter.Updaters) { var updaterTag = updater.Node.Tag; if (updaterTag != "!UpdaterColorOverTime") { continue; } // Update the samplers updateSampler(updater.SamplerMain); updateSampler(updater.SamplerOptional); } } } } }
protected override void UpgradeAsset(AssetMigrationContext context, PackageVersion currentVersion, PackageVersion targetVersion, dynamic asset, PackageLoadingAssetFile assetFile, OverrideUpgraderHint overrideHint) { dynamic newSource = new DynamicYamlMapping(new YamlMappingNode()); var assetName = (asset.FontName != null) ? (string)asset.FontName : null; var assetSource = (asset.Source != null) ? (string)asset.Source : null; // First check if the asset has a valid source if (assetSource != null && !assetSource.IsNullOrEmpty() && !assetSource.Equals("null")) { newSource.Node.Tag = "!FileFontProvider"; newSource.AddChild("Source", assetSource); } // Only if the asset doesn't have a valid source can it be a system font else if (assetName != null && !assetName.IsNullOrEmpty() && !assetName.Equals("null")) { newSource.Node.Tag = "!SystemFontProvider"; newSource.AddChild("FontName", assetName); if (asset.Style != null) { newSource.AddChild("Style", asset.Style); } } asset.RemoveChild("FontName"); asset.RemoveChild("Source"); asset.RemoveChild("Style"); asset.AddChild("FontSource", newSource); if (asset.FontType != null) { var fontType = (string)asset.FontType; asset.RemoveChild("FontType"); dynamic newType = new DynamicYamlMapping(new YamlMappingNode()); if (fontType.Equals("Dynamic")) { newType.Node.Tag = "!RuntimeRasterizedSpriteFontType"; if (asset.Size != null) { newType.AddChild("Size", asset.Size); } if (asset.AntiAlias != null) { newType.AddChild("AntiAlias", asset.AntiAlias); } } else if (fontType.Equals("SDF")) { newType.Node.Tag = "!SignedDistanceFieldSpriteFontType"; if (asset.Size != null) { newType.AddChild("Size", asset.Size); } if (asset.CharacterSet != null) { newType.AddChild("CharacterSet", asset.CharacterSet); } if (asset.CharacterRegions != null) { newType.AddChild("CharacterRegions", asset.CharacterRegions); } } else { newType.Node.Tag = "!OfflineRasterizedSpriteFontType"; if (asset.Size != null) { newType.AddChild("Size", asset.Size); } if (asset.CharacterSet != null) { newType.AddChild("CharacterSet", asset.CharacterSet); } if (asset.CharacterRegions != null) { newType.AddChild("CharacterRegions", asset.CharacterRegions); } if (asset.AntiAlias != null) { newType.AddChild("AntiAlias", asset.AntiAlias); } if (asset.IsPremultiplied != null) { newType.AddChild("IsPremultiplied", asset.IsPremultiplied); } } asset.AddChild("FontType", newType); } asset.RemoveChild("IsPremultiplied"); asset.RemoveChild("AntiAlias"); asset.RemoveChild("UseKerning"); asset.RemoveChild("Size"); asset.RemoveChild("CharacterSet"); asset.RemoveChild("CharacterRegions"); }
private void UpgradeNavigationBoundingBox(IEnumerable <PackageLoadingAssetFile> navigationMeshes, IEnumerable <PackageLoadingAssetFile> scenes) { foreach (var navigationMesh in navigationMeshes) { using (var navmeshYamlAsset = navigationMesh.AsYamlAsset()) { var navmeshAsset = navmeshYamlAsset.DynamicRootNode; var sceneId = (string)navmeshAsset.Scene; var sceneName = sceneId.Split(':').Last(); var matchingScene = scenes.Where(x => x.AssetLocation == sceneName).FirstOrDefault(); if (matchingScene != null) { var boundingBox = navmeshAsset.BoundingBox; var boundingBoxMin = new Vector3((float)boundingBox.Minimum.X, (float)boundingBox.Minimum.Y, (float)boundingBox.Minimum.Z); var boundingBoxMax = new Vector3((float)boundingBox.Maximum.X, (float)boundingBox.Maximum.Y, (float)boundingBox.Maximum.Z); var boundingBoxSize = (boundingBoxMax - boundingBoxMin) * 0.5f; var boundingBoxCenter = boundingBoxSize + boundingBoxMin; using (var matchingSceneYamlAsset = matchingScene.AsYamlAsset()) { var sceneAsset = matchingSceneYamlAsset.DynamicRootNode; var parts = (DynamicYamlArray)sceneAsset.Hierarchy.Parts; var rootParts = (DynamicYamlArray)sceneAsset.Hierarchy.RootPartIds; dynamic newEntity = new DynamicYamlMapping(new YamlMappingNode()); newEntity.Id = Guid.NewGuid().ToString(); newEntity.Name = "Navigation bounding box"; var components = new DynamicYamlMapping(new YamlMappingNode()); // Transform component dynamic transformComponent = new DynamicYamlMapping(new YamlMappingNode()); transformComponent.Node.Tag = "!TransformComponent"; transformComponent.Id = Guid.NewGuid().ToString(); transformComponent.Position = new DynamicYamlMapping(new YamlMappingNode { { "X", $"{boundingBoxCenter.X}" }, { "Y", $"{boundingBoxCenter.Y}" }, { "Z", $"{boundingBoxCenter.Z}" } }); transformComponent.Rotation = new DynamicYamlMapping(new YamlMappingNode { { "X", "0.0" }, { "Y", "0.0" }, { "Z", "0.0" }, { "W", "0.0" } }); transformComponent.Scale = new DynamicYamlMapping(new YamlMappingNode { { "X", "1.0" }, { "Y", "1.0" }, { "Z", "1.0" } }); transformComponent.Children = new DynamicYamlMapping(new YamlMappingNode()); components.AddChild(Guid.NewGuid().ToString("N"), transformComponent); // Bounding box component dynamic boxComponent = new DynamicYamlMapping(new YamlMappingNode()); boxComponent.Id = Guid.NewGuid().ToString(); boxComponent.Node.Tag = "!Xenko.Navigation.NavigationBoundingBoxComponent,Xenko.Navigation"; boxComponent.Size = new DynamicYamlMapping(new YamlMappingNode { { "X", $"{boundingBoxSize.X}" }, { "Y", $"{boundingBoxSize.Y}" }, { "Z", $"{boundingBoxSize.Z}" } });; components.AddChild(Guid.NewGuid().ToString("N"), boxComponent); newEntity.Components = components; dynamic part = new DynamicYamlMapping(new YamlMappingNode()); part.Entity = newEntity; parts.Add(part); rootParts.Add((string)newEntity.Id); // Currently need to sort children by Id List <YamlNode> partsList = (List <YamlNode>)parts.Node.Children; var entityKey = new YamlScalarNode("Entity"); var idKey = new YamlScalarNode("Id"); partsList.Sort((x, y) => { var entityA = (YamlMappingNode)((YamlMappingNode)x).Children[entityKey]; var entityB = (YamlMappingNode)((YamlMappingNode)y).Children[entityKey]; var guidA = new Guid(((YamlScalarNode)entityA.Children[idKey]).Value); var guidB = new Guid(((YamlScalarNode)entityB.Children[idKey]).Value); return(guidA.CompareTo(guidB)); }); } } } } }
protected override void UpgradeAsset(AssetMigrationContext context, PackageVersion currentVersion, PackageVersion targetVersion, dynamic asset, PackageLoadingAssetFile assetFile, OverrideUpgraderHint overrideHint) { var hierarchy = asset.Hierarchy; var entities = (DynamicYamlArray)hierarchy.Entities; foreach (dynamic entityAndDesign in entities) { var entity = entityAndDesign.Entity; foreach (var component in entity.Components) { var componentTag = component.Node.Tag; if (componentTag == "!ParticleSystemComponent") { dynamic particleSystem = component.ParticleSystem; if (particleSystem != null) { foreach (dynamic emitter in particleSystem.Emitters) { // Lifetime changed from: float (ParticleMinLifetime), float (ParticleMaxLifetime) -> Vector2 (ParticleLifetime) dynamic lifetime = new DynamicYamlMapping(new YamlMappingNode()); lifetime.AddChild("X", emitter.ParticleMinLifetime); lifetime.AddChild("Y", emitter.ParticleMaxLifetime); emitter.AddChild("ParticleLifetime", lifetime); emitter.RemoveChild("ParticleMinLifetime"); emitter.RemoveChild("ParticleMaxLifetime"); // Initializers foreach (dynamic initializer in emitter.Initializers) { var initializerTag = initializer.Node.Tag; if (initializerTag == "!InitialRotationSeed") { dynamic angle = new DynamicYamlMapping(new YamlMappingNode()); angle.AddChild("X", initializer.AngularRotationMin); angle.AddChild("Y", initializer.AngularRotationMax); initializer.AddChild("AngularRotation", angle); initializer.RemoveChild("AngularRotationMin"); initializer.RemoveChild("AngularRotationMax"); } } // Updaters foreach (dynamic updater in emitter.Updaters) { var updaterTag = updater.Node.Tag; if (updaterTag == "!UpdaterCollider") { var isSolid = (bool)updater.IsSolid; updater.AddChild("IsHollow", !isSolid); updater.RemoveChild("IsSolid"); } } } } } } } }