Декодируем Xom, Тип за типом... шаг за шагом...
|
|
Сообщений: 2115
|
Опубликовано: 22.06.2009, 11:50:36
если подумать, то пойдёшь- я не думал поэтому условно понял
|
|
|
|
Сообщений: 1042
|
Опубликовано: 22.06.2009, 15:21:01
Так небольшой прогресс, одна ветвь построилось: world -> XNode -> XInteriorNode Code 01 00 00 01 17 00 00 00 00 4D 71 15 41 00 4C 83 3C 85 CE 5B 41 01 00 00 00 0F На лицо явные координаты, но почему их 4-ре? : 0x17 видимо контейнер и по-моему XSkin (Хотя в других ссылка на XGroup) 00 00 00 00 - 0.0 4D 71 15 41 - 9.34016132354736 00 4C 83 3C - 0.0160274505615234 85 CE 5B 41 - 13.7379198074341 0xF - graveEye.xom Получается вид: world -> XNode -> XInteriorNode ["graveEye.xom" <0.0; 9.31; 0.02; 13.7>] -> XSkin Quote (hitman27) похоже ты уже смог получить кусочек анимации Нет анимация там подругому устроина: там имеется для этого контейнеры: Code XMatrix(0) XTransform(0) XJointTransform(5) XSkin(1) XSkinShape(1) XBone(5) XAnimClipLibrary(1) XExpandedAnimInfo(1) До них мы еще не скоро добиремся... Пока попробую построить дерево из HatAfro.xom: Code XGraphSet ("world") | "XNode" | XInteriorNode ["HatAfro.xom" <0.0; 0.0; 0.0; -1.0>] | XGroup ["afrohair" <0.0; 0.0; 0.0; -1.0>] | +--->"XMatrix" -> XTransform | XGroup ["polySurfaceShape1" <0.0; 0.0; 0.0; -1.0>] | "XCore" | XShape ["polySurfaceShape1_afro_shader" <0.0; 0.0; 0.0; -1.0>] | +-------->"XShader" | | | XSimpleShader ["afro_shader"] | | | +---> "XTextureStage" | | | | | "XTextureMap" | | | | | XOglTextureMap | | | | | XImage ("maya:file2/-1") | | | +---> "XAttribute" -> XMaterial | +---> "XGeometry" | "XGeoSet" | "XIndexedGeoSet" | XIndex edTriangleSet | +--->"XIndexArray" -> XIndexSet +---> "XVertexDataSet" -> "XCoordSet" -> XCoord3fSet +---> "XVertexDataSet" -> "XNormalSet" -> XNormal3fSet +---> "XVertexDataSet" -> "XColorSet" -> XColor4ubSet +---> "XVertexDataSet" -> "XTexCoordSet" -> XTexCoord2fSet Вторая ветвь: Code XGraphSet ("Collision Data") | XCollisionData | XCollisionGeometry [<3D Model> "afro_shader"] Третья Ветвь: Code XGraphSet ("Phantom Collision Data") | XCollisionData Четвертая ветвь: Code XGraphSet ("Detail Objects") | XDetailObjectsData Пятая ветвь: Code XGraphSet ("Forts Exported Data") | XFortsExportedData Вроде бы все! Все строки и контейнеры использовались!!!
|
|
|
|
Сообщений: 1240
|
Опубликовано: 22.06.2009, 17:16:50
То firsacho: Честно говоря AlexBond не оч понятно и подробно объясняет, так что особо не печалься) Про строки и числа и т.п.: В файлах данные обычно хранятся сплошняком байт за байтом. Чтобы точно знать, как они хранятся, надо знать длину и тип данных. Вот к примеру текстовые строки могут хранится по-разному. Символы могут кодироваться 1 или 2 байтами, длина строки может определяться или тем что записано в 1-ом байте(тупой пасклевский вариант) или нулевым байтом в конце строки. Числа тоже можно хранить по-разному, к примеру со знаком и без знака, т.е. для 1 байта можно соответсвенно получить число в пределах -127..128 или 0..255 А чтобы вообще понять xom, надо представить как работает программа, которая открывает xom. Она читает файл байт за байтом. Вот, гляди: MOIK | version | ? | Num Types | Num Counteiner | Base Counteiner Сначала читает 1-ые 4 байта, там должно быть MOIK потом читает ещё 4 байта(наверно) там версия потом читает что-то неясное потом читает число Num Types и запоминает его потом читает Num Counteiner и тоже запоминает ну и Base Counteiner Затем идёт это: TYPE | Num Counteiner | GUID type | Name Type Эта структурка повторяется Num Types раз. То есть Num Types раз в цикле прога считывает в какой-то массив данные о каждом типе аналогично с каждым типом.
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 22.06.2009, 18:09:49
Quote (Герыч) Числа тоже можно хранить по-разному, к примеру со знаком и без знака, т.е. для 1 байта можно соответсвенно получить число в пределах -127..128 или 0..255 Самое прикольное что в XOM имеются индексы, которые хранятся в своем формате, немного тупом, и непонятном: К примеру возьмем десятичное число 72. Code 72 - десятичный вид 0x48 - Hex вид 0x48 - Xom вид А теперь число 163. Code 163 - десятичный вид 0xA3 - Hex вид 0x1A3 - xom вид Далее число 375. Code 375- десятичный вид 0x177 - Hex вид 0x2F7 - xom вид Т.е. чтобы преобразовать число в hex нужно воспользоваться формулой: Code if byte0>127 then byte0 = byte0+128*(byte1-1) Кстати Герыч, я наталкнулся на проблему, если число выходит за предел и второй байт больше 127, то используется третий байт... Не мог бы ты написать универсальную формулу для этого формата? Вообще странный формат, но тем не менее он экономический. Для чисел в пределах от 0..127 используется 1 байт от 128..16383 используется 2 байта от 16384..?? используется 3 байта Блин как же работает этот формат? 8-й бит первого байта свидетельствует о наличии второго байта 8-й бит второго байта свидетельствует о наличии третьего байта и т.д. Вот так это будет на Cи: Code if ((byte0 >> 7)==0) val = byte0 else if ((byte0 >> 7)==1) val = (byte1 << 7)+(byte0 & 0x7F) А как обработать третий байт? Герыч дай формулу!!!!!
|
|
|
|
Сообщений: 1240
|
Опубликовано: 22.06.2009, 20:12:08
Стоп Quote (AlexBond) 0..127 используется 1 байт от 128..16383 используется 2 байта от 16384..?? используется 3 байта 8-ой бит тупо значит, используется ли следующий? т.е. числа 126-130 будут выглядеть так? : Code 126: 01111110 127: 01111111 128: 0000000110000000 129: 0000000110000001 130: 0000000110000010 Переход с двух байтов на 3 будет таким: Code 16382: 0111111101111110 16383: 0111111101111111 16384: 000000011000000010000000 16385: 000000011000000010000001 Я правильно понял? Если да, в чём проблема дальше?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1240
|
Опубликовано: 22.06.2009, 20:26:19
Code if ((byte0 >> 7)==0) val = byte0; else if ((byte1 >> 7)==0) val = (byte1 << 7)+(byte0 & 0x7F); else if ((byte2 >> 7)==0) val = (byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); else if ((byte3 >> 7)==0) val = (byte3 << 21)+(byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); else val = (byte4 << 28)+(byte3 << 21)+(byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); По сути так должно быть
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 22.06.2009, 21:12:34
Quote if ((byte3 >> 7)==0) val = (byte3 << 21)+(byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); Ну незнаю, помоему byte2 тоже надо маской покрывать val = (byte3 << 21)+((byte2 & 0x7F) << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); Правильно будет так: Code if ((byte0 >> 7)==0) val = byte0; else if ((byte1 >> 7)==0) val = (byte1 << 7)+(byte0 & 0x7F); else if ((byte2 >> 7)==0) val = (byte2 << 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); else if ((byte3 >> 7)==0) val = (byte3 << 21)+((byte2 & 0x7F)<< 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); else val = (byte4 << 28)+((byte3 & 0x7F)<< 21)+((byte2 & 0x7F)<< 14)+((byte1 & 0x7F)<<7)+(byte0 & 0x7F); Как думаешь если оптимизировать вот так, ошибки не будет? Code n=1; val = (byte & 0x7F); while ((byte >> 7)==1) do{ *(byte++); val =((byte & 0x7F)<<7*n++)+val; }
|
|
|
|
Сообщений: 1240
|
Опубликовано: 22.06.2009, 22:14:42
да, точно, про маску забыл=) *(byte++); - это неясно. тут ничего не делается, насколько я понимаю byte - указатель или сам байт?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 22.06.2009, 22:17:16
РАБОТАЕТ!!!! Code function TestByte128(var _p:pointer):integer; var val,n:integer; begin n:=1; val:=byte(_p^) and $7f; while ((byte(_p^)shr 7)=1) do begin inc(Longword(_p)); val:= ((byte(_p^) and $7F)shl (7*n))+val; inc(n); end; inc(Longword(_p)); Result:=val; end; Наконец-то универсальная функция =)
|
|
|
|
Сообщений: 1240
|
Опубликовано: 23.06.2009, 00:02:09
поздравляю) не знаю, чем я в этом помог..) вроде ничё сложного не было
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 23.06.2009, 00:41:29
Quote (Герыч) вроде ничё сложного не было Скажи это тем кто читает эту тему и нихрена не понимает
|
|
|
|
Сообщений: 1042
|
Опубликовано: 23.06.2009, 01:13:44
Кое-какие идеи для будущего Xom View'ера: 1. Создать табличное представление некоторых типов данных. Вектора, списки, координаты и т.п. 2. Создать дерево-классовое представление структуры файла. Тут будет проблема, потому что не для всех xom файлов будет возможность построения полного дерева... 3. Создать экспорт 3DS, TGA, XLS форматов 4. Самое сложное... Создать Импорт 3DS, TGA, XLS форматов...
|
|
|
|
Сообщений: 1240
|
Опубликовано: 23.06.2009, 10:13:50
Я кстати так и не понял окончательно как данные в xom хранятся. Ты так и не сказал формат хранимых данных. Числа(сколько байт, знаковые ли?). И где используются те индексы, с которыми была проблема?
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
Сообщений: 1042
|
Опубликовано: 23.06.2009, 21:26:21
В каждом типе своя структура данных. Индексы хранятся в xom-байтовом-целом , как и большинство переменных обозначающих ссылку на строку или ссылку на контейнер. В большинстве контейнеров используется float переменные 4 байта, они как бы условные ориентиры на начало и конец контейнера. Проблема в том, что я не знаю размер контейнера, который не заканчивается CNTR, и таких контейнеров встречается много, нужно всех их раскодировать, для начала, чтобы получить полный список контейнеров. Ну а уже потом я буду строить по этому списку дерево. Со временем дерево будет строиться для большего количества типов. У меня вопросы: Какие ресурсы вы хотите просматривать, изменять? Все типы я, не смогу декодировать, это долго и сложно... Их около 200, да и нужно ли? Если контейнеры которые раскодируются не будут ссылочно связаны с другими, то их можно будет безпроблемно заменять! Хотя, если заметить факт наличия в контейнере строковой ссылки, которую мы меняем. то меняется вся таблица строк, а значит и контейнеры использующие строки будут повреждены, в этом и проблема....
|
|
|
|
Сообщений: 1042
|
Опубликовано: 23.06.2009, 22:44:45
XInteriorNode декодирован полностью!!!!
Он имеет массив ссылок на контейнеры, называние файла, и какие-то 4 координаты...
XInteriorNode - это своего рода папка, где лежат Xom файлы...
А это значит!!!!!!!!!! Что их можно из этих папок достать!!!!!!
|
|
|
|
Сообщений: 523
|
Опубликовано: 25.06.2009, 18:15:56
Good crop and also to write in English. But if someone translate it to me now well on the English? For as you too have a problem with understanding some words.
Сообщение отредактировал mambaczarna - ЧТ, 25.06.2009, 18:17:16
|
|
|
|
Сообщений: 1240
|
Опубликовано: 25.06.2009, 18:23:58
Hm.. I'm too lazy to do it)
________________________ __|____|____|____|____|__ |____|____|____|____|____| __|___бицца головой___|__ |____|____|сюда|____|____| __|____|____|____|____|__ |____|____|____|____|____|
|
|
|
|
|
Сообщений: 523
|
Опубликовано: 25.06.2009, 23:05:25
Ah I want to do something similar. Only that I diminished the laser trigger the WF added uzi, created the texture and I did something along the lines of a laser with Earthworm Jim. Only I did not know how to construct the animation.Добавлено (25.06.2009, 23:05) --------------------------------------------- I tried to replace the texture xom view which shows the image hex code. Then I opened my bazooka.xom hex editor and found I used to cut. Then I made the picture and threw it in xom and opened a second xom view. Then again, downloaded the hex code and paste into bazooka.xom together. To my surprise, in view xom is displayed but with the inclusion of the game error. I do something wrong?
|
|
|
|
Сообщений: 1042
|
Опубликовано: 25.06.2009, 23:18:08
Как вам такое отображение?
Цитата mambaczarna () Only I did not know how to construct the animation.
I too not know this, while...
Цитата mambaczarna () I do something wrong? XImage it very hard structure, it have Mipmap Textures for OpenGL. For replace textures you need special software.
Блин за что я взялся... запаришся вот так для каждого типа дерево строить...
|
|
|
|