[ Обновленные темы · Новые сообщения · Участники · Поиск · RSS ]
Форум » Моддинг » 6.1. Остальные уроки » Декодируем Xom, Тип за типом... шаг за шагом... (Собираю группу психов не жалеющих свое время и мозги...)
Декодируем Xom, Тип за типом... шаг за шагом...
DrHitman27
Админы
Сообщений: 2115
Реп: 52
если подумать, то пойдёшь- я не думал поэтому условно понял tongue

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Так небольшой прогресс, одна ветвь построилось:
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

Вроде бы все! cool Все строки и контейнеры использовались!!!


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
То 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 раз в цикле прога считывает в какой-то массив данные о каждом типе
аналогично с каждым типом.


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
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
Реп: 60 / Инв: 5
Стоп
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
Реп: 60 / Инв: 5
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);

По сути так должно быть


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
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
Реп: 60 / Инв: 5
да, точно, про маску забыл=)

*(byte++); - это неясно. тут ничего не делается, насколько я понимаю
byte - указатель или сам байт?


________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
РАБОТАЕТ!!!!

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
Реп: 60 / Инв: 5
поздравляю) не знаю, чем я в этом помог..) вроде ничё сложного не было

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Quote (Герыч)
вроде ничё сложного не было

Скажи это тем кто читает эту тему wacko и нихрена не понимает wacko


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Кое-какие идеи для будущего Xom View'ера:

1. Создать табличное представление некоторых типов данных.
Вектора, списки, координаты и т.п.

2. Создать дерево-классовое представление структуры файла.
Тут будет проблема, потому что не для всех xom файлов будет возможность построения полного дерева...

3. Создать экспорт 3DS, TGA, XLS форматов

4. Самое сложное... Создать Импорт 3DS, TGA, XLS форматов...


 
Герыч
Админы
Сообщений: 1240
Реп: 60 / Инв: 5
Я кстати так и не понял окончательно как данные в xom хранятся. Ты так и не сказал формат хранимых данных. Числа(сколько байт, знаковые ли?). И где используются те индексы, с которыми была проблема?

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
В каждом типе своя структура данных. Индексы хранятся в xom-байтовом-целом , как и большинство переменных обозначающих ссылку на строку или ссылку на контейнер.
В большинстве контейнеров используется float переменные 4 байта, они как бы условные ориентиры на начало и конец контейнера.

Проблема в том, что я не знаю размер контейнера, который не заканчивается CNTR, и таких контейнеров встречается много, нужно всех их раскодировать, для начала, чтобы получить полный список контейнеров. Ну а уже потом я буду строить по этому списку дерево. Со временем дерево будет строиться для большего количества типов.

У меня вопросы:

Какие ресурсы вы хотите просматривать, изменять?

Все типы я, не смогу декодировать, это долго и сложно... Их около 200, да и нужно ли?

Если контейнеры которые раскодируются не будут ссылочно связаны с другими, то их можно будет безпроблемно заменять! Хотя, если заметить факт наличия в контейнере строковой ссылки, которую мы меняем. то меняется вся таблица строк, а значит и контейнеры использующие строки будут повреждены, в этом и проблема....


 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
XInteriorNode декодирован полностью!!!!

Он имеет массив ссылок на контейнеры, называние файла, и какие-то 4 координаты...

XInteriorNode - это своего рода папка, где лежат Xom файлы...

А это значит!!!!!!!!!! Что их можно из этих папок достать!!!!!!



Прикрепления: 0381685.png (39.8 Kb) · 2365965.png (14.6 Kb)


 
Woitek
Проверенные
Сообщений: 523
Реп: 57 / Инв: 11
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
Реп: 60 / Инв: 5
Hm.. I'm too lazy to do it)

________________________
__|____|____|____|____|__
|____|____|____|____|____|
__|___бицца головой___|__
|____|____|сюда|____|____|
__|____|____|____|____|__
|____|____|____|____|____|
 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Наконец-то у меня инет заработал!!!!
Итак, за время без связи, у меня большой прогресс, но без форума я не смог продолжить дело, т.к. только тут я вырисовывал дерево, которое мне нужно.


Проблема сейчас - это выстроить дерево, чтобы нужные текстуры связать с нужными моделями. Как только я решу эту проблему выпущу официальный релиз XomView.


 
Woitek
Проверенные
Сообщений: 523
Реп: 57 / Инв: 11
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?

 
AlexBond
Админы
Сообщений: 1042
Реп: 106 / Инв: 8
Как вам такое отображение?


Цитата 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.

Блин за что я взялся... запаришся вот так для каждого типа дерево строить...
Прикрепления: 3874759.png (44.9 Kb)


 
Форум » Моддинг » 6.1. Остальные уроки » Декодируем Xom, Тип за типом... шаг за шагом... (Собираю группу психов не жалеющих свое время и мозги...)
Поиск: