public void Write(Kn5Material material) { Write(material.Name); Write(material.ShaderName); Write(material.BlendMode); Write(material.AlphaTested); Write(material.DepthMode); Write(material.ShaderProperties.Length); for (var i = 0; i < material.ShaderProperties.Length; i++) { var property = material.ShaderProperties[i]; Write(property.Name); Write(property.ValueA); Write(property.ValueB); Write(property.ValueC); Write(property.ValueD); } Write(material.TextureMappings.Length); for (var i = 0; i < material.TextureMappings.Length; i++) { var mapping = material.TextureMappings[i]; Write(mapping.Name); Write(mapping.Slot); Write(mapping.Texture); } }
public Kn5Material ReadMaterial() { var material = new Kn5Material { Name = ReadString(), ShaderName = ReadString(), BlendMode = ReadBlendMode(), // byte AlphaTested = ReadBoolean(), // bool DepthMode = ReadDepthMode(), // int32 ShaderProperties = new Kn5Material.ShaderProperty[ReadInt32()] }; for (var i = 0; i < material.ShaderProperties.Length; i++) { material.ShaderProperties[i] = new Kn5Material.ShaderProperty { Name = ReadString(), ValueA = ReadSingle(), ValueB = ReadSingle2D(), ValueC = ReadSingle3D(), ValueD = ReadSingle4D() }; } material.TextureMappings = new Kn5Material.TextureMapping[ReadInt32()]; for (var i = 0; i < material.TextureMappings.Length; i++) { material.TextureMappings[i] = new Kn5Material.TextureMapping { Name = ReadString(), Slot = ReadInt32(), Texture = ReadString() }; } return(material); }
internal Kn5MaterialDeferred([NotNull] string kn5Filename, [NotNull] Kn5Material material) { if (kn5Filename == null) throw new ArgumentNullException(nameof(kn5Filename)); if (material == null) throw new ArgumentNullException(nameof(material)); _kn5Filename = kn5Filename; _kn5Material = material; IsBlending = _kn5Material.BlendMode == Kn5MaterialBlendMode.AlphaBlend; }
private void ExportCollada_Material(XmlWriter xml, Kn5Material material) { xml.WriteStartElement("material"); xml.WriteAttributeStringSafe("id", $"{material.Name}-material"); xml.WriteAttributeStringSafe("name", material.Name); xml.WriteStartElement("instance_effect"); xml.WriteAttributeStringSafe("url", $"#{material.Name}-effect"); xml.WriteEndElement(); xml.WriteEndElement(); }
public override IRenderableMaterial CreateMaterial(string kn5Filename, Kn5Material kn5Material) { if (kn5Material == null) { return new InvisibleMaterial(); } switch (kn5Material.ShaderName) { case "GL": return new Kn5MaterialGlDeferred(); case "ksWindscreen": return new InvisibleMaterial(); default: return new Kn5MaterialDeferred(kn5Filename, kn5Material); } }
public void Write(Kn5Material material) { Write(material.Name); Write(material.ShaderName); Write(material.BlendMode); Write(material.AlphaTested); Write(material.DepthMode); Write(material.ShaderProperties.Length); foreach (var property in material.ShaderProperties) { Write(property.Name); Write(property.ValueA); Write(property.ValueB); Write(property.ValueC); Write(property.ValueD); } Write(material.TextureMappings.Length); foreach (var mapping in material.TextureMappings) { Write(mapping.Name); Write(mapping.Slot); Write(mapping.Texture); } }
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(); }
private void ExportCollada_MaterialEffectTexture(XmlWriter xml, Kn5Material.TextureMapping tex) { xml.WriteStartElement("texture"); xml.WriteAttributeStringSafe("texture", $"{tex.Texture}-image"); xml.WriteAttributeString("texcoord", "CHANNEL0"); xml.WriteStartElement("extra"); xml.WriteStartElement("technique"); xml.WriteAttributeString("profile", "MAYA"); xml.WriteStartElement("wrapV"); xml.WriteAttributeString("sid", "wrapV0"); xml.WriteString("TRUE"); xml.WriteEndElement(); xml.WriteStartElement("wrapU"); xml.WriteAttributeString("sid", "wrapU0"); xml.WriteString("TRUE"); xml.WriteEndElement(); xml.WriteStartElement("blend_mode"); xml.WriteString("ADD"); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteEndElement(); xml.WriteEndElement(); }
public override IRenderableMaterial CreateMaterial(string kn5Filename, Kn5Material kn5Material) { if (kn5Material == null) { return new InvisibleMaterial(); } // return new Kn5MaterialSimpleGl(kn5Filename, kn5Material); switch (kn5Material.ShaderName) { case "ksBrokenGlass": return new InvisibleMaterial(); case "GL": return new Kn5MaterialSimpleGl(kn5Filename, kn5Material); case "ksTyres": case "ksBrakeDisc": return new Kn5MaterialSimpleDiffMaps(kn5Filename, kn5Material); case "ksWindscreen": return new Kn5MaterialSimple(kn5Filename, kn5Material); case "ksPerPixel": case "ksPerPixelAT": case "ksPerPixelAT_NS": case "ksTree": return new Kn5MaterialSimple(kn5Filename, kn5Material); case "ksPerPixelAT_NM": return new Kn5MaterialSimpleAtNm(kn5Filename, kn5Material); case "ksPerPixelReflection": case "ksPerPixelSimpleRefl": return new Kn5MaterialSimpleReflective(kn5Filename, kn5Material); case "ksPerPixelNM": case "ksPerPixelNM_UV2": return new Kn5MaterialSimpleNm(kn5Filename, kn5Material); case "ksPerPixelNM_UVMult": return new Kn5MaterialSimpleNmMult(kn5Filename, kn5Material); case "ksPerPixelMultiMap": case "ksPerPixelMultiMap_AT": case "ksPerPixelMultiMap_AT_NMDetail": case "ksPerPixelMultiMap_damage": case "ksPerPixelMultiMap_damage_dirt": case "ksPerPixelMultiMap_damage_dirt_sunspot": case "ksPerPixelMultiMap_NMDetail": case "ksPerPixelMultiMapSimpleRefl": return new Kn5MaterialSimpleMaps(kn5Filename, kn5Material); case "ksPerPixelAlpha": return new Kn5MaterialSimpleAlpha(kn5Filename, kn5Material); case "ksSkinnedMesh": // TODO return new Kn5MaterialSimpleMaps(kn5Filename, kn5Material); default: return new Kn5MaterialSimple(kn5Filename, kn5Material); } }
public override IRenderableMaterial CreateMaterial(string kn5Filename, Kn5Material kn5Material) => new Kn5MaterialTrackMap(kn5Material);
internal Kn5MaterialUv(Kn5Material material) { _textures = material?.TextureMappings.Where(x => x.Name != "txDetail" && x.Name != "txNormalDetail").Select(x => x.Texture).ToArray() ?? new string[0]; }
public override IRenderableMaterial CreateMaterial(string kn5Filename, Kn5Material kn5Material) { return new Kn5MaterialUv(kn5Material); }
private static string MaterialPropertyToString(Kn5Material.ShaderProperty property) { if (property.ValueD.Any(x => !Equals(x, 0f))) return $"({property.ValueD.JoinToString(@", ")})"; if (property.ValueC.Any(x => !Equals(x, 0f))) return $"({property.ValueC.JoinToString(@", ")})"; if (property.ValueB.Any(x => !Equals(x, 0f))) return $"({property.ValueB.JoinToString(@", ")})"; return property.ValueA.ToInvariantString(); }
internal Kn5MaterialTrackMap(Kn5Material material) { }
public Kn5Material ReadMaterial() { var material = new Kn5Material { Name = ReadString(), ShaderName = ReadString(), BlendMode = ReadBlendMode(), // byte AlphaTested = ReadBoolean(), // bool DepthMode = ReadDepthMode(), // int32 ShaderProperties = new Kn5Material.ShaderProperty[ReadInt32()] }; for (var i = 0; i < material.ShaderProperties.Length; i++) { material.ShaderProperties[i] = new Kn5Material.ShaderProperty { Name = ReadString(), ValueA = ReadSingle(), ValueB = ReadSingle2D(), ValueC = ReadSingle3D(), ValueD = ReadSingle4D() }; } material.TextureMappings = new Kn5Material.TextureMapping[ReadInt32()]; for (var i = 0; i < material.TextureMappings.Length; i++) { material.TextureMappings[i] = new Kn5Material.TextureMapping { Name = ReadString(), Slot = ReadInt32(), Texture = ReadString() }; } return material; }