private void ExportCollada_MaterialEffect(XmlWriter xml, Kn5Material material) { xml.WriteStartElement("effect"); xml.WriteAttributeStringSafe("id", $"{material.Name}-effect"); xml.WriteStartElement("profile_COMMON"); xml.WriteStartElement("technique"); xml.WriteAttributeString("sid", "common"); xml.WriteStartElement("phong"); xml.WriteStartElement("emission"); xml.WriteStartElement("color"); xml.WriteAttributeString("sid", "emission"); var ksEmissive = material.GetPropertyByName("ksEmissive"); xml.WriteString(ksEmissive == null ? "0 0 0 1" : $"{ksEmissive.ValueC[0].ToString(CultureInfo.InvariantCulture)} {ksEmissive.ValueC[1].ToString(CultureInfo.InvariantCulture)} {ksEmissive.ValueC[2].ToString(CultureInfo.InvariantCulture)} 1"); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteStartElement("ambient"); xml.WriteStartElement("color"); xml.WriteAttributeString("sid", "ambient"); var ksAmbient = material.GetPropertyByName("ksAmbient"); xml.WriteString(ksAmbient == null ? "0.4 0.4 0.4 1" : string.Format("{0} {0} {0} 1", ksAmbient.ValueA.ToString(CultureInfo.InvariantCulture))); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteStartElement("diffuse"); var txDiffuse = material.GetMappingByName("txDiffuse"); if (txDiffuse != null) { ExportCollada_MaterialEffectTexture(xml, txDiffuse); } xml.WriteStartElement("color"); xml.WriteAttributeString("sid", "diffuse"); var ksDiffuse = material.GetPropertyByName("ksDiffuse"); xml.WriteString(ksDiffuse == null ? "0.6 0.6 0.6 1" : string.Format("{0} {0} {0} 1", ksDiffuse.ValueA.ToString(CultureInfo.InvariantCulture))); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteStartElement("specular"); xml.WriteStartElement("color"); xml.WriteAttributeString("sid", "specular"); var ksSpecular = material.GetPropertyByName("ksSpecular"); xml.WriteString(ksSpecular == null ? "0.5 0.5 0.5 1" : string.Format("{0} {0} {0} 1", ksSpecular.ValueA.ToString(CultureInfo.InvariantCulture))); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteStartElement("shininess"); xml.WriteStartElement("float"); xml.WriteAttributeString("sid", "shininess"); xml.WriteString(material.GetPropertyByName("ksSpecularEXP")?.ValueA ?? 50); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteStartElement("index_of_refraction"); xml.WriteStartElement("float"); xml.WriteAttributeString("sid", "index_of_refraction"); xml.WriteString(1f); xml.WriteEndElement(); xml.WriteEndElement(); if (material.BlendMode == Kn5MaterialBlendMode.AlphaBlend) { xml.WriteStartElement("transparent"); xml.WriteAttributeString("opaque", "RGB_ZERO"); if (material.ShaderName == "ksPerPixelNM" || material.ShaderName == "ksPerPixelNM_UV2" || material.ShaderName == "ksPerPixelMultiMap_AT" || material.ShaderName == "ksPerPixelMultiMap_AT_NMDetail") { var txNormal = material.GetMappingByName("txNormal"); if (txNormal != null) { ExportCollada_MaterialEffectTexture(xml, txNormal); } } else if (txDiffuse != null) { ExportCollada_MaterialEffectTexture(xml, txDiffuse); } xml.WriteEndElement(); // transparent } var alpha = 1.0f; switch (material.ShaderName) { case "ksBrokenGlass": alpha = 0f; break; case "ksPerPixelAlpha": alpha = material.GetPropertyByName("alpha")?.ValueA ?? 1f; break; } if (!Equals(alpha, 1f)) { xml.WriteStartElement("transparency"); xml.WriteStartElement("float"); xml.WriteAttributeString("sid", "transparency"); xml.WriteString(alpha); xml.WriteEndElement(); // float xml.WriteEndElement(); // transparency } xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteEndElement(); }