Esempio n. 1
0
        private void DeoptimizeTransformHierarchy()
        {
            if (avatar == null)
            {
                return;
            }
            // 1. Figure out the skeletonPaths from the unstripped avatar
            var skeletonPaths = new List <string>();

            foreach (var id in avatar.m_Avatar.m_AvatarSkeleton.m_ID)
            {
                var path = avatar.FindBonePath(id);
                skeletonPaths.Add(path);
            }
            // 2. Restore the original transform hierarchy
            // Prerequisite: skeletonPaths follow pre-order traversal
            var rootFrame = FrameList[0];

            rootFrame.ClearChild();
            for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there.
            {
                var           path = skeletonPaths[i];
                var           strs = path.Split('/');
                string        transformName;
                ImportedFrame parentFrame;
                if (strs.Length == 1)
                {
                    transformName = path;
                    parentFrame   = rootFrame;
                }
                else
                {
                    transformName = strs.Last();
                    var parentFrameName = strs[strs.Length - 2];
                    parentFrame = ImportedHelpers.FindFrame(parentFrameName, rootFrame);
                }

                var skeletonPose = avatar.m_Avatar.m_DefaultPose;
                var xform        = skeletonPose.m_X[i];
                if (!(xform.t is Vector3 t))
                {
                    var v4 = (Vector4)xform.t;
                    t = (Vector3)v4;
                }
                if (!(xform.s is Vector3 s))
                {
                    var v4 = (Vector4)xform.s;
                    s = (Vector3)v4;
                }
                var curTransform = new Transform(t, xform.q, s);
                var frame        = ConvertFrame(curTransform, transformName);
                parentFrame.AddChild(frame);
            }
        }
Esempio n. 2
0
        private string GetMeshPath(Transform meshTransform)
        {
            meshTransform.m_GameObject.TryGetGameObject(out var m_GameObject);
            var curFrame = ImportedHelpers.FindChild(m_GameObject.m_Name, FrameList[0]) ?? ImportedHelpers.FindFrame(m_GameObject.m_Name, FrameList[0]);
            var path = curFrame.Name;
            while (curFrame.Parent != null)
            {
                curFrame = curFrame.Parent;
                path = curFrame.Name + "/" + path;
            }

            return path;
        }
Esempio n. 3
0
        private string GetMeshPath(Transform meshTransform)
        {
            meshTransform.m_GameObject.TryGet(out var m_GameObject);
            var curFrame = ImportedHelpers.FindChildOrRoot(m_GameObject.m_Name, RootFrame);
            var path     = curFrame.Name;

            while (curFrame.Parent != null)
            {
                curFrame = curFrame.Parent;
                path     = curFrame.Name + "/" + path;
            }

            return(path);
        }
Esempio n. 4
0
        private void DeoptimizeTransformHierarchy()
        {
            if (avatar == null)
            {
                throw new Exception("Transform hierarchy has been optimized, but can't find Avatar to deoptimize.");
            }
            // 1. Figure out the skeletonPaths from the unstripped avatar
            var skeletonPaths = new List <string>();

            foreach (var id in avatar.m_Avatar.m_AvatarSkeleton.m_ID)
            {
                var path = avatar.FindBonePath(id);
                skeletonPaths.Add(path);
            }
            // 2. Restore the original transform hierarchy
            // Prerequisite: skeletonPaths follow pre-order traversal
            for (var i = 1; i < skeletonPaths.Count; i++) // start from 1, skip the root transform because it will always be there.
            {
                var           path = skeletonPaths[i];
                var           strs = path.Split('/');
                string        transformName;
                ImportedFrame parentFrame;
                if (strs.Length == 1)
                {
                    transformName = path;
                    parentFrame   = RootFrame;
                }
                else
                {
                    transformName = strs.Last();
                    var parentFrameName = strs[strs.Length - 2];
                    parentFrame = ImportedHelpers.FindChildOrRoot(parentFrameName, RootFrame);
                }

                var skeletonPose = avatar.m_Avatar.m_DefaultPose;
                var xform        = skeletonPose.m_X[i];

                var frame = ImportedHelpers.FindChildOrRoot(transformName, RootFrame);
                if (frame != null)
                {
                    SetFrame(frame, xform.t, xform.q, xform.s);
                    parentFrame.AddChild(frame);
                }
                else
                {
                    frame = CreateFrame(transformName, xform.t, xform.q, xform.s);
                    parentFrame.AddChild(frame);
                }
            }
        }
Esempio n. 5
0
        private string GetTransformPath(Transform meshTransform)
        {
            assetsfileList.TryGetGameObject(meshTransform.m_GameObject, out var m_GameObject);
            var curFrame = ImportedHelpers.FindFrame(m_GameObject.m_Name, FrameList[0]);
            var path     = curFrame.Name;

            while (curFrame.Parent != null)
            {
                curFrame = curFrame.Parent;
                path     = curFrame.Name + "/" + path;
            }

            return(path);
        }
Esempio n. 6
0
        private void ConvertTexture2D(Texture2D m_Texture2D, string name)
        {
            var iTex = ImportedHelpers.FindTexture(name, TextureList);

            if (iTex != null)
            {
                return;
            }

            var stream = m_Texture2D.ConvertToStream(imageFormat, true);

            if (stream != null)
            {
                using (stream)
                {
                    iTex = new ImportedTexture(stream, name);
                    TextureList.Add(iTex);
                }
            }
        }
Esempio n. 7
0
        private void ConvertTexture2D(Texture2D tex2D, string name)
        {
            var iTex = ImportedHelpers.FindTexture(name, TextureList);

            if (iTex != null)
            {
                return;
            }

            using (var memStream = new MemoryStream())
            {
                var bitmap = new Texture2DConverter(tex2D).ConvertToBitmap(true);
                if (bitmap != null)
                {
                    bitmap.Save(memStream, ImageFormat.Png);
                    memStream.Position = 0;
                    iTex = new ImportedTexture(memStream, name);
                    TextureList.Add(iTex);
                }
            }
        }
Esempio n. 8
0
        private void ConvertTexture2D(Texture2D m_Texture2D, string name)
        {
            var iTex = ImportedHelpers.FindTexture(name, TextureList);

            if (iTex != null)
            {
                return;
            }

            var bitmap = m_Texture2D.ConvertToBitmap(true);

            if (bitmap != null)
            {
                using (var stream = new MemoryStream())
                {
                    switch (imageFormat)
                    {
                    case "BMP":
                        bitmap.Save(stream, ImageFormat.Bmp);
                        break;

                    case "PNG":
                        bitmap.Save(stream, ImageFormat.Png);
                        break;

                    case "JPEG":
                        bitmap.Save(stream, ImageFormat.Jpeg);
                        break;

                    case "TGA":
                        var tga = new TGA(bitmap);
                        tga.Save(stream);
                        break;
                    }
                    iTex = new ImportedTexture(stream, name);
                    TextureList.Add(iTex);
                    bitmap.Dispose();
                }
            }
        }
Esempio n. 9
0
        private void ConvertTexture2D(Texture2D m_Texture2D, string name)
        {
            var iTex = ImportedHelpers.FindTexture(name, TextureList);

            if (iTex != null)
            {
                return;
            }

            var bitmap = m_Texture2D.ConvertToBitmap(true);

            if (bitmap != null)
            {
                using (var stream = new MemoryStream())
                {
                    bitmap.Save(stream, ImageFormat.Png);
                    iTex = new ImportedTexture(stream, name);
                    TextureList.Add(iTex);
                    bitmap.Dispose();
                }
            }
        }
Esempio n. 10
0
        private ImportedMaterial ConvertMaterial(Material mat)
        {
            ImportedMaterial iMat;

            if (mat != null)
            {
                iMat = ImportedHelpers.FindMaterial(mat.m_Name, MaterialList);
                if (iMat != null)
                {
                    return(iMat);
                }
                iMat      = new ImportedMaterial();
                iMat.Name = mat.m_Name;
                foreach (var col in mat.m_Colors)
                {
                    var color = new Color4(col.second[0], col.second[1], col.second[2], col.second[3]);
                    switch (col.first)
                    {
                    case "_Color":
                        iMat.Diffuse = color;
                        break;

                    case "_SColor":
                        iMat.Ambient = color;
                        break;

                    case "_EmissionColor":
                        iMat.Emissive = color;
                        break;

                    case "_SpecColor":
                        iMat.Specular = color;
                        break;

                    case "_RimColor":
                    case "_OutlineColor":
                    case "_ShadowColor":
                        break;
                    }
                }

                foreach (var flt in mat.m_Floats)
                {
                    switch (flt.first)
                    {
                    case "_Shininess":
                        iMat.Power = flt.second;
                        break;

                    case "_RimPower":
                    case "_Outline":
                        break;
                    }
                }

                //textures
                iMat.Textures   = new string[5];
                iMat.TexOffsets = new Vector2[5];
                iMat.TexScales  = new Vector2[5];
                foreach (var texEnv in mat.m_TexEnvs)
                {
                    Texture2D tex2D = null;
                    if (assetsfileList.TryGetPD(texEnv.m_Texture, out var TexturePD) && TexturePD.Type == ClassIDReference.Texture2D)//TODO other Texture
                    {
                        tex2D = new Texture2D(TexturePD, true);
                    }

                    if (tex2D == null)
                    {
                        continue;
                    }
                    int dest = texEnv.name == "_MainTex" ? 0 : texEnv.name == "_BumpMap" ? 4 : texEnv.name.Contains("Spec") ? 2 : texEnv.name.Contains("Norm") ? 3 : -1;
                    if (dest < 0 || iMat.Textures[dest] != null)
                    {
                        continue;
                    }
                    iMat.Textures[dest]   = TexturePD.Text + ".png";
                    iMat.TexOffsets[dest] = new Vector2(texEnv.m_Offset[0], texEnv.m_Offset[1]);
                    iMat.TexScales[dest]  = new Vector2(texEnv.m_Scale[0], texEnv.m_Scale[1]);
                    ConvertTexture2D(tex2D, iMat.Textures[dest]);
                }

                MaterialList.Add(iMat);
            }
            else
            {
                iMat = new ImportedMaterial();
            }
            return(iMat);
        }
Esempio n. 11
0
        private void ConvertMeshRenderer(MeshRenderer meshR)
        {
            var mesh = GetMesh(meshR);

            if (mesh == null)
            {
                return;
            }
            var iMesh = new ImportedMesh();

            assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject2);
            assetsfileList.TryGetTransform(m_GameObject2.m_Transform, out var meshTransform);
            iMesh.Name        = GetTransformPath(meshTransform);
            iMesh.SubmeshList = new List <ImportedSubmesh>();
            var subHashSet   = new HashSet <int>();
            var combine      = false;
            int firstSubMesh = 0;

            if (meshR.m_StaticBatchInfo?.subMeshCount > 0)
            {
                firstSubMesh = meshR.m_StaticBatchInfo.firstSubMesh;
                var finalSubMesh = meshR.m_StaticBatchInfo.firstSubMesh + meshR.m_StaticBatchInfo.subMeshCount;
                for (int i = meshR.m_StaticBatchInfo.firstSubMesh; i < finalSubMesh; i++)
                {
                    subHashSet.Add(i);
                }
                combine = true;
            }
            else if (meshR.m_SubsetIndices?.Length > 0)
            {
                firstSubMesh = (int)meshR.m_SubsetIndices.Min(x => x);
                foreach (var index in meshR.m_SubsetIndices)
                {
                    subHashSet.Add((int)index);
                }
                combine = true;
            }
            int firstFace = 0;

            for (int i = 0; i < mesh.m_SubMeshes.Count; i++)
            {
                int numFaces = (int)mesh.m_SubMeshes[i].indexCount / 3;
                if (subHashSet.Count > 0 && !subHashSet.Contains(i))
                {
                    firstFace += numFaces;
                    continue;
                }
                var      submesh  = mesh.m_SubMeshes[i];
                var      iSubmesh = new ImportedSubmesh();
                Material mat      = null;
                if (i - firstSubMesh < meshR.m_Materials.Length)
                {
                    if (assetsfileList.TryGetPD(meshR.m_Materials[i - firstSubMesh], out var MaterialPD))
                    {
                        mat = new Material(MaterialPD);
                    }
                }
                ImportedMaterial iMat = ConvertMaterial(mat);
                iSubmesh.Material   = iMat.Name;
                iSubmesh.VertexList = new List <ImportedVertex>((int)submesh.vertexCount);
                var vertexColours = mesh.m_Colors != null && (mesh.m_Colors.Length == mesh.m_VertexCount * 3 || mesh.m_Colors.Length == mesh.m_VertexCount * 4);
                for (var j = mesh.m_SubMeshes[i].firstVertex; j < mesh.m_SubMeshes[i].firstVertex + mesh.m_SubMeshes[i].vertexCount; j++)
                {
                    var iVertex = vertexColours ? new ImportedVertexWithColour() : new ImportedVertex();
                    //Vertices
                    int c = 3;
                    if (mesh.m_Vertices.Length == mesh.m_VertexCount * 4)
                    {
                        c = 4;
                    }
                    iVertex.Position = new Vector3(-mesh.m_Vertices[j * c], mesh.m_Vertices[j * c + 1], mesh.m_Vertices[j * c + 2]);
                    //Normals
                    if (mesh.m_Normals?.Length > 0)
                    {
                        if (mesh.m_Normals.Length == mesh.m_VertexCount * 3)
                        {
                            c = 3;
                        }
                        else if (mesh.m_Normals.Length == mesh.m_VertexCount * 4)
                        {
                            c = 4;
                        }
                        iVertex.Normal = new Vector3(-mesh.m_Normals[j * c], mesh.m_Normals[j * c + 1], mesh.m_Normals[j * c + 2]);
                    }
                    //Colors
                    if (vertexColours)
                    {
                        if (mesh.m_Colors.Length == mesh.m_VertexCount * 3)
                        {
                            ((ImportedVertexWithColour)iVertex).Colour = new Color4(mesh.m_Colors[j * 3], mesh.m_Colors[j * 3 + 1], mesh.m_Colors[j * 3 + 2], 1.0f);
                        }
                        else
                        {
                            ((ImportedVertexWithColour)iVertex).Colour = new Color4(mesh.m_Colors[j * 4], mesh.m_Colors[j * 4 + 1], mesh.m_Colors[j * 4 + 2], mesh.m_Colors[j * 4 + 3]);
                        }
                    }
                    //UV
                    if (mesh.m_UV1 != null && mesh.m_UV1.Length == mesh.m_VertexCount * 2)
                    {
                        iVertex.UV = new[] { mesh.m_UV1[j * 2], -mesh.m_UV1[j * 2 + 1] };
                    }
                    else if (mesh.m_UV2 != null && mesh.m_UV2.Length == mesh.m_VertexCount * 2)
                    {
                        iVertex.UV = new[] { mesh.m_UV2[j * 2], -mesh.m_UV2[j * 2 + 1] };
                    }
                    //Tangent
                    if (mesh.m_Tangents != null && mesh.m_Tangents.Length == mesh.m_VertexCount * 4)
                    {
                        iVertex.Tangent = new Vector4(-mesh.m_Tangents[j * 4], mesh.m_Tangents[j * 4 + 1], mesh.m_Tangents[j * 4 + 2], mesh.m_Tangents[j * 4 + 3]);
                    }
                    //BoneInfluence
                    if (mesh.m_Skin.Length > 0)
                    {
                        var inf = mesh.m_Skin[j];
                        iVertex.BoneIndices = new byte[inf.Count];
                        iVertex.Weights     = new float[inf.Count];
                        for (var k = 0; k < inf.Count; k++)
                        {
                            iVertex.BoneIndices[k] = (byte)inf[k].boneIndex;
                            iVertex.Weights[k]     = inf[k].weight;
                        }
                    }
                    iSubmesh.VertexList.Add(iVertex);
                }
                //Face
                iSubmesh.FaceList = new List <ImportedFace>(numFaces);
                var end = firstFace + numFaces;
                for (int f = firstFace; f < end; f++)
                {
                    var face = new ImportedFace();
                    face.VertexIndices    = new int[3];
                    face.VertexIndices[0] = (int)(mesh.m_Indices[f * 3 + 2] - submesh.firstVertex);
                    face.VertexIndices[1] = (int)(mesh.m_Indices[f * 3 + 1] - submesh.firstVertex);
                    face.VertexIndices[2] = (int)(mesh.m_Indices[f * 3] - submesh.firstVertex);
                    iSubmesh.FaceList.Add(face);
                }
                firstFace = end;
                iMesh.SubmeshList.Add(iSubmesh);
            }

            if (meshR is SkinnedMeshRenderer sMesh)
            {
                //Bone
                iMesh.BoneList = new List <ImportedBone>(sMesh.m_Bones.Length);

                /*if (sMesh.m_Bones.Length >= 256)
                 * {
                 *  throw new Exception("Too many bones (" + mesh.m_BindPose.Length + ")");
                 * }*/
                for (int i = 0; i < sMesh.m_Bones.Length; i++)
                {
                    var bone = new ImportedBone();
                    if (assetsfileList.TryGetTransform(sMesh.m_Bones[i], out var m_Transform))
                    {
                        if (assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out var m_GameObject))
                        {
                            bone.Name = m_GameObject.m_Name;
                        }
                    }
                    //No first use m_BoneNameHashes, because it may be wrong
                    if (string.IsNullOrEmpty(bone.Name))
                    {
                        var boneHash = mesh.m_BoneNameHashes[i];
                        bone.Name = GetNameFromBonePathHashes(boneHash);
                        if (string.IsNullOrEmpty(bone.Name))
                        {
                            bone.Name = avatar?.FindBoneName(boneHash);
                        }
                        if (string.IsNullOrEmpty(bone.Name))
                        {
                            //throw new Exception("A Bone could neither be found by hash in Avatar nor by index in SkinnedMeshRenderer.");
                            continue;
                        }
                    }
                    var om = new float[4, 4];
                    var m  = mesh.m_BindPose[i];
                    om[0, 0]    = m[0, 0];
                    om[0, 1]    = -m[1, 0];
                    om[0, 2]    = -m[2, 0];
                    om[0, 3]    = m[3, 0];
                    om[1, 0]    = -m[0, 1];
                    om[1, 1]    = m[1, 1];
                    om[1, 2]    = m[2, 1];
                    om[1, 3]    = m[3, 1];
                    om[2, 0]    = -m[0, 2];
                    om[2, 1]    = m[1, 2];
                    om[2, 2]    = m[2, 2];
                    om[2, 3]    = m[3, 2];
                    om[3, 0]    = -m[0, 3];
                    om[3, 1]    = m[1, 3];
                    om[3, 2]    = m[2, 3];
                    om[3, 3]    = m[3, 3];
                    bone.Matrix = om;
                    iMesh.BoneList.Add(bone);
                }

                //Morphs
                if (mesh.m_Shapes != null)
                {
                    foreach (var channel in mesh.m_Shapes.channels)
                    {
                        morphChannelInfo[channel.nameHash] = channel.name;
                    }
                    if (mesh.m_Shapes.shapes.Count > 0)
                    {
                        ImportedMorph morph     = null;
                        string        lastGroup = "";
                        for (int i = 0; i < mesh.m_Shapes.channels.Count; i++)
                        {
                            string group = BlendShapeNameGroup(mesh, i);
                            if (group != lastGroup)
                            {
                                morph = new ImportedMorph();
                                MorphList.Add(morph);
                                morph.Name         = iMesh.Name;
                                morph.ClipName     = group;
                                morph.Channels     = new List <Tuple <float, int, int> >(mesh.m_Shapes.channels.Count);
                                morph.KeyframeList = new List <ImportedMorphKeyframe>(mesh.m_Shapes.shapes.Count);
                                lastGroup          = group;
                            }

                            morph.Channels.Add(new Tuple <float, int, int>(i < sMesh.m_BlendShapeWeights.Count ? sMesh.m_BlendShapeWeights[i] : 0f, morph.KeyframeList.Count, mesh.m_Shapes.channels[i].frameCount));
                            for (int frameIdx = 0; frameIdx < mesh.m_Shapes.channels[i].frameCount; frameIdx++)
                            {
                                ImportedMorphKeyframe keyframe = new ImportedMorphKeyframe();
                                keyframe.Name = BlendShapeNameExtension(mesh, i) + "_" + frameIdx;
                                int shapeIdx = mesh.m_Shapes.channels[i].frameIndex + frameIdx;
                                keyframe.VertexList           = new List <ImportedVertex>((int)mesh.m_Shapes.shapes[shapeIdx].vertexCount);
                                keyframe.MorphedVertexIndices = new List <ushort>((int)mesh.m_Shapes.shapes[shapeIdx].vertexCount);
                                keyframe.Weight = shapeIdx < mesh.m_Shapes.fullWeights.Count ? mesh.m_Shapes.fullWeights[shapeIdx] : 100f;
                                int lastVertIndex = (int)(mesh.m_Shapes.shapes[shapeIdx].firstVertex + mesh.m_Shapes.shapes[shapeIdx].vertexCount);
                                for (int j = (int)mesh.m_Shapes.shapes[shapeIdx].firstVertex; j < lastVertIndex; j++)
                                {
                                    var            morphVert = mesh.m_Shapes.vertices[j];
                                    ImportedVertex vert      = GetSourceVertex(iMesh.SubmeshList, (int)morphVert.index);
                                    ImportedVertex destVert  = new ImportedVertex();
                                    Vector3        morphPos  = morphVert.vertex;
                                    morphPos.X       *= -1;
                                    destVert.Position = vert.Position + morphPos;
                                    Vector3 morphNormal = morphVert.normal;
                                    morphNormal.X  *= -1;
                                    destVert.Normal = morphNormal;
                                    Vector4 morphTangent = new Vector4(morphVert.tangent, 0);
                                    morphTangent.X  *= -1;
                                    destVert.Tangent = morphTangent;
                                    keyframe.VertexList.Add(destVert);
                                    keyframe.MorphedVertexIndices.Add((ushort)morphVert.index);
                                }

                                morph.KeyframeList.Add(keyframe);
                            }
                        }
                    }
                }
            }

            //TODO
            if (combine)
            {
                assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject);
                foreach (var root in FrameList)
                {
                    var frame = ImportedHelpers.FindFrame(m_GameObject.m_Name, root);
                    if (frame?.Parent != null)
                    {
                        var parent = frame;
                        while (true)
                        {
                            if (parent.Parent != null)
                            {
                                parent = parent.Parent;
                            }
                            else
                            {
                                frame.LocalRotation = parent.LocalRotation;
                                frame.LocalScale    = parent.LocalScale;
                                frame.LocalPosition = parent.LocalPosition;
                                break;
                            }
                        }
                    }
                    break;
                }
            }

            MeshList.Add(iMesh);
        }
Esempio n. 12
0
        private ImportedMaterial ConvertMaterial(Material mat)
        {
            ImportedMaterial iMat;

            if (mat != null)
            {
                iMat = ImportedHelpers.FindMaterial(mat.m_Name, MaterialList);
                if (iMat != null)
                {
                    return(iMat);
                }
                iMat      = new ImportedMaterial();
                iMat.Name = mat.m_Name;
                foreach (var col in mat.m_SavedProperties.m_Colors)
                {
                    switch (col.Key)
                    {
                    case "_Color":
                        iMat.Diffuse = col.Value;
                        break;

                    case "_SColor":
                        iMat.Ambient = col.Value;
                        break;

                    case "_EmissionColor":
                        iMat.Emissive = col.Value;
                        break;

                    case "_SpecularColor":
                    case "_SpecColor":
                        iMat.Specular = col.Value;
                        break;

                    case "_ReflectColor":
                        iMat.Reflection = col.Value;
                        break;
                    }
                }

                foreach (var flt in mat.m_SavedProperties.m_Floats)
                {
                    switch (flt.Key)
                    {
                    case "_Shininess":
                        iMat.Shininess = flt.Value;
                        break;

                    case "_Transparency":
                        iMat.Transparency = flt.Value;
                        break;
                    }
                }

                //textures
                iMat.Textures = new List <ImportedMaterialTexture>();
                foreach (var texEnv in mat.m_SavedProperties.m_TexEnvs)
                {
                    if (!texEnv.Value.m_Texture.TryGet <Texture2D>(out var m_Texture2D)) //TODO other Texture
                    {
                        continue;
                    }

                    var texture = new ImportedMaterialTexture();
                    iMat.Textures.Add(texture);

                    int dest = -1;
                    if (texEnv.Key == "_MainTex")
                    {
                        dest = 0;
                    }
                    else if (texEnv.Key == "_BumpMap")
                    {
                        dest = 3;
                    }
                    else if (texEnv.Key.Contains("Specular"))
                    {
                        dest = 2;
                    }
                    else if (texEnv.Key.Contains("Normal"))
                    {
                        dest = 1;
                    }

                    texture.Dest = dest;

                    if (textureNameDictionary.TryGetValue(m_Texture2D, out var textureName))
                    {
                        texture.Name = textureName;
                    }
                    else if (ImportedHelpers.FindTexture(m_Texture2D.m_Name + ".png", TextureList) != null) //已有相同名字的图片
                    {
                        for (int i = 1; ; i++)
                        {
                            var name = m_Texture2D.m_Name + $" ({i}).png";
                            if (ImportedHelpers.FindTexture(name, TextureList) == null)
                            {
                                texture.Name = name;
                                textureNameDictionary.Add(m_Texture2D, name);
                                break;
                            }
                        }
                    }
                    else
                    {
                        texture.Name = m_Texture2D.m_Name + ".png";
                        textureNameDictionary.Add(m_Texture2D, texture.Name);
                    }

                    texture.Offset = texEnv.Value.m_Offset;
                    texture.Scale  = texEnv.Value.m_Scale;
                    ConvertTexture2D(m_Texture2D, texture.Name);
                }

                MaterialList.Add(iMat);
            }
            else
            {
                iMat = new ImportedMaterial();
            }
            return(iMat);
        }
Esempio n. 13
0
        private ImportedMaterial ConvertMaterial(Material mat)
        {
            ImportedMaterial iMat;

            if (mat != null)
            {
                iMat = ImportedHelpers.FindMaterial(mat.m_Name, MaterialList);
                if (iMat != null)
                {
                    return(iMat);
                }
                iMat      = new ImportedMaterial();
                iMat.Name = mat.m_Name;
                foreach (var col in mat.m_SavedProperties.m_Colors)
                {
                    switch (col.Key)
                    {
                    case "_Color":
                        iMat.Diffuse = col.Value;
                        break;

                    case "_SColor":
                        iMat.Ambient = col.Value;
                        break;

                    case "_EmissionColor":
                        iMat.Emissive = col.Value;
                        break;

                    case "_SpecColor":
                        iMat.Specular = col.Value;
                        break;

                    case "_RimColor":
                    case "_OutlineColor":
                    case "_ShadowColor":
                        break;
                    }
                }

                foreach (var flt in mat.m_SavedProperties.m_Floats)
                {
                    switch (flt.Key)
                    {
                    case "_Shininess":
                        iMat.Power = flt.Value;
                        break;

                    case "_RimPower":
                    case "_Outline":
                        break;
                    }
                }

                //textures
                iMat.Textures   = new string[5];
                iMat.TexOffsets = new Vector2[5];
                iMat.TexScales  = new Vector2[5];
                foreach (var texEnv in mat.m_SavedProperties.m_TexEnvs)
                {
                    Texture2D m_Texture2D = null;
                    if (texEnv.Value.m_Texture.TryGet <Texture2D>(out var m_Texture)) //TODO other Texture
                    {
                        m_Texture2D = m_Texture;
                    }

                    if (m_Texture2D == null)
                    {
                        continue;
                    }
                    int dest = -1;
                    if (texEnv.Key == "_MainTex")
                    {
                        dest = 0;
                    }
                    else if (texEnv.Key == "_BumpMap")
                    {
                        dest = 4;
                    }
                    else if (texEnv.Key.Contains("Spec"))
                    {
                        dest = 2;
                    }
                    else if (texEnv.Key.Contains("Norm"))
                    {
                        dest = 3;
                    }
                    if (dest < 0 || iMat.Textures[dest] != null)
                    {
                        continue;
                    }

                    if (textureNameDictionary.TryGetValue(m_Texture, out var textureName))
                    {
                        iMat.Textures[dest] = textureName;
                    }
                    else if (ImportedHelpers.FindTexture(m_Texture2D.m_Name + ".png", TextureList) != null) //已有相同名字的图片
                    {
                        for (int i = 1; ; i++)
                        {
                            var name = m_Texture2D.m_Name + $" ({i}).png";
                            if (ImportedHelpers.FindTexture(name, TextureList) == null)
                            {
                                iMat.Textures[dest] = name;
                                textureNameDictionary.Add(m_Texture, name);
                                break;
                            }
                        }
                    }
                    else
                    {
                        iMat.Textures[dest] = m_Texture2D.m_Name + ".png";
                        textureNameDictionary.Add(m_Texture, iMat.Textures[dest]);
                    }
                    iMat.TexOffsets[dest] = texEnv.Value.m_Offset;
                    iMat.TexScales[dest]  = texEnv.Value.m_Scale;
                    ConvertTexture2D(m_Texture2D, iMat.Textures[dest]);
                }

                MaterialList.Add(iMat);
            }
            else
            {
                iMat = new ImportedMaterial();
            }
            return(iMat);
        }