Декодинг PMA\PMG\PMC\PMD
Сообщений 61 страница 90 из 143
Поделиться622009-08-11 20:58:31
Меня интересовал, насколько помню, блок Variant1, там прописаны ключи (key), по которым выбирается скин (по твоему определению).Для очень многих описаний грузов и используемых ими прицепов определены скины фиксированные, как то plain или plain2. Мне как дурню, понадобилось создать компанию (тот еще гемор по сравнению с предыдущими играми), которая использовала грузы под прицепы fuel_cistern и food_cistern, у которых при выборе груза именно в блоке Variant1 ищется по названию компании используемый скин, вариант с фиксированных скином не проходит.Поэтому в этом блоке расположены ключи с названиями EuroGoodies, ITCC и прочие. Причем написаны ключи (названия компаний) в зашифрованном виде.
Разобрался.
Там находится восьмибайтное число с контрольной суммой имени текстуры (не mat и не tobj!). Для городов и дорог они прописаны в def/world/overlay.sii.
Алгоритм подсчета прост.
Символы кодируются значениями от 01h до 25h
0 - 01h, 1 - 02h, 9 - 0Ah, A - 0Bh, Z-24h, _ - 25h
Регистр букв в строке переводится в заглавные.
Подсчет начинается с конца строки.
Если Ch - значение символа, то
Result = result*26h+ch
Вот функция на дельфях. Проверена, я к указателям городов добавил Минск
function TForm1.GetCRC(S: String): Int64;
var I,J: Integer;
begin
Result:=0; S:=AnsiUpperCase(S);
for I:=length(S) downto 1 do begin
case S[i] of
'0'..'9': J:= Ord(S[i])-Ord('0')+1;
'A'..'Z': J:= Ord(S[i])-Ord('A')+11;
'_': J:=25;
else J:=0;
end;
Result:=Result*$26+J;
end;
end;
Отредактировано avmark (2009-08-11 22:15:58)
Поделиться642009-08-27 18:13:12
Как видно из скрина, размер тени не привязан к размеру куба коллизии. И что делать, как его изменить, я имею в виду размер тени ???
Надо просто переместить коллизию на то места куда хочеш и все.
Поделиться652009-08-27 18:21:20
tomas-ind, что это у тебя за полосы такие Может хаулиновским движком предусмотрено, чтобы "края тени" будем образно так говорить были расположены на определенном рассотоянии от краев коллизии? Попробуй коллизию еще подвинуть по иксу ближе к заду...
Поделиться662009-08-28 08:47:56
Как это ? Размеры тени - это и есть размеры коллизии!!! - заноза ессно не умеет правильные значения делать..поэтому правим центр ! и размеры кубов в хексе.тогда все будет ровно.
Поделиться672009-08-28 15:21:59
Как это ? Размеры тени - это и есть размеры коллизии!!! - заноза ессно не умеет правильные значения делать..поэтому правим центр ! и размеры кубов в хексе.тогда все будет ровно.
Lexan, я всё делал по твоему методу. И как ты и утверждал колизия изменилась, но тень осталась неизменной. Как видим из скрина куб коллизи на месте, т.е. отцентрован, но тень при этом имеет в два раза больший размер чем куб, по одной из сторон, т.е. по длине трейлера...
Почему не понятно...
Поделиться682009-08-31 14:06:30
Кажись я понимаю...ты коллизию случайно не Скайлил ? инструментом скейл ?..или же двигал вершины ?...чтобы увеличить размер ?.
кстати ты можешь импортнуть грузовик и посмотреть что у тебя с коллизией..после изменения в хексе.
Отредактировано Lexan (2009-08-31 14:06:59)
Поделиться692009-09-02 13:09:12
Кажись я понимаю...ты коллизию случайно не Скайлил ? инструментом скейл ?..или же двигал вершины ?...чтобы увеличить размер ?.кстати ты можешь импортнуть грузовик и посмотреть что у тебя с коллизией..после изменения в хексе.
Нет... На сколько помню, т.к. было это где-то год назад, я изменял размеры куба вручную, задавая значения размеров в его свойствах. Ну я же у тягачей кубы изменял и всё работало, хотя у трака не один куб коллизии. У трейлеров тот-же метод изменения, только прописывать потом параметры хексом нужно, на сколько я понимаю это и все отличия...
Конечно я пробовал импортить, колизия как на скрине. Т.е. она изменяется, как мне нужно, но тень при этом остаётся неизменной. Ещё меня удивило то, что в этом трейлере, при импорте дефолтной модели, почему то оказалось несколько кубов коллизии. Я пробовал переставлять местами кубы, т.к. в траках от места в иерархии зависит и свойство куба, в конце концов на сколько помню оставл только один куб, но результат ты сам видишь...
Ладно, трудно давать советы на растоянии, буду сам разбираться, как найду причину сообщу.
Поделиться702009-09-02 21:55:58
ну вполне возможна проблема изза-колва вариантов (один вариант или несколько)
Поделиться712009-09-29 20:13:24
Частичный разбор PDD-файла на примере "road2_x_road2_sidewalk_all.pdd"
Спасибо newgeneral, за первоначальный декодинг.
Вот что получилось...
Линии разобраны на 90%.
Я старый паскалист, поэтому все типы, как для дельфей.
INT64 - 8 байтное целое число со знаком;
Integer - 4 байтное целое число со знаком.
Single - 4 байтное дробное число со знаком (float).
Структура "точки" координат.
PDD_Point = packed record
X,Y,Z: Single;
end;
Количество линий находится по смещению 8h от начала файла(Integer). По адресу 28h от начала файла находится значение смещения от начала файла на массив линий (Integer).
Сами линии описываются следующей структурой (размер - 116 байт).
PDD_line = packed record
NameCRC: Int64;
Unknown1: Integer;
ToNode: Integer;
Unknown2: Integer;
Positions: Array[1..2] of PDD_point;
Angle: Array[1..2] of PDD_Point;
Unknown3: Integer;
LinkTo,
LinkFrom: Array[1..4] of Integer;
CountLinkTo,
CountLinkFrom: Integer;
Unknown4: Integer;
end;
Описание
NameCrc - контрольная сумма имени линии. Вычисляется аналогично, как я писал ранее, для PMD. Может принимать различные значения вида "PREFABLOC", "PREFLOC21", "PRELOC25" и пр. Не уникально даже внутри одного файла. Имена в открытом виде нигде не встречаются. Кто дружит с Занозой, может быть более разберется, для чего они и как формируюутся.
Unknown1 - Разрешение проезда? Принимает 4 значения.
0 - чаще всего.
8 - городские перекрестки, поворот, малый радиус (синяя линия на рисунке) (легковые?).
76(4ch) - городские перекрестки, поворот, большой радиус (зеленая линия)(Грузовики?).
64(40h) - только Т-развязки автострад, малый радиус, проезд под мостом и пр. (красная линия).
ToNode - В направлении какой ноды перекрестка движется транспорт по линии.
Ноды кодируются побитно, начиная с 2-х (2, 4, 8, 16). Если линия заканчивается на "развилке" (например, прямо и направо), прописывается сумма нод (2+4=6).
Unknown2 - Всегда 1. Количество линий? Разрешенная скорость?
Positions - Координаты начала и конца линии (X,Y,Z) относительно центра перекрестка.
Angle - угол поворота автомобиля в начале и конце линии (X,Y,Z). (см.рис).
LinkTo, LinkFrom - массивы из 4-х значений.
Все линии нумеруются по порядку, начиная с 0. В этих массивах содержатся номера линии, с которыми граничит текущая. Если значение "пустое", записывается "-1" (FF FF FF FF).
CountLinkTo и CountLinkFrom - соответственно, количество значений в массиве.
Если линия не граничит с другими, все четыре значения будут "-1", а count - "0".
Пример, на рисунке.
Unknown4 - как-то связан с предыдущими данными. Принимает значения 0 (чаще), 2 или 4.
Остается непонятным Unknown3. Для каждой линии разное. Не целое число (слишком большое), не дробное, не crc.
Беглый взгляд на структуру ноды. Аналогично линиям, количество прописано по смещению 4h от начала файла, смещение на начало - 24h.
PDD_Node_Unknown = packed record
Unknown3: Array[1..128] of Byte; // 00 (нули)
Unknown4: Array[1..32] of Single; // 00 00 20 40 = 2,5
Unknown5: Array[1..384] of Byte; // 00
end;
PDDNode = packed record //1376 байт
Unknown1: Integer; //Номер ноды?
Unknown2: Integer;
Coord1, //Координаты ноды?
Coord2: PDD_Point; //Направление, угол (похож на angle в линии)?
Unknown: Array[1..2] of PDD_Node_Unknown
LineBegin, //номера линии, которые начинаются
LineEnd: Array[1..8] of Integer; // и заканчиваются на этой ноде. Либо, "-1" (FF FF FF FF).
end;
Остальное позже...
Поделиться722009-09-29 22:26:14
avmark, да... На вес золота такой труд, пригодится)
Поделиться732009-10-02 21:50:39
Продолжается разбор PDD.
В принципе, почти закончен. Что не разобрал, может коллективный разум подскажет...
Во первых, я был неправ по поводу "угла поворота". Это, скорее, направление. Принимает значения от -1 до 1. Я не моделирую, поэтому не знаю терминов. Если называется не так, ногами не пинать.
В архиве содержится TXT файлы с таблицами блоков и отрисованные по ним JPG. Не всегда, корректно, но вроде понятно.
Непосредственно разбор:
Повторюсь, точка координат или направление
PDDPoint = packed record
X,Y,Z: Single;
end;
Заголовок
PDDTitle = packed record
Title: Integer; // всегда 15. "Магическое число"
CountNodes: Integer; // количество нод
CountLines: Integer; // количество линий
CountSigns: Integer; // количество знаков
CountLights: Integer; // количество светофоров
CountServices: Integer; // количество точек сервиса и погрузок/разгрузок
CountUnknown3: Integer; // неизвестно, но всегда 0
CountLimits: Integer; // "Ограничители" края перекрестка см.рис.
CountVariants: Integer; // Скорее всего, варианты перекрестка. Всегда 1.
OffsNodes: Integer; // смещение на блок нод.
OffsLines: Integer; // линий
OffsSigns: Integer; // знаков
OffsLights: Integer; // светофоров
OffsServices: Integer; //"сервисов"
OffsUnknown3: Integer; //пусто
OffsLimitsCoord: Integer; //координаты ограничителей
OffsLimitsAngle: Integer; // направление ограничителей
OffsVariants: Integer; // блок вариантов.
end;
Если блока нет (количество = 0), смещение прописывается на "следующий" существующий блок. Поэтому адреса повторяются.
Ноды: (темнозеленые точки на рисунке)
PDD_Node_Unknown = packed record
Unknown3: Array[1..128] of Byte; // 00 (нули)
Unknown4: Array[1..32] of Single; // 00 00 20 40 = 2,5
Unknown5: Array[1..384] of Byte; // 00
end;
PDDNode = packed record
Unknown1: Integer;
Unknown2: Integer;
Coord, //Координаты ноды
Angle: PDDPoint; //Направление, угол
Unknown: Array[1..2] of PDD_Node_Unknown; //у всех одинаково
LineBegin, //номера линии, которые начинаются
LineEnd: Array[1..8] of Integer; // и заканчиваются на этой ноде. Либо, "-1" (FF FF FF FF).
end;
Unknown1 и Unknown2 пока неясные числа. Unknown1 нулевой ноды всегда равен 0. Следующей - Unknown1+Unknown2 предыдущей. Как формируется Unknown2, пока не разобрался.
Линии:
Как в преыдущем посте. Ничего нового. Unknown3 остался невыясненным...
Светофоры: (красные точки)
PDDLight = packed record
Coord: PddPoint; // координаты светофора
Angle: PddPoint; // направление
Unknown1, // всегда 0
MainNode: Integer; //какую ноду регулирует.
end;
Знаки: (Ярко-зеленые точки)
PDDSign = packed record
Unknown1, //всегда 0
Unknown2: Integer; // аналогично
Coord: PddPoint; // координаты знака
Angle: PddPoint; // направление
Unknown3: Integer; // всегда 0
NumSign: Integer; // номер знака из def\world\sign.sii
Unknown4: Integer; // всегда 0
Unknown5: Word; // всегда 0
Unknown99: Array[1..3] of Integer; // всегда -1 (FF FF FF FF)
Unknown6: Word; // всегда 0
end;
Сервисы (желтые точки)
PDDService = packed record
Coord, // координаты
Angle: PddPoint; // направление
Unknown1, // всегда 0
NumService : Integer; // код сервиса. Откуда берется, пока не понял.
end;
Ограничители (синие точки)
Либо границы перекрестка, либо ограничение проезда.
Разделены на два блока. Структура - PDDPoint (X,Y,Z). В первом блоке координаты точки, во втором - направление (на следующую?).
В текстовике объединены в одну таблицу, для удобства.
Варианты.
PDDVariant = packed record
NameCRC: Int64; // CRC имени варианта. Всегда "_default"
Unknown1: Integer; // всегда 0
end;
Вроде все. Если кто заметит, что проскочило мимо моего внимания, буду благодарен.
Поделиться742009-10-03 20:08:31
Пока последние изменения в разборе PDD.
Ноды.
Unknown1 и Unknown2 можно переименовать в SumLimits и CountLimits.
CountLimits - количество точек ограничений (limits) между текущей нодой и предыдущей (для нулевой - с последней). SumLimits - сумма точек, начиная с нулевой ноды (SumLimits[1]=SumLimits[0]+CountLimits[0]). Для последней ноды SumLimits+CountLimits=CountLimits заголовка PDD.
Знаки.
Теперь структура выглядит следующим образом
PDDSign = packed record
Unknown1, //всегда 0
Unknown2: Integer; // аналогично
Coord: PddPoint; // координаты знака
Angle1X,
Angle2X,
Angle1Z,
Angle2Z: Single; // направление
NumSign: Integer; // номер знака из def\world\sign.sii
Unknown4: Integer; // всегда 0
Unknown5: Word; // всегда 0
Unknown99: Array[1..3] of Integer; // всегда -1 (FF FF FF FF)
Unknown6: Word; // всегда 0
end;
Четыре числа типа Single (float) вместо Angle и Unknown3.
Для больших английских развязок данные записываются в Angle2. (Angle1=0) Для остальных наоборот, Angle2=0, Angle1<>0.
Для некоторых перекрестков (например "парковки" (parking.pdd)), для двух фонарей все четыре числа ненулевые.
Как пример разбора, выложил два городских перекрестка, где светофоры расположены в начале и в конце префаба. Остановившись на левой полосе не надо головой крутить, чтобы светофор увидеть.
Отредактировано avmark (2009-10-03 20:28:11)
Поделиться752009-10-09 14:16:23
Эт конечно здорово..встречное предложение
доразбирать всетаки PMG - с анимацией, главное найтисвязь обьектов - с пма файлами, и геометрический массив.полностью.
Поделиться762010-01-31 02:42:51
Ребят, подскажите пожалуйста, как можно снизить освещение в кабине? После жизни в ETS и первого запуска GTS, даже на глаз заметно, что в GTS освещение в кабине гораздо меньше, чем в ETS. Предполагаю, что данные освещение хранятся в PMG-файлах.
Для сравнения, открыл model.pmg из ETS и из GTS:
Как видно из скринов, в ETS салоне гораздо светлее, чем в GTS.
Есть ли у кого-нибудь мысли, как это можно исправить (кроме прямого копирование файлов из одной игры в другую)? Может байтик какой-то есть, отвечающий за уровень освещённости?
Отредактировано Knox_xss (2010-01-31 02:43:30)
Поделиться772010-01-31 02:49:35
Knox_xss только если красить вершины в занозе через команду surface/paint/color.
Поделиться782010-01-31 12:44:22
Knox_xss
А зачем копировать да и вообще менять? С помощью краски вершинок разрабы сделали хоть какие-то тени в салоне. В GTS салон выглядит более реалистично чем в ETS.
Поделиться792010-01-31 16:23:03
А зачем копировать да и вообще менять? С помощью краски вершинок разрабы сделали хоть какие-то тени в салоне. В GTS салон выглядит более реалистично чем в ETS.
В том-то и дело, что хотелось бы, чтобы в ETS был такой же салон, как и в GTS. Поэтому предположил, что в GTS просто смещён источник света и немного уменьшена его яркость. Пробовал в ETS ставить салон из GTS - выглядит так же, как и в GTS, но есть две загвоздки:
- зеркала не работают (показывает только vehicle_reflection.tobj);
- FOV остался прежним.
Кстати о FOV (field of view). Предполагаю, что его значение напрямую прописано в game.exe. Хотелось бы и его изменить, так что пока ищем, ищем...
Поделиться802010-02-10 16:39:50
в етс возможно да
в гтс в описании камеры идет и FOV и анимация. трясяскии
Поделиться812010-03-10 20:48:17
Пробовал в ETS ставить салон из GTS - выглядит так же, как и в GTS, но есть две загвоздки:
- зеркала не работают
Ну так скажем чего-то ты не доработал или не до понял...
Салоны становятся реально и с зеркалами и с вариантами и классами....
Поделиться822010-03-14 08:35:05
ну. так в ЕТС..отдельной моделью зеркала идут. а в ГТС в моделе салона, хотя должны работать оба варианта. т.к. шейдеры есть и там и там.
Поделиться832010-03-25 20:07:10
Новые данные по перекресткам, появившиеся во время конвертации "левосторонних" в "правосторонние".
Во всех типах название поля Angle можно заменить на Direction. Так будет более правильно. Direction означает направление объекта в требуемой точке. Вычисляется как проекция вектора по трем осям. Проще говоря, если угол Y=0, то X и Z равны соответственно -SIN и -COS от угла направления. Если Y<>0, то расчет несколько сложнее. Привет математикам, а я давно все забыл.
Линии:
Unknown1 заменяем на BitParams - битовые свойства линии. Со всеми пока не разбирался, но 4-й и 5-й биты означают включение у траффика соответственно правого и левого поворотника. 7-й, возможно, сброс скорости.
Unknown3 заменяем на LengthOfLine: Single; - длина линии. Вычисляется, скорее всего, по дуге, а не напрямую между точками. По крайней мере "прямые" значения не совсем совпадали с прописанными в PDD.
Остались невыясненными для линий Unknown2 (всегда равен 1), и Unknown4 - принимает значения 0 и 2. Замена одно на другое никаких видимых результатов не дала.
Структура линии на дельфях теперь выглядит так:
PDD_line = packed record
NameCRC: Int64;
BitParams: Integer;
ToNode: Integer;
Unknown2: Integer;
Positions: Array[1..2] of PDD_point;
Direction: Array[1..2] of PDD_Point;
LengthOfLine: Single;
LinkTo,
LinkFrom: Array[1..4] of Integer;
CountLinkTo,
CountLinkFrom: Integer;
Unknown4: Integer;
end;
Отредактировано avmark (2010-03-25 20:16:33)
Поделиться842010-04-08 13:38:04
Ну так скажем чего-то ты не доработал или не до понял...
Салоны становятся реально и с зеркалами и с вариантами и классами....
Ну так может ты подскажешь, какие параметры изменить, чтобы зеркала заработали?
И салоны, и варианты, и классы - всё становится отлично. Кроме зеркал.
ETS, по крайней мере версии 1.2, следующие параметры из GTS-ного renault_magnum_interior_excl.sii вообще не принимает:
# active_mirrors_part: a_mirrors
# passive_mirrors_part: p_mirrors
Пришлось закомментить и оставить родные.
Ни одни из следующих не работают.
mirrors_part: p_mirrors
mirrors_part: a_mirrors
mirrors_part: mirrors
mirrors_part: mirrors_s
mirrors_part: mirrors_e
Поделиться852010-04-08 19:43:01
Knox_xss
Я конвертнул Ман и Даф в ЕТС вместе с салонами...
Скачай на моём сайте и посмотри что да как.....
Военного там ничего нет.... кроме бортового компа....
Поделиться862010-04-21 19:09:40
Lexan
у меня к те просьба ты не мог бы дать сваю не заблокированую модель мод камаз то хо4у редактировать а не полу4ается ((
Отредактировано mexnik (2010-04-22 13:01:41)
Поделиться872010-05-24 01:17:20
AI-машины, стоящие на префабах (заправках, стоянках, сервисах и т.п.)... нигде не нашёл информации, где они прописаны.
Теоретически, должна храниться следующая инфа:
- координаты относительно центра префаба (float X, Y, Z);
- направления (float X, Y, Z);
- тип транспортного средства (никакой/легковой/грузовой/грузовой с прицепом);
- либо прицеп (допустим, 0 - если без прицепа);
...
Ну что-то типа того.
Никто из вас не сталкивался с этим?
Поделиться882010-05-24 09:23:04
открой саму модель префаба, там думмисы под паркованный транспорт имеются...
Поделиться892010-05-27 13:32:48
(Прошу сильно не пинать, с занозой не дружу.)
Кто знает, камера в кабине привязана к синему кубу или она имеет свои координаты? Или синий куб и есть камера?
Хочется в хексе поиграться с позицией камеры по трём осям, но из приведенного выше описания структуры PMG не очень понятно, где искать координаты камеры.
В дефинишинах камеры параметр uplift отвечает за движение камеры по оси Y, следовательно где-то запрятаны оси X и Z. Может кто сталкивался с этим?
Поделиться902010-07-05 19:07:52
ребята , подскажите как редактировать пмд для салона ??? заранее благодарю !
извените если не туда написал !
Отредактировано Dron3 (2010-07-05 19:08:18)