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; }
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"; }
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 + "."); } } } }