Example #1
0
        private Material[] LoadMaterials(string aseAssetName, IGeometryContext context, IFormatProvider format, string data)
        {
            var materials = new List <Material>();

            var rootPath = Path.GetDirectoryName(aseAssetName);

            var query = from match in RegexQuery.Against(data)
                        where   match
                        .RegEx("\t")
                        .Literal("*MATERIAL")
                        .WhiteSpace
                        .Group(Pattern.With.Digit.Repeat.ZeroOrMore)
                        .WhiteSpace
                        .Literal("{")
                        .RegEx("[\n\r]*")
                        .IsTrue()
                        select match;

            foreach (var match in query)
            {
                var materialEnd = data.IndexOf("\n\t}", match.Index);
                if (materialEnd > 0)
                {
                    materialEnd += 2;
                    var material = new Material();
                    materials.Add(material);
                    var materialString = data.Substring(match.Index, materialEnd - match.Index);
                    var diffuseIndex   = materialString.IndexOf("\t\t*MAP_DIFFUSE");
                    if (diffuseIndex > 0)
                    {
                        var diffuseEnd = materialString.IndexOf("\n\t\t}", diffuseIndex);
                        if (diffuseEnd > 0)
                        {
                            var diffuseString = materialString.Substring(diffuseIndex, diffuseEnd - diffuseIndex);
                            var bitmapIndex   = diffuseString.IndexOf("\t\t\t*BITMAP");
                            var eolIndex      = diffuseString.IndexOf('\n', bitmapIndex);
                            if (eolIndex > 0)
                            {
                                var bitmapString = diffuseString.Substring(bitmapIndex, eolIndex - bitmapIndex);
                                var fileIndex    = bitmapString.IndexOf('"');
                                if (fileIndex > 0)
                                {
                                    var file         = bitmapString.Substring(fileIndex + 1).Replace('"', ' ').Trim();
                                    var relativeFile = Path.GetFileName(file);
                                    var actualFile   = string.IsNullOrEmpty(rootPath)
                                                                                                ? relativeFile
                                                                                                : string.Format("{0}//{1}", rootPath, relativeFile);
                                    var loader = _assetLoaderService.GetLoader <Image>(actualFile);
                                    var frames = loader.Load(actualFile);
                                    material.DiffuseMap = frames[0];
                                }
                            }
                        }
                    }
                }
            }
            return(materials.ToArray());

            /*
             * var materialRegex = new Regex(@"\t\*MATERIAL\s*(\d*)\s*{[\n\r](.*)\t}");
             * var matches = materialRegex.Matches(data);
             *
             * var assetName = "BlueEnvMap.png";
             * var loader = AssetLoaderManager.Instance.GetLoader<Image>(assetName);
             * var frames = loader.Load(assetName);
             *
             * var material = new Material
             *                              {
             *                                      DiffuseMap = frames[0]
             *                              };
             *
             * for (var faceIndex = 0; faceIndex < context.FaceCount; faceIndex++)
             * {
             *      context.SetMaterial(faceIndex, material);
             * }
             */
        }