Пример #1
0
        private Dictionary<int, int> ExportMeshMaterial(string mainObject)
        {
            Dictionary<int, int> matIdMapping = new Dictionary<int, int>();
            if (Maxscript.QueryBoolean("classof {0}.material == Multimaterial", mainObject))
            {
                int numMaterials = Maxscript.QueryInteger("{0}.material.materialList.count", "mainObject");
                for (int i = 0; i < numMaterials; ++i)
                {
                    GrnMaterial mat = new GrnMaterial(this.File);
                    int id = this.File.Materials.Count;
                    Maxscript.Command("mat = {0}.material.materialList[{1}]", mainObject, i + 1);
                    this.ExportMaterial(mat);

                    int matListIndex = this.File.Materials.IndexOf(mat);
                    int actualMatId = Maxscript.QueryInteger("{0}.material.materialIdList[{1}]", mainObject, i + 1);
                    if (matListIndex >= 0)
                    {
                        if (!matIdMapping.ContainsKey(actualMatId))
                        {
                            matIdMapping.Add(actualMatId, matListIndex);
                        }
                        this.File.DataExtensions.RemoveAt(mat.DataExtensionIndex);
                    }
                    else
                    {
                        this.File.Materials.Add(mat);
                        if (matIdMapping.ContainsKey(actualMatId))
                        {
                            matIdMapping[actualMatId] = id;
                        }
                        else
                        {
                            matIdMapping.Add(actualMatId, id);
                        }
                    }
                }
            }
            else if (Maxscript.QueryBoolean("classof {0}.material == Standardmaterial", mainObject))
            {
                GrnMaterial mat = new GrnMaterial(this.File);
                int id = this.File.Materials.Count;
                Maxscript.Command("mat = {0}.material", mainObject);
                this.ExportMaterial(mat);

                int matListIndex = this.File.Materials.IndexOf(mat);
                if (matListIndex >= 0)
                {
                    matIdMapping.Add(1, matListIndex);
                    this.File.DataExtensions.RemoveAt(mat.DataExtensionIndex);
                }
                else
                {
                    this.File.Materials.Add(mat);
                    matIdMapping.Add(1, id);
                }
            }

            return matIdMapping;
        }
Пример #2
0
        private string ImportMaterial(GrnMaterial mat)
        {
            Maxscript.Command("mat = StandardMaterial()");
            Maxscript.Command("mat.name = \"{0}\"", mat.Name);
            Maxscript.Command("mat.adLock = false");
            Maxscript.Command("mat.useSelfIllumColor = true");
            Maxscript.Command("mat.diffuse = color {0} {1} {2}", mat.DiffuseColor.R * 255f, mat.DiffuseColor.G * 255f, mat.DiffuseColor.B * 255f);
            Maxscript.Command("mat.ambient = color {0} {1} {2}", mat.AmbientColor.R * 255f, mat.AmbientColor.G * 255f, mat.AmbientColor.B * 255f);
            Maxscript.Command("mat.specular = color {0} {1} {2}", mat.SpecularColor.R * 255f, mat.SpecularColor.G * 255f, mat.SpecularColor.B * 255f);
            Maxscript.Command("mat.selfIllumColor = color {0} {1} {2}", mat.EmissiveColor.R * 255f, mat.EmissiveColor.G * 255f, mat.EmissiveColor.B * 255f);
            Maxscript.Command("mat.opacity = {0}", mat.Opacity * 100f);
            Maxscript.Command("mat.specularLevel = {0}", mat.SpecularExponent);

            Maxscript.Command("tex = BitmapTexture()");
            Maxscript.Command("tex.name = \"{0}\"", mat.DiffuseTexture.Name);
            Maxscript.Command("tex.filename = \"{0}\"", Path.GetFileName(mat.DiffuseTexture.FileName));
            Maxscript.Command("mat.diffusemap = tex");

            return "mat";
        }
Пример #3
0
        private void ExportMaterial(GrnMaterial mat)
        {
            mat.DataExtensionIndex = this.File.AddDataExtension(Maxscript.QueryString("mat.name"));

            mat.DiffuseColor = new Color3D(Maxscript.QueryFloat("mat.diffuse.r") / 255f,
                Maxscript.QueryFloat("mat.diffuse.g") / 255f,
                Maxscript.QueryFloat("mat.diffuse.b") / 255f);
            mat.AmbientColor = new Color3D(Maxscript.QueryFloat("mat.ambient.r") / 255f,
                Maxscript.QueryFloat("mat.ambient.g") / 255f,
                Maxscript.QueryFloat("mat.ambient.b") / 255f);
            mat.SpecularColor = new Color3D(Maxscript.QueryFloat("mat.specular.r") / 255f,
                Maxscript.QueryFloat("mat.specular.g") / 255f,
                Maxscript.QueryFloat("mat.specular.b") / 255f);
            mat.EmissiveColor = new Color3D(Maxscript.QueryFloat("mat.selfIllumColor.r") / 255f,
                Maxscript.QueryFloat("mat.selfIllumColor.g") / 255f,
                Maxscript.QueryFloat("mat.selfIllumColor.b") / 255f);
            mat.Opacity = Maxscript.QueryFloat("mat.opacity") / 100f;
            mat.SpecularExponent = Maxscript.QueryFloat("mat.specularLevel");

            GrnTexture tex = null;
            if (Maxscript.QueryBoolean("(classof mat.diffusemap) == BitmapTexture"))
            {
                tex = new GrnTexture(this.File);
                tex.DataExtensionIndex = this.File.AddDataExtension(Maxscript.QueryString("mat.diffusemap.name"));
                this.File.SetDataExtensionFileName(tex.DataExtensionIndex, Path.GetFileNameWithoutExtension(Maxscript.QueryString("mat.diffusemap.filename")) + ".tga");
            }
            else if (Maxscript.QueryBoolean("(classof mat.diffusemap) == CompositeTextureMap") && Maxscript.QueryBoolean("(classof mat.diffusemap.mapList[1]) == BitmapTexture"))
            {
                tex = new GrnTexture(this.File);
                tex.DataExtensionIndex = this.File.AddDataExtension(Maxscript.QueryString("mat.diffusemap.mapList[1].name"));
                this.File.SetDataExtensionFileName(tex.DataExtensionIndex, Path.GetFileNameWithoutExtension(Maxscript.QueryString("mat.diffusemap.mapList[1].filename")) + ".tga");
            }

            if (tex != null)
            {
                int texIndex = this.File.Textures.IndexOf(tex);
                if (texIndex >= 0)
                {
                    mat.DiffuseTextureIndex = texIndex;
                    this.File.DataExtensions.RemoveAt(tex.DataExtensionIndex);
                }
                else
                {
                    mat.DiffuseTextureIndex = this.File.Textures.Count;
                    this.File.Textures.Add(tex);
                    string fileNameNoExt = Path.GetFileNameWithoutExtension(tex.FileName);
                    if (!fileNameNoExt.Equals(tex.Name))
                    {
                        throw new Exception("Texture name " + tex.Name + " must be set to " + fileNameNoExt + ".");
                    }
                }
            }
        }