Materials Scripts fornecem a capacidade de definir materiais complexos que podem ser facilmente reutilizados. Ainda que se possa definir todas as configuracoes de materiais necessarios para uma cena atraves do codigo - utilizando metodos das classes Material e TextureLayer -, essa e uma tarefa bastante ardua. Em vez disso, podemos armazenar definicoes de materiais em arquivos de texto que podem ser carregados sempre que necessario.Carregando ScriptsScripts de Material sao carregados quando os gerentes de recursos sao inicializados (veja o post sobre gerentes de recursos): OGRE procura por arquivos .material em todas as localizacoes de recursos associadas ao grupo (veja Root::addResourceLocation) e os analisa. Tambem e possivel analisar esses arquivos manualmente atraves do metodo MaterialSerializer::parseScript.E importante perceber que, nesse processo de analise, os materiais nao sao carregados completamente: apenas as definicoes sao carregadas, mas nao as texturas nem outros recursos. Isso se da por que e comum possuir uma extensa biblioteca de materiais mas utilizar apenas um pequeno subconjunto dela em qualquer cena. Carregar todo material de cada script completamente causaria, portanto, uma sobrecarga desnecessaria de memoria.Pode-se acessar um material pre-carregado do jeito comum (MaterialManager::getSingleton().getByName()), mas sera preciso chamar o metodo load antes de usa-lo. OGRE faz isso automaticamente quando sao utilizados os metodos comuns para atribuicao de materiais a entidades.Outro ponto importante e que o nome de cada material deve ser unico, levando em conta todos os scripts (completos) que sao carregados pelo sistema - a justificativa pra isso e que os materiais sao sempre identificados por seus nomes.FormatoUm unico script pode conter a definicao para varios materiais. A linguagem para a escrita desses scripts e pseudo-C++, com secoes delimitadas por chaves ("{", "}") e comentarios de linha iniciados com "//" (nao sao permitidos comentarios de multiplas linhas). O formato generico e exibido no exemplo abaixo. Pra comecar, sao considerados apenas materiais de funcao-fixa que nao usam vertices, geometria ou fragmento de programas. Esses scripts mais complexos serao abordados posteriormente.//isto e um comentario material walls/funkywall1{ //primeiro, a tecnica preferivel technique { //primeiro passo pass { ambient 0.5 0.5 0.5 diffuse 1.0 1.0 1.0 //unidade de textura 0 texture_unit { texture wibbly.jpg scroll_anim 0.1 0.0 wave_xform scale sine 0.0 0.7 0.0 1.0 } //unidade de textura 1 //(este e um passo com mais de uma textura) texture_unit { texture wobbly.png rotate_anim 0.25 colour_op add } } } //segunda tecnica, pode ser usada para recuperacao //ou level LOD technique { //etc }}A todo material no script deve ser dado um nome, o que e feito na linha "material <nomeDoMaterial>", antes do primeiro abre chaves. Tal nome deve ser globalmente unico e pode incluir caracteres de caminho (como no exemplo) para dividir os materiais logicamente e tambem para evitar nomes duplicados. Apesar disso, a engine nao trata o nome hierarquicamente, mas apenas como uma string. Se houver caracteres em branco no nome de um material, ele deve ser envolto por aspas duplas (ex.: "rocha vermelha").Obs.: ":" (dois pontos) e o delimitador para especificar copia de material no script. Assim sendo, o nome de um material nao pode conter dois pontos (":").Um material pode herdar de