Esempio n. 1
0
        public static IEnumerable <GeometryMaterial> GetMaterials(IReadOnlyList <ShaderBlock> shaders)
        {
            for (int i = 0; i < shaders.Count; i++)
            {
                var tag = shaders[i].ShaderReference.Tag;
                if (tag == null)
                {
                    yield return(null);

                    continue;
                }

                var material = new GeometryMaterial
                {
                    Name = Utils.GetFileName(tag.FullPath)
                };

                var shader = tag?.ReadMetadata <shader>();
                if (shader == null)
                {
                    yield return(material);

                    continue;
                }

                var bitmTag = shader.ShaderMaps[0].DiffuseBitmapReference.Tag;
                if (bitmTag == null)
                {
                    yield return(material);

                    continue;
                }

                material.Submaterials.Add(new SubMaterial
                {
                    Usage  = MaterialUsage.Diffuse,
                    Bitmap = bitmTag.ReadMetadata <bitmap>(),
                    Tiling = new RealVector2D(1, 1)
                });

                yield return(material);
            }
        }
Esempio n. 2
0
        public static IEnumerable <GeometryMaterial> GetMaterials(IReadOnlyList <ShaderBlock> shaders)
        {
            for (int i = 0; i < shaders.Count; i++)
            {
                var tag = shaders[i].ShaderReference.Tag;
                if (tag == null)
                {
                    yield return(null);

                    continue;
                }

                var material = new GeometryMaterial
                {
                    Name = Utils.GetFileName(tag.FullPath)
                };

                var shader = tag?.ReadMetadata <shader>();
                if (shader == null)
                {
                    yield return(material);

                    continue;
                }

                var subMaterials = new List <ISubmaterial>();
                var props        = shader.ShaderProperties[0];
                var template     = props.TemplateReference.Tag.ReadMetadata <render_method_template>();
                for (int j = 0; j < template.Usages.Count; j++)
                {
                    var usage = template.Usages[j].Value;
                    var entry = usageLookup.FirstOrNull(p => usage.StartsWith(p.Key));
                    if (!entry.HasValue)
                    {
                        continue;
                    }

                    var map     = props.ShaderMaps[j];
                    var bitmTag = map.BitmapReference.Tag;
                    if (bitmTag == null)
                    {
                        continue;
                    }

                    var tile = map.TilingIndex >= props.TilingData.Count
                        ? (RealVector4D?)null
                        : props.TilingData[map.TilingIndex];

                    subMaterials.Add(new SubMaterial
                    {
                        Usage  = entry.Value.Value,
                        Bitmap = bitmTag.ReadMetadata <bitmap>(),
                        Tiling = new RealVector2D(tile?.X ?? 1, tile?.Y ?? 1)
                    });
                }

                if (subMaterials.Count == 0)
                {
                    yield return(material);

                    continue;
                }

                material.Submaterials = subMaterials;

                for (int j = 0; j < template.Arguments.Count; j++)
                {
                    if (!tintLookup.ContainsKey(template.Arguments[j].Value))
                    {
                        continue;
                    }

                    material.TintColours.Add(new TintColour
                    {
                        Usage = tintLookup[template.Arguments[j].Value],
                        R     = (byte)(props.TilingData[j].X * byte.MaxValue),
                        G     = (byte)(props.TilingData[j].Y * byte.MaxValue),
                        B     = (byte)(props.TilingData[j].Z * byte.MaxValue),
                        A     = (byte)(props.TilingData[j].W * byte.MaxValue),
                    });
                }

                if (tag.ClassCode == "rmtr")
                {
                    material.Flags |= MaterialFlags.TerrainBlend;
                }
                else if (tag.ClassCode != "rmsh")
                {
                    material.Flags |= MaterialFlags.Transparent;
                }

                if (subMaterials.Any(m => m.Usage == MaterialUsage.ColourChange) && !subMaterials.Any(m => m.Usage == MaterialUsage.Diffuse))
                {
                    material.Flags |= MaterialFlags.ColourChange;
                }

                yield return(material);
            }
        }
Esempio n. 3
0
        public static IEnumerable <GeometryMaterial> GetMaterials(IList <MaterialBlock> materials)
        {
            for (int i = 0; i < materials.Count; i++)
            {
                var tag = materials[i].MaterialReference.Tag;
                if (tag == null)
                {
                    yield return(null);

                    continue;
                }

                var material = new GeometryMaterial
                {
                    Name = Utils.GetFileName(tag.FullPath)
                };

                var mat = tag?.ReadMetadata <material>();
                if (mat == null)
                {
                    yield return(material);

                    continue;
                }

                var subMaterials = new List <ISubmaterial>();
                var map          = mat.PostprocessDefinitions.FirstOrDefault()?.Textures.FirstOrDefault();
                var bitmTag      = map?.BitmapReference.Tag;
                if (bitmTag == null)
                {
                    yield return(material);

                    continue;
                }

                //var tile = map.TilingIndex == byte.MaxValue
                //    ? (RealVector4D?)null
                //    : shader.ShaderProperties[0].TilingData[map.TilingIndex];

                try
                {
                    subMaterials.Add(new SubMaterial
                    {
                        Usage  = MaterialUsage.Diffuse,
                        Bitmap = bitmTag.ReadMetadata <bitmap>(),
                        //Tiling = new RealVector2D(tile?.X ?? 1, tile?.Y ?? 1)
                        Tiling = new RealVector2D(1, 1)
                    });
                }
                catch { }

                if (subMaterials.Count == 0)
                {
                    yield return(material);

                    continue;
                }

                material.Submaterials = subMaterials;

                yield return(material);
            }
        }
Esempio n. 4
0
        public static IEnumerable <GeometryMaterial> GetMaterials(IReadOnlyList <ShaderBlock> shaders)
        {
            for (int i = 0; i < shaders.Count; i++)
            {
                var tag = shaders[i].MaterialReference.Tag;
                if (tag == null)
                {
                    yield return(null);

                    continue;
                }

                var material = new GeometryMaterial
                {
                    Name = Utils.GetFileName(tag.FullPath)
                };

                var shader = tag?.ReadMetadata <material>();
                if (shader == null)
                {
                    yield return(material);

                    continue;
                }

                var subMaterials = new List <ISubmaterial>();
                var map          = shader.ShaderProperties.FirstOrDefault()?.ShaderMaps.FirstOrDefault();
                var bitmTag      = map?.BitmapReference.Tag;
                if (bitmTag == null)
                {
                    yield return(material);

                    continue;
                }

                //maybe map.TilingIndex has the wrong offset? can sometimes be out of bounds (other than 0xFF)
                var tile = shader.ShaderProperties[0].TilingData.Cast <RealVector4D?>().ElementAtOrDefault(map.TilingIndex);

                try
                {
                    subMaterials.Add(new SubMaterial
                    {
                        Usage  = MaterialUsage.Diffuse,
                        Bitmap = bitmTag.ReadMetadata <bitmap>(),
                        Tiling = new RealVector2D(tile?.X ?? 1, tile?.Y ?? 1)
                    });
                }
                catch { }

                if (subMaterials.Count == 0)
                {
                    yield return(material);

                    continue;
                }

                material.Submaterials = subMaterials;

                yield return(material);
            }
        }
Esempio n. 5
0
        public static IEnumerable <GeometryMaterial> GetMaterials(IReadOnlyList <ShaderBlock> shaders)
        {
            for (int i = 0; i < shaders.Count; i++)
            {
                var tag = shaders[i].MaterialReference.Tag;
                if (tag == null)
                {
                    yield return(null);

                    continue;
                }

                var material = new GeometryMaterial
                {
                    Name = Utils.GetFileName(tag.FullPath)
                };

                var shader = tag?.ReadMetadata <material>();
                if (shader == null)
                {
                    yield return(material);

                    continue;
                }

                var subMaterials = new List <ISubmaterial>();
                var props        = shader.ShaderProperties[0];
                foreach (var map in props.ShaderMaps)
                {
                    var bitmTag = map.BitmapReference.Tag;
                    if (bitmTag == null)
                    {
                        continue;
                    }

                    MaterialUsage usage;
                    var           name = bitmTag.FileName();
                    if (name.EndsWith("_detail_normal") || name.EndsWith("_detail_bump"))
                    {
                        usage = MaterialUsage.NormalDetail;
                    }
                    else if (name.EndsWith("_detail"))
                    {
                        usage = MaterialUsage.DiffuseDetail;
                    }
                    else if (name.EndsWith("_normal") || name.EndsWith("_bump"))
                    {
                        usage = MaterialUsage.Normal;
                    }
                    else if (name.EndsWith("_diff") || name.EndsWith("_color") || name.StartsWith("watersurface_"))
                    {
                        usage = MaterialUsage.Diffuse;
                    }
                    else if (props.ShaderMaps.Count == 1)
                    {
                        usage = MaterialUsage.Diffuse;
                    }
                    else
                    {
                        continue;
                    }

                    //maybe map.TilingIndex has the wrong offset? can sometimes be out of bounds (other than 0xFF)
                    var tile = props.TilingData.Cast <RealVector4D?>().ElementAtOrDefault(map.TilingIndex);

                    try
                    {
                        subMaterials.Add(new SubMaterial
                        {
                            Usage  = usage,
                            Bitmap = bitmTag.ReadMetadata <bitmap>(),
                            Tiling = new RealVector2D(tile?.X ?? 1, tile?.Y ?? 1)
                        });
                    }
                    catch { }
                }

                if (subMaterials.Count == 0)
                {
                    yield return(material);

                    continue;
                }

                material.Submaterials = subMaterials;

                yield return(material);
            }
        }