Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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;
        }
Example #4
0
        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);
            }
        }
Example #6
0
        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);
            }
        }
Example #7
0
 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();
 }
Example #8
0
        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();
        }
Example #9
0
        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);
            }
        }
Example #11
0
 public override IRenderableMaterial CreateMaterial(string kn5Filename, Kn5Material kn5Material) => new Kn5MaterialTrackMap(kn5Material);
Example #12
0
 internal Kn5MaterialUv(Kn5Material material) {
     _textures = material?.TextureMappings.Where(x => x.Name != "txDetail"
             && x.Name != "txNormalDetail").Select(x => x.Texture).ToArray() ?? new string[0];
 }
Example #13
0
 public override IRenderableMaterial CreateMaterial(string kn5Filename, Kn5Material kn5Material) {
     return new Kn5MaterialUv(kn5Material);
 }
Example #14
0
 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();
 }
Example #15
0
        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();
        }
Example #16
0
 internal Kn5MaterialTrackMap(Kn5Material material) { }
Example #17
0
        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;
        }