コード例 #1
0
        private static Texture2D TexEnvTexture(UnityTexEnv texEnv)
        {
            Texture2D tex = null;

            if (texEnv != null)
            {
                texEnv.m_Texture.TryGet(out tex);
            }
            return(tex);
        }
コード例 #2
0
        private static TexturedMaterial FindMaterialInfo([NotNull] IReadOnlyList <SerializedFile> assetFiles, [NotNull] Mesh mesh, int meshIndex, [NotNull] TexturedMaterialExtraProperties extraProperties)
        {
            SkinnedMeshRenderer meshRenderer = null;

            foreach (var assetFile in assetFiles)
            {
                foreach (var obj in assetFile.Objects)
                {
                    if (obj.type != ClassIDType.SkinnedMeshRenderer)
                    {
                        continue;
                    }

                    var renderer = obj as SkinnedMeshRenderer;

                    Debug.Assert(renderer != null);

                    if (renderer.m_Mesh.m_PathID == mesh.m_PathID)
                    {
                        meshRenderer = renderer;
                        break;
                    }
                }
            }

            if (meshRenderer == null)
            {
                throw new KeyNotFoundException($"Found no SkinnedMeshRenderer associated with this mesh ({mesh.m_Name}).");
            }

            Debug.Assert(meshRenderer.m_Materials != null);

            if (meshRenderer.m_Materials.Length <= meshIndex)
            {
                throw new FormatException("No corresponding material is associated with this SkinnedMeshRenderer.");
            }

            var      materialPtr = meshRenderer.m_Materials[meshIndex];
            Material material    = null;

            foreach (var assetFile in assetFiles)
            {
                foreach (var obj in assetFile.Objects)
                {
                    if (obj.type != ClassIDType.Material)
                    {
                        continue;
                    }

                    var mat = obj as Material;

                    Debug.Assert(mat != null);

                    if (mat.m_PathID == materialPtr.m_PathID)
                    {
                        material = mat;
                        break;
                    }
                }
            }

            if (material == null)
            {
                throw new KeyNotFoundException("Main material is not found by path ID.");
            }

            Debug.Assert(material.m_SavedProperties != null);
            Debug.Assert(material.m_SavedProperties.m_TexEnvs != null);
            Debug.Assert(material.m_SavedProperties.m_TexEnvs.Length > 0);

            var         kvPairs    = material.m_SavedProperties.m_TexEnvs;
            UnityTexEnv mainTexEnv = null;
            UnityTexEnv subTexEnv  = null;

            foreach (var kv in kvPairs)
            {
                if (kv.Key.Equals("_MainTex", StringComparison.Ordinal))
                {
                    mainTexEnv = kv.Value;
                }
                else if (kv.Key.Equals("_SubTex", StringComparison.Ordinal))
                {
                    subTexEnv = kv.Value;
                }
            }

            if (mainTexEnv == null)
            {
                throw new KeyNotFoundException("Main texture is missing.");
            }

            Texture2D mainTexture = null;

            foreach (var assetFile in assetFiles)
            {
                foreach (var obj in assetFile.Objects)
                {
                    if (obj.type != ClassIDType.Texture2D)
                    {
                        continue;
                    }

                    var tex = obj as Texture2D;

                    Debug.Assert(tex != null);

                    if (tex.m_PathID == mainTexEnv.m_Texture.m_PathID)
                    {
                        mainTexture = tex;
                        break;
                    }
                }
            }

            if (mainTexture == null)
            {
                throw new KeyNotFoundException("Main texture is not found by path ID.");
            }

            Texture2D subTexture = null;

            if (subTexEnv != null)
            {
                foreach (var assetFile in assetFiles)
                {
                    foreach (var obj in assetFile.Objects)
                    {
                        if (obj.type != ClassIDType.Texture2D)
                        {
                            continue;
                        }

                        var tex = obj as Texture2D;

                        Debug.Assert(tex != null);

                        if (tex.m_PathID == subTexEnv.m_Texture.m_PathID)
                        {
                            subTexture = tex;
                            break;
                        }
                    }
                }

                if (subTexture == null)
                {
                    throw new KeyNotFoundException("Sub texture is not found by path ID.");
                }
            }

            return(new TexturedMaterial(material.m_Name, mainTexture, subTexture, extraProperties));
        }
コード例 #3
0
        private static TexturedMaterial FindMaterialInfo([NotNull] SerializedObjectsLookup serializedObjectsLookup, [NotNull] Mesh mesh, int meshIndex, [NotNull] TexturedMaterialExtraProperties extraProperties)
        {
            var meshRenderer = serializedObjectsLookup.Find <SkinnedMeshRenderer>(renderer => renderer.m_Mesh.m_PathID == mesh.m_PathID);

            if (meshRenderer == null)
            {
                throw new KeyNotFoundException($"Found no SkinnedMeshRenderer associated with this mesh ({mesh.m_Name}).");
            }

            Debug.Assert(meshRenderer.m_Materials != null);

            if (meshRenderer.m_Materials.Length <= meshIndex)
            {
                throw new FormatException("No corresponding material is associated with this SkinnedMeshRenderer.");
            }

            var materialPtr = meshRenderer.m_Materials[meshIndex];

            serializedObjectsLookup.TryGet(materialPtr, out var material);

            if (material == null)
            {
                throw new KeyNotFoundException("Main material is not found by path ID.");
            }

            Debug.Assert(material.m_SavedProperties != null);
            Debug.Assert(material.m_SavedProperties.m_TexEnvs != null);
            Debug.Assert(material.m_SavedProperties.m_TexEnvs.Length > 0);

            var         kvPairs    = material.m_SavedProperties.m_TexEnvs;
            UnityTexEnv mainTexEnv = null;
            UnityTexEnv subTexEnv  = null;

            foreach (var kv in kvPairs)
            {
                if (kv.Key.Equals("_MainTex", StringComparison.Ordinal))
                {
                    mainTexEnv = kv.Value;
                }
                else if (kv.Key.Equals("_SubTex", StringComparison.Ordinal))
                {
                    subTexEnv = kv.Value;
                }

                if (mainTexEnv != null && subTexEnv != null)
                {
                    break;
                }
            }

            var hasMainTexture = mainTexEnv != null;
            var hasSubTexture  = subTexEnv != null;

            Texture2D mainTexture = null;

            if (hasMainTexture)
            {
                serializedObjectsLookup.TryGet(mainTexEnv.m_Texture, out mainTexture);

                if (mainTexture == null)
                {
                    var pptrStr = mainTexEnv.m_Texture.GetDebugDescription();
                    Trace.WriteLine($"Warning: Main texture is not found by path ID, use default \"white\" instead. {pptrStr}");
                }
            }

            Texture2D subTexture = null;

            if (hasSubTexture)
            {
                serializedObjectsLookup.TryGet(subTexEnv.m_Texture, out subTexture);

                if (subTexture == null)
                {
                    var pptrStr = subTexEnv.m_Texture.GetDebugDescription();
                    Trace.WriteLine($"Warning: Sub texture is not found by path ID, use default \"white\" instead. {pptrStr}");
                }
            }

            return(new TexturedMaterial(material.m_Name, hasMainTexture, mainTexture, hasSubTexture, subTexture, extraProperties));
        }