예제 #1
0
            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"));
            }
예제 #2
0
            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;
                        }
                    }
                }
            }
예제 #4
0
            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);
                            }
                        }
                    }
                }
            }
예제 #5
0
            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");
            }
예제 #6
0
        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));
                            });
                        }
                    }
                }
            }
        }
예제 #7
0
            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");
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }