Exemplo n.º 1
0
        public void OneTimeSetup()
        {
            m_Resources = ScriptableObject.CreateInstance <TestResources>();

            // gather clip dependencies
            var allClips = typeof(TestResources).GetFields(BindingFlags.Instance | BindingFlags.Public)
                           .Where(f => f.FieldType == typeof(AnimationClip))
                           .Select(f => (ClipPath)(f.GetValue(m_Resources) as AnimationClip))
                           .ToArray();
            var allPrefabs = typeof(TestResources).GetFields(BindingFlags.Instance | BindingFlags.Public)
                             .Where(f => f.FieldType == typeof(GameObject))
                             .Select(f => (PrefabPath)(f.GetValue(m_Resources) as GameObject))
                             .ToArray();
            var allScenes = typeof(TestResources).GetFields(BindingFlags.Instance | BindingFlags.Public)
                            .Where(f => f.FieldType == typeof(SceneAsset))
                            .Select(f => (ScenePath)(f.GetValue(m_Resources) as SceneAsset))
                            .ToArray();

            AnimationClipUpgrader.GetClipDependencyMappings(allClips, allPrefabs, out m_ClipsToPrefabDependents, out m_PrefabsToClipDependencies);
            AnimationClipUpgrader.GetClipDependencyMappings(allClips, allScenes, out m_ClipsToSceneDependents, out m_ScenesToClipDependencies);

            // sorting function to ease comparisons when actual/expected mismatch
            int CompareKeyValuePair((IAssetPath, IAssetPath) a, (IAssetPath, IAssetPath) b) =>
            string.Compare($"{a.Item1}{a.Item2}", $"{b.Item1}{b.Item2}", StringComparison.Ordinal);

            // validate clip/prefab dependencies
            GetExpectedPrefabDependencies(out var expectedClipToPrefabDependents, out var expectedPrefabsToClipDependencies);

            var actualClipToPrefabs   = m_ClipsToPrefabDependents.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();
            var expectedClipToPrefabs = expectedClipToPrefabDependents.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();

            actualClipToPrefabs.Sort((a, b) => CompareKeyValuePair(a, b));
            expectedClipToPrefabs.Sort((a, b) => CompareKeyValuePair(a, b));
            Assume.That(actualClipToPrefabs, Is.EquivalentTo(expectedClipToPrefabs));

            var actualPrefabsToClips   = m_PrefabsToClipDependencies.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();
            var expectedPrefabsToClips = expectedPrefabsToClipDependencies.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();

            actualPrefabsToClips.Sort((a, b) => CompareKeyValuePair(a, b));
            expectedPrefabsToClips.Sort((a, b) => CompareKeyValuePair(a, b));
            Assume.That(actualPrefabsToClips, Is.EquivalentTo(expectedPrefabsToClips));

            // validate clip/scene dependencies
            GetExpectedSceneDependencies(out var expectedClipToSceneDependents, out var expectedScenesToClipDependencies);

            var actualClipsToScenes  = m_ClipsToSceneDependents.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();
            var expectedClipToScenes = expectedClipToSceneDependents.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();

            actualClipsToScenes.Sort((a, b) => CompareKeyValuePair(a, b));
            expectedClipToScenes.Sort((a, b) => CompareKeyValuePair(a, b));
            Assume.That(actualClipsToScenes, Is.EquivalentTo(expectedClipToScenes));

            var actualScenesToClips   = m_ScenesToClipDependencies.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();
            var expectedScenesToClips = expectedScenesToClipDependencies.SelectMany(kv => kv.Value.Select(v => (kv.Key, v))).ToList();

            actualScenesToClips.Sort((a, b) => CompareKeyValuePair(a, b));
            expectedScenesToClips.Sort((a, b) => CompareKeyValuePair(a, b));
            Assume.That(actualScenesToClips, Is.EquivalentTo(expectedScenesToClips));
        }
Exemplo n.º 2
0
        public void GetAssetDataForClipsFiltered_WhenClipPathContainsMultipleClips_ReturnsMultipleClips()
        {
            var childAnimationClip = m_Resources.Clip_ChildAsset_Animation_WithMaterialProperties as AnimationClip;
            var childAnimatorClip  = m_Resources.Clip_ChildAsset_Animator_WithMaterialProperties as AnimationClip;
            var parentPath         = new ClipPath {
                Path = AssetDatabase.GetAssetPath(m_Resources.Clip_ParentAsset)
            };

            var result     = AnimationClipUpgrader.GetAssetDataForClipsFiltered(new[] { parentPath });
            var actualKeys = result.Keys.Select(k => k.Clip);

            Assert.That(actualKeys, Is.EquivalentTo(new[] { childAnimationClip, childAnimatorClip }));
        }
Exemplo n.º 3
0
        public void GetAssetDataForClipsFiltered_RemovesClipsWithoutMaterialAnimation()
        {
            var animationClip = m_Resources.Clip_Animation_WithMaterialProperties_PotentiallyUpgradable;
            var animatorClip  = m_Resources.Clip_Animator_WithMaterialProperties_PotentiallyUpgradable;
            var timelineClip  = m_Resources.Clip_Timeline_WithMaterialProperties_PotentiallyUpgradable;

            var result = AnimationClipUpgrader.GetAssetDataForClipsFiltered(new ClipPath[]
            {
                m_Resources.Clip_Animation_WithMaterialProperties_PotentiallyUpgradable,
                m_Resources.Clip_Animation_WithoutMaterialProperties,
                m_Resources.Clip_Animator_WithMaterialProperties_PotentiallyUpgradable,
                m_Resources.Clip_Animator_WithoutMaterialProperties,
                m_Resources.Clip_Timeline_WithMaterialProperties_PotentiallyUpgradable,
                m_Resources.Clip_Timeline_WithoutMaterialProperties
            });
            var actualKeys = result.Keys.Select(k => k.Clip);

            Assert.That(actualKeys, Is.EquivalentTo(new[] { animationClip, animatorClip, timelineClip }));
        }
Exemplo n.º 4
0
        public SerializedShaderPropertyUsage GatherClipsUsageInDependentPrefabs_WhenUsingSpecifiedClipProvider_ReturnsExpectedUsage(
            string prefabName,
            string clipName
            )
        {
            var clipPath =
                (ClipPath)(typeof(TestResources).GetField(clipName, BindingFlags.Public | BindingFlags.Instance)?.GetValue(m_Resources) as AnimationClip);

            Assume.That(clipPath.Path, Is.Not.Null.And.Not.Empty);

            var prefabPath =
                (PrefabPath)(typeof(TestResources).GetField(prefabName, BindingFlags.Public | BindingFlags.Instance)?.GetValue(m_Resources) as GameObject);

            Assume.That(prefabPath.Path, Is.Not.Null.And.Not.Empty);
            var clipPaths = new[] { clipPath };

            AnimationClipUpgrader.GetClipDependencyMappings(clipPaths, new[] { prefabPath }, out var clipDependents, out var prefabDependencies);
            var materialUpgrader = new MaterialUpgrader();

            materialUpgrader.RenameShader(
                m_Resources.Material_Legacy_Upgradable.shader.name, m_Resources.Material_URP.shader.name
                );
            materialUpgrader.RenameColor("_Color", "_BaseColor");
            materialUpgrader.RenameFloat("_MainTex_ST", "_BaseMap_ST");
            var allUpgradePathsToNewShaders = new Dictionary <string, IReadOnlyList <MaterialUpgrader> >
            {
                { m_Resources.Material_URP.shader.name, new[] { materialUpgrader } }
            };

            var clipData = AnimationClipUpgrader.GetAssetDataForClipsFiltered(clipPaths);

            AnimationClipUpgrader.GatherClipsUsageInDependentPrefabs(
                clipDependents,
                prefabDependencies,
                clipData,
                allUpgradePathsToNewShaders,
                upgradePathsUsedByMaterials: null
                );

            return(clipData.Values.Single().Usage);
        }