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); } }
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); } }
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); } }
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); } }
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); } }