jim_spb |
Дата: Воскресенье, 08 Сентября 2013, 16:09 | Сообщение # 1 |
Куидный бог
Группа: Администратор
Сообщений: 1196
Trainz User ID: #211147
Версия игры: 3.7-61388
|
Исправление ошибки/предупреждения "The texture 'x.tga' is a uniform color"
для однотекстурных материалов типа "m.onetex", путем превращения их в "m.notex" с помощью шестнадцатиричного редактора.
Ограничения.
Далее будет рассматриваться типовой случай, когда в материале типа "m.onetex" с одной текстурной картой используется одноцветная текстура и отсутствует карта прозрачности (альфа). Все другие варианты (наличие альфы, дополнительных текстурных карт, другие типы материалов) требуют индивидуального подхода к лечению и поэтому выходят за рамки данной статьи. Также, технология не проверялась на объектах с костной анимацией.
Также, нужно иметь хотя бы начальные понятия о представлении данных в ЭВМ и шестнадцатиричной системе счисления. Нам придется работать с целыми числами и числами с плавающей точкой в четырехбайтовом представлении. Целые числа записываются в интеловской последовательности, т.е. первым пишется младший байт, а старший - последним.
Внимание!
Обязательно делайте копии исходных файлов. Малейшая ошибка может привести к неработоспособности моделей. Также необходима максимальная концентрация внимания. Если вы чувствуете усталось или вас отвлекают, лучше отложить это занятие.
И еще. Настоятельно рекомендуется работать с целыми числами в хекс-эдиторе в шестнадцатиричном формате. В случае необходимости, преобразование чисел из десятичного в шестнадцатиричный формат и обратно, а также арифметические операции с числами в шестнадцатиричном формате легко произвести с помощью стандартного калькулятора Windows, переключив его в режим "Программист".
Числа в десятичном формате буду записывать в обычном виде, а в шестнадцатиричном формате - в виде 0xFF, что соответсвует FF в шестнадцатиричном формате или 255 в десятичном.
Необходимые инструменты:
1. Trainz Mesh Viewer
2. Mesh Text Viever или AssetX
3. Adobe Photoshop или любой другой графический редактор, позволяющий получить значения RGB для каждого пикселя
(в случае работы с теневыми моделями не нужен)
4. Любой подходящий шестнадцатиричный редактор (Hex Editor). Я буду использовать Free Hex Editor Neo, но никому не навязываю свой выбор.
Все скриншоты, приведенные ниже, кликабельны с увеличением.
Начнем.
Вот попался мне объект Lamp-No-Pool-65-001,
У него есть предупреждения
Warning: The texture 'bulb.tga' is a uniform color.
Warning: The texture 'night/bulb.tga' is a uniform color.
Если значение тега trainz-build в конфиге будет 3.5 и выше - вместо предупреждения будет ошибка.
Первое, что нужно сделать - убедиться в том, что данная текстура используется в материале типа "m.onetex", а также в отсутствии карты прозрачности ("альфы").
Открываем текстовый файл, который ссылается на эту текстуру (в данном случае bulb.texture.txt) и убеждаемся в отсутствии ссылки на карту прозрачности (Alpha=.....)
Код
Primary=bulb.tga
Tile=st
Можно продолжать. Сделаем копию исходного меша lamp-no-pool-65-001.im Теперь надо найти в нем материал, использующий эту текстуру. Можно открыть .im файл в меш текст вьювере, это полезно, там будет подробно расписано, что и где находится.
Проблема в том, что авторы сочли эту программу устаревшей и прекратили ее выкладывать. А зря - замечательный инструмент, позволяющий значительно сократить время работы с im файлами. Сейчас все функции меш текст вьювера перенесены в новый инструмент AssetX, только открытие файлов в нем занимает больше времени.
Находим в нем ссылку на нашу текстуру
Рис. 1 Окно меш текст вьювера
Ссылка на текстуру отмечена красным прямоугольником. Поднимемся чуть выше и посмотрим название материала, к которому относится текстура (отмечено зеленым прямоугольником) Как видим, тип материала "m.onetex"
Если нет Меш текст вьювера, то же самое можно увидеть в AssetX. Откройте ассет в нем (Add Asset, укажите папку с дополнением, открытым для редактирования в эксплорере). А дальше в нижнем левом окне выбираем im файл, и в панели инструментов слева от окна рендеринга - пиктограмму тестового вида.
Рис. 2 Окно AssetX
Итак, проверка пройдена. Осталось разложить цвет нашей текстуры на RGB составляющие, и можно приступать к редактированию меша. Если же мы исправляем теневую модель, то этот этап не нужен, достаточно принять значения RGB, равные 0,0,0.
Открываем текстуру bulb.tga в фотошопе (или другом редакторе) и, используя инструмент Color Sampler Tool, получаем значения RGB 154,154,154. В свойствах материала в модели значения цветов пишутся числом с плавающей точкой в пределах от 0 до 1. Соответственно, необходимо их преобразовать - величину цвета для каждого канала надо разделить на 255. Получаем 0.6039, 0.6039, 0.6039
Приступаем к редактированию меша. Открываем файл lamp-no-pool-65-001.im в хекс-эдиторе
Разобъем редактирование меша на этапы.
1. Замена значений цвета в RGB каналах (рис. 1, синий прямоугольник)
Переходим по указанному адресу (2420). (Ctrl+G, точка в кружке Absolute offset), рис. 3
В окошке перехода адрес будет автоматически преобразовываться в шестнадцатиричный формат (0х974)
Перешли (Рис. 4)
Видим 24-байтовое поле, 6 групп по 4 байта, в них вписаны значения цветов Ambient Color и Diffuse Color.
Если мы лечим теневую модель, достаточно эти 24 байта забить нулями (0x00). Если же нет, надо вписать сюда полученные выше числа с плавающей точкой, 3 числа и еще раз те же 3 числа. В нашем случае это будут 0.6039, 0.6039, 0.6039, 0.6039, 0.6039, 0.6039.
Поскольку в файлах мешей это поле не всегда выровнено к четырехбайтовой границе, рекомендую сделать так: открываем новый документ (Ctrl+N), переводим формат представления чисел к формату плавающей точки (Ctrl+4), вписываем наши значения для RGB (Рис. 5)
Выделяем и копируем все (Ctrl+A, Ctrl+C), переходим к окну нашего меша и вставляем вместо исходных значений (Ctrl+V), Рис. 6.
Изменения, сделанные в исходном файле, будут отображены красным шрифтом.
2. Коррекция числа текстурных карт, удаление сведений о текстуре.
Поскольку наш новый материал не будет использовать текстуру, нужно удалить упоминания о ней. См. Рис. 1, строка "2472 Number of textures: 1"
Вместо 1 надо вписать 0. Идем по адресу 2472 (0х9А8). Убеждаемся в том, что там единица. Вместо единицы вписываем 0 (Рис. 7)
Поле количества текстурных карт имеет целое четырехбайтовое значение, обведено в зеленый прямоугольник. Все, что следует за ним до символов GEOM (тип текстурной карты, ее имя, Texture amount), отмечено красным прямоугольником. Все эти байты необходимо удалить. Делаем так: наводим указатель мыши на первый из них
(адрес 2476 = 0х9АС), зажимаем левую кнопку мыши и аккуратно обводим эти поля. Отпускаем кнопку мыши. Должно получиться так (Рис. 8).
Если ошиблись, снимаем выделение (Ctrl+D) и повторяем заново. Прежде, чем нажимать кнопку Delete, нужно запомнить или записать количество байт, подлежащих удалению. Это очень важно! См. Рис. 8 справа внизу, отмечено зеленым прямоугольником. Все, теперь аккуратно жмем Delete.
3. Коррекция имени материала.
Имя "...m.onetex" необходимо преобразовать к виду "...m.notex", которое будет на 1 символ короче. Формат записи следующий - Длина поля, отведенного для имени материала (целое число, 4 байта). Число должно быть кратно четырем. Затем непосредственно имя материала в символьном виде. Если имя короче, чем отведенное под него поле, остальные байты заполняются нулями (0х00). Например, если длина имени материала 21 символ (байт), то длина поля, отведенного под него, должна быть 24 байта, 3 байта после имени заполняются нулями. См. рис. 1, имя материала обведено зеленым прямоугольником, непосредственно над ним находится длина поля, отведенного под имя материала.
В нашем случае под имя материала задействовано поле в 48 байт (0х30), кратно четырем, а фактическая длина имени материала - 45 байт. Мы укоротим имя материала на 1 байт, соответственно длину поля надо изменить до 44 байт (0х2С), а лишние 4 байта удалить.
В случае, если длина поля не меняется, оставшийся лишним символ забивается кодом 0х00.
В нашем случае, меняем длину поля имени на 0x2C, а в символьном поле вместо onetex вписываем notex (Рис. 9)
У нас остается отмеченным следующий байт за полем имени. Длина уменьшилась на 4 байта, поэтому 4 байта остались лишними. Аккуратно нажимаем кнопку Delete 4 раза. Запись об удалении высвечивается в журнале (Рис. 10)
4. Правка индексов
Для того, чтобы все заработало, нужно сменить 3 индекса и сохранить меш-файл.
Посчитаем, сколько байт мы удалили. Получилось 0x64 (100) + 4 = 0x68 (104)
Теперь смотрим Рис.1, строки отмеченные коричневым и желтым прямоугольником. Это длины чанка и описания материала в нем. Только надо учесть, что в меш текст вьювере для этих параметров дается адрес начала 12-байтового поля, содержащего 3 параметра, в котором длина занимает с 5-го по 8-й байт. Соответственно, к указанным двум адресам надо прибавить 4. Эти поля длин идут непосредственно за символами CHNK и MATL. Значения - четырехбайтовые целые числа, записанные в интеловском виде. Т.е. длина чанка 5c 15 00 00 в нормальном виде будет выглядеть: 0х0000155С. (Рис. 11)
От каждой из них нужно отнять число удаленных байт и вписать обратно результат:
0x155C - 0x68 = 0x14F4
0xE0 - 0x68 = 0x78
(Рис.12)
Осталось последнее действие. Поднимаемся в начало файла. С 5-го по 8-й байт с начала файла находится еще один индекс, с которым надо проделать то же самое.
(Рис. 13)
0x334C - 0x68 = 0x32E4
(Рис. 14)
Теперь можно смело нажимать Ctrl+S, а вспомогательный файл не сохранять. Закроем хекс-эдитор и посмотрим, отображается ли наш отредактированный меш в меш-вьювере. Кстати, если цвет отличен от белого/серого/черного, то в отображении в меш-вьювере возможна значительная разница. (Рис. 15)
Не обращайте внимание на это, в игре они будут одинаковыми. (Рис. 16)
Осталось удалить ненужную больше текстуру (bulb.tga и bulb.texture.txt), проверить на наличие ошибок/предупреждений и прокоммитить объект.
Гоу-гоу-гоуджекит!
|
|
|
|