<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://stalkerin.gameru.net/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=93.125.1.170&amp;*</id>
		<title>S.T.A.L.K.E.R. Inside Wiki - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://stalkerin.gameru.net/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=93.125.1.170&amp;*"/>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/93.125.1.170"/>
		<updated>2026-06-10T11:48:15Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Excid</id>
		<title>Обсуждение участника:Excid</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Excid"/>
				<updated>2015-01-15T19:40:40Z</updated>
		
		<summary type="html">&lt;p&gt;93.125.1.170: /* Текстурные координаты — UVs (0x1012) */ были указаны (0x1008)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формат разобрал excid'''&lt;br /&gt;
&lt;br /&gt;
== О формате ==&lt;br /&gt;
Формат *.object используется в качестве основного формата хранения моделей на этапе редактирования (включая экспорт из Maya или 3ds Max и хранение моделей до компиляции уровня)&lt;br /&gt;
&lt;br /&gt;
== Описание структуры ==&lt;br /&gt;
Формат бинарный. Файл состоит из вложенных друг в друга блоков. Весь файл представляет собой единый блок.&lt;br /&gt;
&lt;br /&gt;
=== Структура блока ===&lt;br /&gt;
Блок имеет 3 обязательные части:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Часть||Тип(размер)||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Идентификатор типа блока||(4)||2 байта идентификатора и 2 нулевых байта&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Размер блока||uint(4)||без учета этих частей — только то, что идет дальше&lt;br /&gt;
|-&lt;br /&gt;
|Данные||(Размер блока)||Данные могут быть представлены вложенными блоками&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Типы данных ===&lt;br /&gt;
Особое внимание стоит обратить на то, как хранятся строки: они нуль-терминальные, то есть в конце обязательно содержат нулевой байт.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
В заголовке последующих пунктов в скобках содержатся идентификаторы типа блока в шестнадцатиричной форме, при этом байты представлены в обратном порядке (то есть так, как числа задаются в исходниках), поэтому идентификатор 0x0912 в файле будет выглядеть как 09 12 00 00.&lt;br /&gt;
&lt;br /&gt;
== Файл (0x7777) ==&lt;br /&gt;
=== Неизвестные данные (0x0900) ===&lt;br /&gt;
Возможно, это версия.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(2)||0x10 0x00||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Пользовательские информация — User Data (0x0912) ===&lt;br /&gt;
В редакторе Game options &amp;gt; User Data.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Данные||строка||||Произвольная строка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Уровень детализации — LOD (0x0925) ===&lt;br /&gt;
В редакторе LOD &amp;gt; Reference.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Ссылка||строка||||Путь к модели, содержащей следующий уровень детализации&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тип объекта — Object Type (0x0903) ===&lt;br /&gt;
В редакторе Object Type.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Тип||(4)||||Значение 0x00 для статической модели (тип Static)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Данные о геометрии — Geometry (0x0910) ===&lt;br /&gt;
В редакторе Geometry.&lt;br /&gt;
Все представленные ниже данные описывают 1 подобъект.&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1000) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(2)||0x11 0x00||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Название подобъекта — Name (0x1000) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название||строка||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ограничивающий параллелепипед — Bounding Box (0x1004) ====&lt;br /&gt;
В редакторе Transform &amp;gt; BBox Min/Max&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Минимум||float(4)[3]||||Минимальные значения вершин по x, y, z&lt;br /&gt;
|-&lt;br /&gt;
|Максимум||float(4)[3]||||Максимальные значения вершин по x, y, z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1002) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(1)||0x05||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1010) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(8)||0x00||Все нули&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Вершины — Vertices (0x1005) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество вершин n||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Координаты||float(4)[n * 3]||||Координаты x, y, z для каждой вершины&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Грани — Faces (0x1006) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество граней m||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Координаты||uint(4)[m * 6]||||Троки пар индекс вершины + индекс текстурной координаты&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Группы сглаживания — Smoothing Groups (0x1013) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Группы||uint(4)[m]||||32-битная маска групп сглаживания для каждой грани&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Словарь текстурных координат — UVs map (0x1008) ====&lt;br /&gt;
Логика формирования и назначение этого и блока «Текстурные координаты» доконца не понятна.&lt;br /&gt;
Предположительный вариант представлен ниже.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество записей k||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Данные||(9)[k]||||Предположительная структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||byte(1)||0x1||&lt;br /&gt;
|-&lt;br /&gt;
|Индекс таблицы текстурных координат||uint(4)||0x0 или 0x1||Возможно, только первый байт содержит эти данные,&amp;lt;br /&amp;gt; остальные выполняют другие функции&amp;lt;br /&amp;gt;Встречались «некорректные» данные (например, 0x1 0x90 0xdb 0x11 0x7), но они не использовались&lt;br /&gt;
|-&lt;br /&gt;
|Индекс текстурных координаты||uint(4)||0x0 или 0x1||Индекс в таблице, определяемой предыдущим значением.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Материалы объекта — Object Materials (0x1009) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество материалов p||ushort(2)||||&lt;br /&gt;
|-&lt;br /&gt;
|Материалы||[p]||||Cтруктура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название материала||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Количество граней q||uint(4)||||Количество граней, имеющих этот материал&lt;br /&gt;
|-&lt;br /&gt;
|Индексы граней||uint(4)[q]||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Текстурные координаты — UVs (0x1012) ====&lt;br /&gt;
Количество таблиц, которое встречалось в тестовых файлах — 2.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество таблиц t||uint(4)||0x2||&lt;br /&gt;
|-&lt;br /&gt;
|Таблицы||[t]||||Структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||строка||Texture||&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||ubyte(1)||0x2||Возможно, количество компонентов в текс. координате?&lt;br /&gt;
|-&lt;br /&gt;
|Номер таблицы||ushort(1)||||&lt;br /&gt;
|-&lt;br /&gt;
|Количество текстурных координат s||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Текстурные координаты||float(4)[s * 2]||||Пары значения текстурных координат u и v&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||uint(4)[s]||||Какие-то индексы, не превышающие s&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно&amp;lt;br /&amp;gt;(только для второй таблицы)||uint(4)[s]||||Какие-то индексы, не превышающие s, отсорированные по возрастанию&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Материалы — Materials (0x0907) ===&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество материалов r||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Материалы||[r]||||Структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для движка||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для компилятора||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для игры||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Путь к текстуре||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||строка||Texture||Значение Texture используется в блоке &amp;lt;br /&amp;gt;Текстурные координаты — UVs (0x1008)&lt;br /&gt;
|-&lt;br /&gt;
|Флаги||uint(4)||||0x1, если материал двустронний, иначе 0x0&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(4)||0x12 0x1 0x0 0x0 0x1 0x0 0x0 0x0||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Автор — Author (0x0922) ===&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Создатель||строка||||Вид \\компьютер\пользователь (например, \\NAPALI\excid)&lt;br /&gt;
|-&lt;br /&gt;
|Дата создания||(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Последний модифицирующий||строка||||Вид \\компьютер\пользователь (например, \\NAPALI\excid)&lt;br /&gt;
|-&lt;br /&gt;
|Дата модификации||(4)||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Скрипт разбора файла ==&lt;br /&gt;
Написан на Python. Не реализован полностью, завершение не планируется, так как свою миссию он выполнил.&amp;lt;br /&amp;gt;&lt;br /&gt;
Если запускать из Blender, то импортирует объект (без материалов).&amp;lt;br /&amp;gt;&lt;br /&gt;
Не рекомендуется запускать для больших файлов, так как выводится вся информация из файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#                                           #&lt;br /&gt;
#    XRay Engine (S.T.A.L.K.E.R.) object    #&lt;br /&gt;
#       test import plugin for Blender      #&lt;br /&gt;
#                                           #&lt;br /&gt;
#          Anton 'excid' Gorenko            #&lt;br /&gt;
#              excid@mail.ru                #&lt;br /&gt;
#                                           #&lt;br /&gt;
#               (2007 June)                 #&lt;br /&gt;
#                                           #&lt;br /&gt;
&lt;br /&gt;
from struct import *&lt;br /&gt;
import datetime&lt;br /&gt;
&lt;br /&gt;
useBlender = True&lt;br /&gt;
try:&lt;br /&gt;
    from Blender import *&lt;br /&gt;
    from Blender.Mathutils import *&lt;br /&gt;
except:&lt;br /&gt;
    useBlender = False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
f = open('X:\\rawdata\\objects\\detail\\det_list_05.object', 'rb')&lt;br /&gt;
s = f.read()&lt;br /&gt;
f.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def parseMeshData(s):&lt;br /&gt;
    &lt;br /&gt;
    p = 0&lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nname block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    nameSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'name block size =', nameSize&lt;br /&gt;
    p += 4&lt;br /&gt;
    name = unpack('%ds' % (nameSize,), s[p : p + nameSize])[0][:-1]&lt;br /&gt;
    p += int(nameSize)&lt;br /&gt;
    print 'name =', name&lt;br /&gt;
    &lt;br /&gt;
    if useBlender:&lt;br /&gt;
        obj = Object.New('Mesh', name)&lt;br /&gt;
        mesh = Mesh.New(name)&lt;br /&gt;
        obj.link(mesh)&lt;br /&gt;
        scene = Scene.GetCurrent()&lt;br /&gt;
        scene.objects.link(obj)&lt;br /&gt;
    &lt;br /&gt;
    print '\nbbox block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'bbox block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'bbox min = ', unpack('3f', s[p : p + 12])&lt;br /&gt;
    p += 12&lt;br /&gt;
    print 'bbox max = ', unpack('3f', s[p : p + 12])&lt;br /&gt;
    p += 12&lt;br /&gt;
    &lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nvertices block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4  &lt;br /&gt;
    print 'vertices block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4  &lt;br /&gt;
    verticesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'vertices count =', verticesCount &lt;br /&gt;
    for i in range(verticesCount):&lt;br /&gt;
        coords = unpack('3f', s[p : p + 12])&lt;br /&gt;
        print 'vertex%d =' % (i,), coords&lt;br /&gt;
        p += 12&lt;br /&gt;
        &lt;br /&gt;
        if useBlender:&lt;br /&gt;
            mesh.verts.extend([coords])&lt;br /&gt;
    &lt;br /&gt;
    print '\ntriangles block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'triangles block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    &lt;br /&gt;
    trianglesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'triangles count =', trianglesCount   &lt;br /&gt;
    &lt;br /&gt;
    faces = []&lt;br /&gt;
    for i in range(trianglesCount):&lt;br /&gt;
        vertices = unpack('6I', s[p : p + 24])&lt;br /&gt;
        print 'triangle%d =' % (i,), vertices&lt;br /&gt;
        p += 24&lt;br /&gt;
        &lt;br /&gt;
        faces.append(vertices)&lt;br /&gt;
        &lt;br /&gt;
    print '\nsmoothgroups block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'smoothgroups block size =', size&lt;br /&gt;
    for i in range(size / 4):&lt;br /&gt;
        x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'triangle%d =' % (i,), hex(int(x))&lt;br /&gt;
        p += 4&lt;br /&gt;
    &lt;br /&gt;
    print '\nuv map block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'uv map block size =', size&lt;br /&gt;
    count = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'count =', count&lt;br /&gt;
    &lt;br /&gt;
    layerIndices = []&lt;br /&gt;
    uvIndices = []&lt;br /&gt;
    for i in range(count):&lt;br /&gt;
        unknown = unpack('5B', s[p : p + 5])&lt;br /&gt;
        p += 5&lt;br /&gt;
        &lt;br /&gt;
        uvIndex = int(unpack('I', s[p : p + 4])[0])&lt;br /&gt;
        p += 4&lt;br /&gt;
        &lt;br /&gt;
        print 'uv index =', map(hex, unknown), uvIndex&lt;br /&gt;
        &lt;br /&gt;
        layerIndices.append(unknown[1])&lt;br /&gt;
        uvIndices.append(uvIndex)&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
    print '\nmaterials block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'materials block size =', size&lt;br /&gt;
    materialsCount = unpack('H', s[p : p + 2])[0]&lt;br /&gt;
    p += 2&lt;br /&gt;
    print 'materials count =', materialsCount&lt;br /&gt;
    &lt;br /&gt;
    for i in range(materialsCount):&lt;br /&gt;
        materialName = ''&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        while b != 0:&lt;br /&gt;
            materialName = materialName + chr(b)&lt;br /&gt;
            b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
            p += 1&lt;br /&gt;
        print 'material%d name =' % (i,), materialName&lt;br /&gt;
        &lt;br /&gt;
        trianglesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        p += 4&lt;br /&gt;
        print 'triangles count =', trianglesCount&lt;br /&gt;
        &lt;br /&gt;
        print 'triangles indices =', map(int, unpack('%dI' % (trianglesCount,), s[p : p + 4 * trianglesCount]))&lt;br /&gt;
        p += 4 * trianglesCount&lt;br /&gt;
        &lt;br /&gt;
    print '\ntexcoords block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'texcoords block size =', size&lt;br /&gt;
    uvTablesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'uv tables count =', uvTablesCount&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    uvs = []&lt;br /&gt;
    for i in range(uvTablesCount):&lt;br /&gt;
        currentUv = []&lt;br /&gt;
        chanelName = ''&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        while b != 0:&lt;br /&gt;
            chanelName = chanelName + chr(b)&lt;br /&gt;
            b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
            p += 1&lt;br /&gt;
        print 'name =', chanelName&lt;br /&gt;
        &lt;br /&gt;
        x = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        print 'unknown =', x&lt;br /&gt;
        layerIndex = unpack('H', s[p : p + 2])[0]&lt;br /&gt;
        p += 2&lt;br /&gt;
        print 'layer index =', layerIndex   &lt;br /&gt;
        count = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        p += 4&lt;br /&gt;
        print 'uvs count =', count&lt;br /&gt;
        &lt;br /&gt;
        for j in range(count):&lt;br /&gt;
            uv = unpack('2f', s[p : p + 8])&lt;br /&gt;
            print 'uv%d =' % (j,), uv&lt;br /&gt;
            p += 8&lt;br /&gt;
            &lt;br /&gt;
            currentUv.append(uv)&lt;br /&gt;
        uvs.append(currentUv)&lt;br /&gt;
            &lt;br /&gt;
        for j in range(count):&lt;br /&gt;
            x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
            print 'index%d =' % (j,), int(x)&lt;br /&gt;
            p += 4&lt;br /&gt;
&lt;br /&gt;
    i = 0&lt;br /&gt;
    while len(s) &amp;gt; p:&lt;br /&gt;
        x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'unknown index%d =' % (i,), int(x)&lt;br /&gt;
        p += 4  &lt;br /&gt;
        i += 1&lt;br /&gt;
    &lt;br /&gt;
    if useBlender:&lt;br /&gt;
        faceIndex = 0&lt;br /&gt;
        for faceInfo in faces:&lt;br /&gt;
            if faceInfo[4] == 0:&lt;br /&gt;
                faceInfo = faceInfo[2:] + faceInfo[:2]&lt;br /&gt;
            mesh.faces.extend(faceInfo[::2])&lt;br /&gt;
            face = mesh.faces[-1]&lt;br /&gt;
&lt;br /&gt;
            faceUvs = []&lt;br /&gt;
            for i in faceInfo[1::2]:&lt;br /&gt;
                faceUvs.append(Vector(uvs[layerIndices[i]][uvIndices[i]]))&lt;br /&gt;
            face.uv = faceUvs&lt;br /&gt;
    &lt;br /&gt;
def parseString(s, p):&lt;br /&gt;
    string = ''&lt;br /&gt;
    b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
    p += 1&lt;br /&gt;
    while b != 0:&lt;br /&gt;
        string = string + chr(b)&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
    return string, p&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def parseGeometryBlock(s):&lt;br /&gt;
    print '\ngeometry\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    while p &amp;lt; len(s):&lt;br /&gt;
        i = unpack('I', s[p : p + 4])[0]    &lt;br /&gt;
        p += 4&lt;br /&gt;
        dataSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'mesh%d data size = %d' % (i, dataSize)&lt;br /&gt;
        p += 4&lt;br /&gt;
        parseMeshData(s[p : p + dataSize])&lt;br /&gt;
        p += dataSize   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def parseMaterialBlock(s):&lt;br /&gt;
    print '\nmaterials\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    materialsCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'materials count =', materialsCount&lt;br /&gt;
&lt;br /&gt;
    for i in range(materialsCount):&lt;br /&gt;
        print '\n'&lt;br /&gt;
        materialName, p = parseString(s, p)&lt;br /&gt;
        print 'material%d name =' % (i,), materialName&lt;br /&gt;
        &lt;br /&gt;
        engineShader, p = parseString(s, p)&lt;br /&gt;
        print 'engine shader =', engineShader&lt;br /&gt;
        &lt;br /&gt;
        compilerShader, p = parseString(s, p)&lt;br /&gt;
        print 'compiler shader =', compilerShader&lt;br /&gt;
&lt;br /&gt;
        gameMaterial, p = parseString(s, p)&lt;br /&gt;
        print 'game material =', gameMaterial   &lt;br /&gt;
        &lt;br /&gt;
        texturePath, p = parseString(s, p)&lt;br /&gt;
        print 'texture path =', texturePath&lt;br /&gt;
        &lt;br /&gt;
        texture, p = parseString(s, p)&lt;br /&gt;
        print 'texture =', texture&lt;br /&gt;
&lt;br /&gt;
        print 'flags (2 sided, etc) =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
        p += 4  &lt;br /&gt;
        &lt;br /&gt;
        size = 8&lt;br /&gt;
        print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
        p += size   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
def parseAuthorBlock(s):&lt;br /&gt;
    print '\nauthor\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    authorName, p = parseString(s, p)&lt;br /&gt;
    print 'author name =', authorName&lt;br /&gt;
    &lt;br /&gt;
    size = 4&lt;br /&gt;
    print 'creation date =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size   &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    modifierName, p = parseString(s, p)&lt;br /&gt;
    print 'modifier name =', modifierName&lt;br /&gt;
    &lt;br /&gt;
    print 'modification date =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
def parseUserDataBlock(s):&lt;br /&gt;
    print '\nuser data\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    userData, p = parseString(s, p)&lt;br /&gt;
    print 'user data =', userData&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def parseLODBlock(s):&lt;br /&gt;
    print '\nlod\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    reference, p = parseString(s, p)&lt;br /&gt;
    print 'lod reference =', reference  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def parseFlagsBlock(s):&lt;br /&gt;
    print '\nflags (model type)\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    flags = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'model type =', hex(int(flags))&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
print '\n' * 3&lt;br /&gt;
&lt;br /&gt;
p = 0&lt;br /&gt;
header = unpack('I', s[p : p + 4])[0]   &lt;br /&gt;
print 'header =', hex(int(header))&lt;br /&gt;
p += 4&lt;br /&gt;
&lt;br /&gt;
dataSize = unpack('I', s[p : p + 4])[0] &lt;br /&gt;
print 'data size =', dataSize&lt;br /&gt;
p += 4&lt;br /&gt;
&lt;br /&gt;
while p &amp;lt; len(s):&lt;br /&gt;
    print '\n'&lt;br /&gt;
    print '=' * 79&lt;br /&gt;
    block = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'block =', hex(int(block))&lt;br /&gt;
    p += 4&lt;br /&gt;
    &lt;br /&gt;
    blockSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'block size =', blockSize&lt;br /&gt;
    p += 4  &lt;br /&gt;
&lt;br /&gt;
    if block == 0x0910:&lt;br /&gt;
        parseGeometryBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0907:&lt;br /&gt;
        parseMaterialBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0922:&lt;br /&gt;
        parseAuthorBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0912:&lt;br /&gt;
        parseUserDataBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0925:&lt;br /&gt;
        parseLODBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0903:&lt;br /&gt;
        parseFlagsBlock(s[p : p + blockSize])       &lt;br /&gt;
    else:&lt;br /&gt;
        print 'unknown data =', map(hex, unpack('%dB' % (blockSize,), s[p : p + blockSize]))&lt;br /&gt;
    p += blockSize&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.125.1.170</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Excid</id>
		<title>Обсуждение участника:Excid</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Excid"/>
				<updated>2015-01-15T19:39:40Z</updated>
		
		<summary type="html">&lt;p&gt;93.125.1.170: /* Текстурные координаты — UVs (0x1012) */ были указаны (0x1008)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формат разобрал excid'''&lt;br /&gt;
&lt;br /&gt;
== О формате ==&lt;br /&gt;
Формат *.object используется в качестве основного формата хранения моделей на этапе редактирования (включая экспорт из Maya или 3ds Max и хранение моделей до компиляции уровня)&lt;br /&gt;
&lt;br /&gt;
== Описание структуры ==&lt;br /&gt;
Формат бинарный. Файл состоит из вложенных друг в друга блоков. Весь файл представляет собой единый блок.&lt;br /&gt;
&lt;br /&gt;
=== Структура блока ===&lt;br /&gt;
Блок имеет 3 обязательные части:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Часть||Тип(размер)||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Идентификатор типа блока||(4)||2 байта идентификатора и 2 нулевых байта&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Размер блока||uint(4)||без учета этих частей — только то, что идет дальше&lt;br /&gt;
|-&lt;br /&gt;
|Данные||(Размер блока)||Данные могут быть представлены вложенными блоками&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Типы данных ===&lt;br /&gt;
Особое внимание стоит обратить на то, как хранятся строки: они нуль-терминальные, то есть в конце обязательно содержат нулевой байт.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
В заголовке последующих пунктов в скобках содержатся идентификаторы типа блока в шестнадцатиричной форме, при этом байты представлены в обратном порядке (то есть так, как числа задаются в исходниках), поэтому идентификатор 0x0912 в файле будет выглядеть как 09 12 00 00.&lt;br /&gt;
&lt;br /&gt;
== Файл (0x7777) ==&lt;br /&gt;
=== Неизвестные данные (0x0900) ===&lt;br /&gt;
Возможно, это версия.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(2)||0x10 0x00||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Пользовательские информация — User Data (0x0912) ===&lt;br /&gt;
В редакторе Game options &amp;gt; User Data.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Данные||строка||||Произвольная строка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Уровень детализации — LOD (0x0925) ===&lt;br /&gt;
В редакторе LOD &amp;gt; Reference.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Ссылка||строка||||Путь к модели, содержащей следующий уровень детализации&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тип объекта — Object Type (0x0903) ===&lt;br /&gt;
В редакторе Object Type.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Тип||(4)||||Значение 0x00 для статической модели (тип Static)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Данные о геометрии — Geometry (0x0910) ===&lt;br /&gt;
В редакторе Geometry.&lt;br /&gt;
Все представленные ниже данные описывают 1 подобъект.&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1000) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(2)||0x11 0x00||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Название подобъекта — Name (0x1000) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название||строка||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ограничивающий параллелепипед — Bounding Box (0x1004) ====&lt;br /&gt;
В редакторе Transform &amp;gt; BBox Min/Max&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Минимум||float(4)[3]||||Минимальные значения вершин по x, y, z&lt;br /&gt;
|-&lt;br /&gt;
|Максимум||float(4)[3]||||Максимальные значения вершин по x, y, z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1002) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(1)||0x05||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1010) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(8)||0x00||Все нули&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Вершины — Vertices (0x1005) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество вершин n||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Координаты||float(4)[n * 3]||||Координаты x, y, z для каждой вершины&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Грани — Faces (0x1006) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество граней m||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Координаты||uint(4)[m * 6]||||Троки пар индекс вершины + индекс текстурной координаты&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Группы сглаживания — Smoothing Groups (0x1013) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Группы||uint(4)[m]||||32-битная маска групп сглаживания для каждой грани&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Словарь текстурных координат — UVs map (0x1008) ====&lt;br /&gt;
Логика формирования и назначение этого и блока «Текстурные координаты» доконца не понятна.&lt;br /&gt;
Предположительный вариант представлен ниже.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество записей k||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Данные||(9)[k]||||Предположительная структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||byte(1)||0x1||&lt;br /&gt;
|-&lt;br /&gt;
|Индекс таблицы текстурных координат||uint(4)||0x0 или 0x1||Возможно, только первый байт содержит эти данные,&amp;lt;br /&amp;gt; остальные выполняют другие функции&amp;lt;br /&amp;gt;Встречались «некорректные» данные (например, 0x1 0x90 0xdb 0x11 0x7), но они не использовались&lt;br /&gt;
|-&lt;br /&gt;
|Индекс текстурных координаты||uint(4)||0x0 или 0x1||Индекс в таблице, определяемой предыдущим значением.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Материалы объекта — Object Materials (0x1009) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество материалов p||ushort(2)||||&lt;br /&gt;
|-&lt;br /&gt;
|Материалы||[p]||||Cтруктура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название материала||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Количество граней q||uint(4)||||Количество граней, имеющих этот материал&lt;br /&gt;
|-&lt;br /&gt;
|Индексы граней||uint(4)[q]||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Текстурные координаты — UVs (0x1008) ====&lt;br /&gt;
Количество таблиц, которое встречалось в тестовых файлах — 2.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество таблиц t||uint(4)||0x2||&lt;br /&gt;
|-&lt;br /&gt;
|Таблицы||[t]||||Структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||строка||Texture||&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||ubyte(1)||0x2||Возможно, количество компонентов в текс. координате?&lt;br /&gt;
|-&lt;br /&gt;
|Номер таблицы||ushort(1)||||&lt;br /&gt;
|-&lt;br /&gt;
|Количество текстурных координат s||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Текстурные координаты||float(4)[s * 2]||||Пары значения текстурных координат u и v&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||uint(4)[s]||||Какие-то индексы, не превышающие s&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно&amp;lt;br /&amp;gt;(только для второй таблицы)||uint(4)[s]||||Какие-то индексы, не превышающие s, отсорированные по возрастанию&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Материалы — Materials (0x0907) ===&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество материалов r||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Материалы||[r]||||Структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для движка||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для компилятора||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для игры||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Путь к текстуре||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||строка||Texture||Значение Texture используется в блоке &amp;lt;br /&amp;gt;Текстурные координаты — UVs (0x1008)&lt;br /&gt;
|-&lt;br /&gt;
|Флаги||uint(4)||||0x1, если материал двустронний, иначе 0x0&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(4)||0x12 0x1 0x0 0x0 0x1 0x0 0x0 0x0||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Автор — Author (0x0922) ===&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Создатель||строка||||Вид \\компьютер\пользователь (например, \\NAPALI\excid)&lt;br /&gt;
|-&lt;br /&gt;
|Дата создания||(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Последний модифицирующий||строка||||Вид \\компьютер\пользователь (например, \\NAPALI\excid)&lt;br /&gt;
|-&lt;br /&gt;
|Дата модификации||(4)||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Скрипт разбора файла ==&lt;br /&gt;
Написан на Python. Не реализован полностью, завершение не планируется, так как свою миссию он выполнил.&amp;lt;br /&amp;gt;&lt;br /&gt;
Если запускать из Blender, то импортирует объект (без материалов).&amp;lt;br /&amp;gt;&lt;br /&gt;
Не рекомендуется запускать для больших файлов, так как выводится вся информация из файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#                                           #&lt;br /&gt;
#    XRay Engine (S.T.A.L.K.E.R.) object    #&lt;br /&gt;
#       test import plugin for Blender      #&lt;br /&gt;
#                                           #&lt;br /&gt;
#          Anton 'excid' Gorenko            #&lt;br /&gt;
#              excid@mail.ru                #&lt;br /&gt;
#                                           #&lt;br /&gt;
#               (2007 June)                 #&lt;br /&gt;
#                                           #&lt;br /&gt;
&lt;br /&gt;
from struct import *&lt;br /&gt;
import datetime&lt;br /&gt;
&lt;br /&gt;
useBlender = True&lt;br /&gt;
try:&lt;br /&gt;
    from Blender import *&lt;br /&gt;
    from Blender.Mathutils import *&lt;br /&gt;
except:&lt;br /&gt;
    useBlender = False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
f = open('X:\\rawdata\\objects\\detail\\det_list_05.object', 'rb')&lt;br /&gt;
s = f.read()&lt;br /&gt;
f.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def parseMeshData(s):&lt;br /&gt;
    &lt;br /&gt;
    p = 0&lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nname block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    nameSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'name block size =', nameSize&lt;br /&gt;
    p += 4&lt;br /&gt;
    name = unpack('%ds' % (nameSize,), s[p : p + nameSize])[0][:-1]&lt;br /&gt;
    p += int(nameSize)&lt;br /&gt;
    print 'name =', name&lt;br /&gt;
    &lt;br /&gt;
    if useBlender:&lt;br /&gt;
        obj = Object.New('Mesh', name)&lt;br /&gt;
        mesh = Mesh.New(name)&lt;br /&gt;
        obj.link(mesh)&lt;br /&gt;
        scene = Scene.GetCurrent()&lt;br /&gt;
        scene.objects.link(obj)&lt;br /&gt;
    &lt;br /&gt;
    print '\nbbox block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'bbox block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'bbox min = ', unpack('3f', s[p : p + 12])&lt;br /&gt;
    p += 12&lt;br /&gt;
    print 'bbox max = ', unpack('3f', s[p : p + 12])&lt;br /&gt;
    p += 12&lt;br /&gt;
    &lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nvertices block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4  &lt;br /&gt;
    print 'vertices block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4  &lt;br /&gt;
    verticesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'vertices count =', verticesCount &lt;br /&gt;
    for i in range(verticesCount):&lt;br /&gt;
        coords = unpack('3f', s[p : p + 12])&lt;br /&gt;
        print 'vertex%d =' % (i,), coords&lt;br /&gt;
        p += 12&lt;br /&gt;
        &lt;br /&gt;
        if useBlender:&lt;br /&gt;
            mesh.verts.extend([coords])&lt;br /&gt;
    &lt;br /&gt;
    print '\ntriangles block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'triangles block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    &lt;br /&gt;
    trianglesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'triangles count =', trianglesCount   &lt;br /&gt;
    &lt;br /&gt;
    faces = []&lt;br /&gt;
    for i in range(trianglesCount):&lt;br /&gt;
        vertices = unpack('6I', s[p : p + 24])&lt;br /&gt;
        print 'triangle%d =' % (i,), vertices&lt;br /&gt;
        p += 24&lt;br /&gt;
        &lt;br /&gt;
        faces.append(vertices)&lt;br /&gt;
        &lt;br /&gt;
    print '\nsmoothgroups block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'smoothgroups block size =', size&lt;br /&gt;
    for i in range(size / 4):&lt;br /&gt;
        x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'triangle%d =' % (i,), hex(int(x))&lt;br /&gt;
        p += 4&lt;br /&gt;
    &lt;br /&gt;
    print '\nuv map block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'uv map block size =', size&lt;br /&gt;
    count = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'count =', count&lt;br /&gt;
    &lt;br /&gt;
    layerIndices = []&lt;br /&gt;
    uvIndices = []&lt;br /&gt;
    for i in range(count):&lt;br /&gt;
        unknown = unpack('5B', s[p : p + 5])&lt;br /&gt;
        p += 5&lt;br /&gt;
        &lt;br /&gt;
        uvIndex = int(unpack('I', s[p : p + 4])[0])&lt;br /&gt;
        p += 4&lt;br /&gt;
        &lt;br /&gt;
        print 'uv index =', map(hex, unknown), uvIndex&lt;br /&gt;
        &lt;br /&gt;
        layerIndices.append(unknown[1])&lt;br /&gt;
        uvIndices.append(uvIndex)&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
    print '\nmaterials block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'materials block size =', size&lt;br /&gt;
    materialsCount = unpack('H', s[p : p + 2])[0]&lt;br /&gt;
    p += 2&lt;br /&gt;
    print 'materials count =', materialsCount&lt;br /&gt;
    &lt;br /&gt;
    for i in range(materialsCount):&lt;br /&gt;
        materialName = ''&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        while b != 0:&lt;br /&gt;
            materialName = materialName + chr(b)&lt;br /&gt;
            b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
            p += 1&lt;br /&gt;
        print 'material%d name =' % (i,), materialName&lt;br /&gt;
        &lt;br /&gt;
        trianglesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        p += 4&lt;br /&gt;
        print 'triangles count =', trianglesCount&lt;br /&gt;
        &lt;br /&gt;
        print 'triangles indices =', map(int, unpack('%dI' % (trianglesCount,), s[p : p + 4 * trianglesCount]))&lt;br /&gt;
        p += 4 * trianglesCount&lt;br /&gt;
        &lt;br /&gt;
    print '\ntexcoords block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'texcoords block size =', size&lt;br /&gt;
    uvTablesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'uv tables count =', uvTablesCount&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    uvs = []&lt;br /&gt;
    for i in range(uvTablesCount):&lt;br /&gt;
        currentUv = []&lt;br /&gt;
        chanelName = ''&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        while b != 0:&lt;br /&gt;
            chanelName = chanelName + chr(b)&lt;br /&gt;
            b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
            p += 1&lt;br /&gt;
        print 'name =', chanelName&lt;br /&gt;
        &lt;br /&gt;
        x = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        print 'unknown =', x&lt;br /&gt;
        layerIndex = unpack('H', s[p : p + 2])[0]&lt;br /&gt;
        p += 2&lt;br /&gt;
        print 'layer index =', layerIndex   &lt;br /&gt;
        count = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        p += 4&lt;br /&gt;
        print 'uvs count =', count&lt;br /&gt;
        &lt;br /&gt;
        for j in range(count):&lt;br /&gt;
            uv = unpack('2f', s[p : p + 8])&lt;br /&gt;
            print 'uv%d =' % (j,), uv&lt;br /&gt;
            p += 8&lt;br /&gt;
            &lt;br /&gt;
            currentUv.append(uv)&lt;br /&gt;
        uvs.append(currentUv)&lt;br /&gt;
            &lt;br /&gt;
        for j in range(count):&lt;br /&gt;
            x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
            print 'index%d =' % (j,), int(x)&lt;br /&gt;
            p += 4&lt;br /&gt;
&lt;br /&gt;
    i = 0&lt;br /&gt;
    while len(s) &amp;gt; p:&lt;br /&gt;
        x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'unknown index%d =' % (i,), int(x)&lt;br /&gt;
        p += 4  &lt;br /&gt;
        i += 1&lt;br /&gt;
    &lt;br /&gt;
    if useBlender:&lt;br /&gt;
        faceIndex = 0&lt;br /&gt;
        for faceInfo in faces:&lt;br /&gt;
            if faceInfo[4] == 0:&lt;br /&gt;
                faceInfo = faceInfo[2:] + faceInfo[:2]&lt;br /&gt;
            mesh.faces.extend(faceInfo[::2])&lt;br /&gt;
            face = mesh.faces[-1]&lt;br /&gt;
&lt;br /&gt;
            faceUvs = []&lt;br /&gt;
            for i in faceInfo[1::2]:&lt;br /&gt;
                faceUvs.append(Vector(uvs[layerIndices[i]][uvIndices[i]]))&lt;br /&gt;
            face.uv = faceUvs&lt;br /&gt;
    &lt;br /&gt;
def parseString(s, p):&lt;br /&gt;
    string = ''&lt;br /&gt;
    b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
    p += 1&lt;br /&gt;
    while b != 0:&lt;br /&gt;
        string = string + chr(b)&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
    return string, p&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def parseGeometryBlock(s):&lt;br /&gt;
    print '\ngeometry\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    while p &amp;lt; len(s):&lt;br /&gt;
        i = unpack('I', s[p : p + 4])[0]    &lt;br /&gt;
        p += 4&lt;br /&gt;
        dataSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'mesh%d data size = %d' % (i, dataSize)&lt;br /&gt;
        p += 4&lt;br /&gt;
        parseMeshData(s[p : p + dataSize])&lt;br /&gt;
        p += dataSize   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def parseMaterialBlock(s):&lt;br /&gt;
    print '\nmaterials\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    materialsCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'materials count =', materialsCount&lt;br /&gt;
&lt;br /&gt;
    for i in range(materialsCount):&lt;br /&gt;
        print '\n'&lt;br /&gt;
        materialName, p = parseString(s, p)&lt;br /&gt;
        print 'material%d name =' % (i,), materialName&lt;br /&gt;
        &lt;br /&gt;
        engineShader, p = parseString(s, p)&lt;br /&gt;
        print 'engine shader =', engineShader&lt;br /&gt;
        &lt;br /&gt;
        compilerShader, p = parseString(s, p)&lt;br /&gt;
        print 'compiler shader =', compilerShader&lt;br /&gt;
&lt;br /&gt;
        gameMaterial, p = parseString(s, p)&lt;br /&gt;
        print 'game material =', gameMaterial   &lt;br /&gt;
        &lt;br /&gt;
        texturePath, p = parseString(s, p)&lt;br /&gt;
        print 'texture path =', texturePath&lt;br /&gt;
        &lt;br /&gt;
        texture, p = parseString(s, p)&lt;br /&gt;
        print 'texture =', texture&lt;br /&gt;
&lt;br /&gt;
        print 'flags (2 sided, etc) =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
        p += 4  &lt;br /&gt;
        &lt;br /&gt;
        size = 8&lt;br /&gt;
        print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
        p += size   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
def parseAuthorBlock(s):&lt;br /&gt;
    print '\nauthor\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    authorName, p = parseString(s, p)&lt;br /&gt;
    print 'author name =', authorName&lt;br /&gt;
    &lt;br /&gt;
    size = 4&lt;br /&gt;
    print 'creation date =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size   &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    modifierName, p = parseString(s, p)&lt;br /&gt;
    print 'modifier name =', modifierName&lt;br /&gt;
    &lt;br /&gt;
    print 'modification date =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
def parseUserDataBlock(s):&lt;br /&gt;
    print '\nuser data\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    userData, p = parseString(s, p)&lt;br /&gt;
    print 'user data =', userData&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def parseLODBlock(s):&lt;br /&gt;
    print '\nlod\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    reference, p = parseString(s, p)&lt;br /&gt;
    print 'lod reference =', reference  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def parseFlagsBlock(s):&lt;br /&gt;
    print '\nflags (model type)\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    flags = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'model type =', hex(int(flags))&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
print '\n' * 3&lt;br /&gt;
&lt;br /&gt;
p = 0&lt;br /&gt;
header = unpack('I', s[p : p + 4])[0]   &lt;br /&gt;
print 'header =', hex(int(header))&lt;br /&gt;
p += 4&lt;br /&gt;
&lt;br /&gt;
dataSize = unpack('I', s[p : p + 4])[0] &lt;br /&gt;
print 'data size =', dataSize&lt;br /&gt;
p += 4&lt;br /&gt;
&lt;br /&gt;
while p &amp;lt; len(s):&lt;br /&gt;
    print '\n'&lt;br /&gt;
    print '=' * 79&lt;br /&gt;
    block = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'block =', hex(int(block))&lt;br /&gt;
    p += 4&lt;br /&gt;
    &lt;br /&gt;
    blockSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'block size =', blockSize&lt;br /&gt;
    p += 4  &lt;br /&gt;
&lt;br /&gt;
    if block == 0x0910:&lt;br /&gt;
        parseGeometryBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0907:&lt;br /&gt;
        parseMaterialBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0922:&lt;br /&gt;
        parseAuthorBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0912:&lt;br /&gt;
        parseUserDataBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0925:&lt;br /&gt;
        parseLODBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0903:&lt;br /&gt;
        parseFlagsBlock(s[p : p + blockSize])       &lt;br /&gt;
    else:&lt;br /&gt;
        print 'unknown data =', map(hex, unpack('%dB' % (blockSize,), s[p : p + blockSize]))&lt;br /&gt;
    p += blockSize&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.125.1.170</name></author>	</entry>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Excid</id>
		<title>Обсуждение участника:Excid</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5_%D1%83%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA%D0%B0:Excid"/>
				<updated>2015-01-14T20:39:51Z</updated>
		
		<summary type="html">&lt;p&gt;93.125.1.170: /* Автор — Author (0x0922) */  было указано что это блок (0x0907)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формат разобрал excid'''&lt;br /&gt;
&lt;br /&gt;
== О формате ==&lt;br /&gt;
Формат *.object используется в качестве основного формата хранения моделей на этапе редактирования (включая экспорт из Maya или 3ds Max и хранение моделей до компиляции уровня)&lt;br /&gt;
&lt;br /&gt;
== Описание структуры ==&lt;br /&gt;
Формат бинарный. Файл состоит из вложенных друг в друга блоков. Весь файл представляет собой единый блок.&lt;br /&gt;
&lt;br /&gt;
=== Структура блока ===&lt;br /&gt;
Блок имеет 3 обязательные части:&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Часть||Тип(размер)||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Идентификатор типа блока||(4)||2 байта идентификатора и 2 нулевых байта&amp;lt;br /&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|Размер блока||uint(4)||без учета этих частей — только то, что идет дальше&lt;br /&gt;
|-&lt;br /&gt;
|Данные||(Размер блока)||Данные могут быть представлены вложенными блоками&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Типы данных ===&lt;br /&gt;
Особое внимание стоит обратить на то, как хранятся строки: они нуль-терминальные, то есть в конце обязательно содержат нулевой байт.&lt;br /&gt;
&lt;br /&gt;
== Структура ==&lt;br /&gt;
В заголовке последующих пунктов в скобках содержатся идентификаторы типа блока в шестнадцатиричной форме, при этом байты представлены в обратном порядке (то есть так, как числа задаются в исходниках), поэтому идентификатор 0x0912 в файле будет выглядеть как 09 12 00 00.&lt;br /&gt;
&lt;br /&gt;
== Файл (0x7777) ==&lt;br /&gt;
=== Неизвестные данные (0x0900) ===&lt;br /&gt;
Возможно, это версия.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(2)||0x10 0x00||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Пользовательские информация — User Data (0x0912) ===&lt;br /&gt;
В редакторе Game options &amp;gt; User Data.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Данные||строка||||Произвольная строка&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Уровень детализации — LOD (0x0925) ===&lt;br /&gt;
В редакторе LOD &amp;gt; Reference.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Ссылка||строка||||Путь к модели, содержащей следующий уровень детализации&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Тип объекта — Object Type (0x0903) ===&lt;br /&gt;
В редакторе Object Type.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Тип||(4)||||Значение 0x00 для статической модели (тип Static)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Данные о геометрии — Geometry (0x0910) ===&lt;br /&gt;
В редакторе Geometry.&lt;br /&gt;
Все представленные ниже данные описывают 1 подобъект.&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1000) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(2)||0x11 0x00||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Название подобъекта — Name (0x1000) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название||строка||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Ограничивающий параллелепипед — Bounding Box (0x1004) ====&lt;br /&gt;
В редакторе Transform &amp;gt; BBox Min/Max&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Минимум||float(4)[3]||||Минимальные значения вершин по x, y, z&lt;br /&gt;
|-&lt;br /&gt;
|Максимум||float(4)[3]||||Максимальные значения вершин по x, y, z&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1002) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(1)||0x05||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Неизвестные данные (0x1010) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(8)||0x00||Все нули&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Вершины — Vertices (0x1005) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество вершин n||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Координаты||float(4)[n * 3]||||Координаты x, y, z для каждой вершины&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Грани — Faces (0x1006) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество граней m||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Координаты||uint(4)[m * 6]||||Троки пар индекс вершины + индекс текстурной координаты&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Группы сглаживания — Smoothing Groups (0x1013) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Группы||uint(4)[m]||||32-битная маска групп сглаживания для каждой грани&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Словарь текстурных координат — UVs map (0x1008) ====&lt;br /&gt;
Логика формирования и назначение этого и блока «Текстурные координаты» доконца не понятна.&lt;br /&gt;
Предположительный вариант представлен ниже.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество записей k||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Данные||(9)[k]||||Предположительная структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||byte(1)||0x1||&lt;br /&gt;
|-&lt;br /&gt;
|Индекс таблицы текстурных координат||uint(4)||0x0 или 0x1||Возможно, только первый байт содержит эти данные,&amp;lt;br /&amp;gt; остальные выполняют другие функции&amp;lt;br /&amp;gt;Встречались «некорректные» данные (например, 0x1 0x90 0xdb 0x11 0x7), но они не использовались&lt;br /&gt;
|-&lt;br /&gt;
|Индекс текстурных координаты||uint(4)||0x0 или 0x1||Индекс в таблице, определяемой предыдущим значением.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Материалы объекта — Object Materials (0x1009) ====&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество материалов p||ushort(2)||||&lt;br /&gt;
|-&lt;br /&gt;
|Материалы||[p]||||Cтруктура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название материала||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Количество граней q||uint(4)||||Количество граней, имеющих этот материал&lt;br /&gt;
|-&lt;br /&gt;
|Индексы граней||uint(4)[q]||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Текстурные координаты — UVs (0x1008) ====&lt;br /&gt;
Количество таблиц, которое встречалось в тестовых файлах — 2.&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество таблиц t||uint(4)||0x2||&lt;br /&gt;
|-&lt;br /&gt;
|Таблицы||[t]||||Структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||строка||Texture||&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||ubyte(1)||0x2||Возможно, количество компонентов в текс. координате?&lt;br /&gt;
|-&lt;br /&gt;
|Номер таблицы||ushort(1)||||&lt;br /&gt;
|-&lt;br /&gt;
|Количество текстурных координат s||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Текстурные координаты||float(4)[s * 2]||||Пары значения текстурных координат u и v&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||uint(4)[s]||||Какие-то индексы, не превышающие s&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно&amp;lt;br /&amp;gt;(только для второй таблицы)||uint(4)[s]||||Какие-то индексы, не превышающие s, отсорированные по возрастанию&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Материалы — Materials (0x0907) ===&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Количество материалов r||uint(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Материалы||[r]||||Структура в следующей таблице&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Название||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для движка||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для компилятора||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Характеристика для игры||строка||||Например, default&lt;br /&gt;
|-&lt;br /&gt;
|Путь к текстуре||строка||||&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||строка||Texture||Значение Texture используется в блоке &amp;lt;br /&amp;gt;Текстурные координаты — UVs (0x1008)&lt;br /&gt;
|-&lt;br /&gt;
|Флаги||uint(4)||||0x1, если материал двустронний, иначе 0x0&lt;br /&gt;
|-&lt;br /&gt;
|Неизвестно||(4)||0x12 0x1 0x0 0x0 0x1 0x0 0x0 0x0||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Автор — Author (0x0922) ===&lt;br /&gt;
{| class=&amp;quot;standard&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
!Название||Тип(размер)||Значение||Подробнее&lt;br /&gt;
|-&lt;br /&gt;
|Создатель||строка||||Вид \\компьютер\пользователь (например, \\NAPALI\excid)&lt;br /&gt;
|-&lt;br /&gt;
|Дата создания||(4)||||&lt;br /&gt;
|-&lt;br /&gt;
|Последний модифицирующий||строка||||Вид \\компьютер\пользователь (например, \\NAPALI\excid)&lt;br /&gt;
|-&lt;br /&gt;
|Дата модификации||(4)||||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Скрипт разбора файла ==&lt;br /&gt;
Написан на Python. Не реализован полностью, завершение не планируется, так как свою миссию он выполнил.&amp;lt;br /&amp;gt;&lt;br /&gt;
Если запускать из Blender, то импортирует объект (без материалов).&amp;lt;br /&amp;gt;&lt;br /&gt;
Не рекомендуется запускать для больших файлов, так как выводится вся информация из файла.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
#                                           #&lt;br /&gt;
#    XRay Engine (S.T.A.L.K.E.R.) object    #&lt;br /&gt;
#       test import plugin for Blender      #&lt;br /&gt;
#                                           #&lt;br /&gt;
#          Anton 'excid' Gorenko            #&lt;br /&gt;
#              excid@mail.ru                #&lt;br /&gt;
#                                           #&lt;br /&gt;
#               (2007 June)                 #&lt;br /&gt;
#                                           #&lt;br /&gt;
&lt;br /&gt;
from struct import *&lt;br /&gt;
import datetime&lt;br /&gt;
&lt;br /&gt;
useBlender = True&lt;br /&gt;
try:&lt;br /&gt;
    from Blender import *&lt;br /&gt;
    from Blender.Mathutils import *&lt;br /&gt;
except:&lt;br /&gt;
    useBlender = False&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
f = open('X:\\rawdata\\objects\\detail\\det_list_05.object', 'rb')&lt;br /&gt;
s = f.read()&lt;br /&gt;
f.close()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def parseMeshData(s):&lt;br /&gt;
    &lt;br /&gt;
    p = 0&lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nname block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    nameSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'name block size =', nameSize&lt;br /&gt;
    p += 4&lt;br /&gt;
    name = unpack('%ds' % (nameSize,), s[p : p + nameSize])[0][:-1]&lt;br /&gt;
    p += int(nameSize)&lt;br /&gt;
    print 'name =', name&lt;br /&gt;
    &lt;br /&gt;
    if useBlender:&lt;br /&gt;
        obj = Object.New('Mesh', name)&lt;br /&gt;
        mesh = Mesh.New(name)&lt;br /&gt;
        obj.link(mesh)&lt;br /&gt;
        scene = Scene.GetCurrent()&lt;br /&gt;
        scene.objects.link(obj)&lt;br /&gt;
    &lt;br /&gt;
    print '\nbbox block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'bbox block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'bbox min = ', unpack('3f', s[p : p + 12])&lt;br /&gt;
    p += 12&lt;br /&gt;
    print 'bbox max = ', unpack('3f', s[p : p + 12])&lt;br /&gt;
    p += 12&lt;br /&gt;
    &lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nunknown block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'unknown block size =', size&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size&lt;br /&gt;
    &lt;br /&gt;
    print '\nvertices block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4  &lt;br /&gt;
    print 'vertices block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4  &lt;br /&gt;
    verticesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'vertices count =', verticesCount &lt;br /&gt;
    for i in range(verticesCount):&lt;br /&gt;
        coords = unpack('3f', s[p : p + 12])&lt;br /&gt;
        print 'vertex%d =' % (i,), coords&lt;br /&gt;
        p += 12&lt;br /&gt;
        &lt;br /&gt;
        if useBlender:&lt;br /&gt;
            mesh.verts.extend([coords])&lt;br /&gt;
    &lt;br /&gt;
    print '\ntriangles block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'triangles block size =', unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    &lt;br /&gt;
    trianglesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'triangles count =', trianglesCount   &lt;br /&gt;
    &lt;br /&gt;
    faces = []&lt;br /&gt;
    for i in range(trianglesCount):&lt;br /&gt;
        vertices = unpack('6I', s[p : p + 24])&lt;br /&gt;
        print 'triangle%d =' % (i,), vertices&lt;br /&gt;
        p += 24&lt;br /&gt;
        &lt;br /&gt;
        faces.append(vertices)&lt;br /&gt;
        &lt;br /&gt;
    print '\nsmoothgroups block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'smoothgroups block size =', size&lt;br /&gt;
    for i in range(size / 4):&lt;br /&gt;
        x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'triangle%d =' % (i,), hex(int(x))&lt;br /&gt;
        p += 4&lt;br /&gt;
    &lt;br /&gt;
    print '\nuv map block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'uv map block size =', size&lt;br /&gt;
    count = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'count =', count&lt;br /&gt;
    &lt;br /&gt;
    layerIndices = []&lt;br /&gt;
    uvIndices = []&lt;br /&gt;
    for i in range(count):&lt;br /&gt;
        unknown = unpack('5B', s[p : p + 5])&lt;br /&gt;
        p += 5&lt;br /&gt;
        &lt;br /&gt;
        uvIndex = int(unpack('I', s[p : p + 4])[0])&lt;br /&gt;
        p += 4&lt;br /&gt;
        &lt;br /&gt;
        print 'uv index =', map(hex, unknown), uvIndex&lt;br /&gt;
        &lt;br /&gt;
        layerIndices.append(unknown[1])&lt;br /&gt;
        uvIndices.append(uvIndex)&lt;br /&gt;
        &lt;br /&gt;
    &lt;br /&gt;
    print '\nmaterials block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'materials block size =', size&lt;br /&gt;
    materialsCount = unpack('H', s[p : p + 2])[0]&lt;br /&gt;
    p += 2&lt;br /&gt;
    print 'materials count =', materialsCount&lt;br /&gt;
    &lt;br /&gt;
    for i in range(materialsCount):&lt;br /&gt;
        materialName = ''&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        while b != 0:&lt;br /&gt;
            materialName = materialName + chr(b)&lt;br /&gt;
            b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
            p += 1&lt;br /&gt;
        print 'material%d name =' % (i,), materialName&lt;br /&gt;
        &lt;br /&gt;
        trianglesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        p += 4&lt;br /&gt;
        print 'triangles count =', trianglesCount&lt;br /&gt;
        &lt;br /&gt;
        print 'triangles indices =', map(int, unpack('%dI' % (trianglesCount,), s[p : p + 4 * trianglesCount]))&lt;br /&gt;
        p += 4 * trianglesCount&lt;br /&gt;
        &lt;br /&gt;
    print '\ntexcoords block =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
    p += 4&lt;br /&gt;
    size = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'texcoords block size =', size&lt;br /&gt;
    uvTablesCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'uv tables count =', uvTablesCount&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    uvs = []&lt;br /&gt;
    for i in range(uvTablesCount):&lt;br /&gt;
        currentUv = []&lt;br /&gt;
        chanelName = ''&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        while b != 0:&lt;br /&gt;
            chanelName = chanelName + chr(b)&lt;br /&gt;
            b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
            p += 1&lt;br /&gt;
        print 'name =', chanelName&lt;br /&gt;
        &lt;br /&gt;
        x = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
        print 'unknown =', x&lt;br /&gt;
        layerIndex = unpack('H', s[p : p + 2])[0]&lt;br /&gt;
        p += 2&lt;br /&gt;
        print 'layer index =', layerIndex   &lt;br /&gt;
        count = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        p += 4&lt;br /&gt;
        print 'uvs count =', count&lt;br /&gt;
        &lt;br /&gt;
        for j in range(count):&lt;br /&gt;
            uv = unpack('2f', s[p : p + 8])&lt;br /&gt;
            print 'uv%d =' % (j,), uv&lt;br /&gt;
            p += 8&lt;br /&gt;
            &lt;br /&gt;
            currentUv.append(uv)&lt;br /&gt;
        uvs.append(currentUv)&lt;br /&gt;
            &lt;br /&gt;
        for j in range(count):&lt;br /&gt;
            x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
            print 'index%d =' % (j,), int(x)&lt;br /&gt;
            p += 4&lt;br /&gt;
&lt;br /&gt;
    i = 0&lt;br /&gt;
    while len(s) &amp;gt; p:&lt;br /&gt;
        x = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'unknown index%d =' % (i,), int(x)&lt;br /&gt;
        p += 4  &lt;br /&gt;
        i += 1&lt;br /&gt;
    &lt;br /&gt;
    if useBlender:&lt;br /&gt;
        faceIndex = 0&lt;br /&gt;
        for faceInfo in faces:&lt;br /&gt;
            if faceInfo[4] == 0:&lt;br /&gt;
                faceInfo = faceInfo[2:] + faceInfo[:2]&lt;br /&gt;
            mesh.faces.extend(faceInfo[::2])&lt;br /&gt;
            face = mesh.faces[-1]&lt;br /&gt;
&lt;br /&gt;
            faceUvs = []&lt;br /&gt;
            for i in faceInfo[1::2]:&lt;br /&gt;
                faceUvs.append(Vector(uvs[layerIndices[i]][uvIndices[i]]))&lt;br /&gt;
            face.uv = faceUvs&lt;br /&gt;
    &lt;br /&gt;
def parseString(s, p):&lt;br /&gt;
    string = ''&lt;br /&gt;
    b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
    p += 1&lt;br /&gt;
    while b != 0:&lt;br /&gt;
        string = string + chr(b)&lt;br /&gt;
        b = unpack('B', s[p : p + 1])[0]&lt;br /&gt;
        p += 1&lt;br /&gt;
    return string, p&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def parseGeometryBlock(s):&lt;br /&gt;
    print '\ngeometry\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    while p &amp;lt; len(s):&lt;br /&gt;
        i = unpack('I', s[p : p + 4])[0]    &lt;br /&gt;
        p += 4&lt;br /&gt;
        dataSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
        print 'mesh%d data size = %d' % (i, dataSize)&lt;br /&gt;
        p += 4&lt;br /&gt;
        parseMeshData(s[p : p + dataSize])&lt;br /&gt;
        p += dataSize   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def parseMaterialBlock(s):&lt;br /&gt;
    print '\nmaterials\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    materialsCount = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    p += 4&lt;br /&gt;
    print 'materials count =', materialsCount&lt;br /&gt;
&lt;br /&gt;
    for i in range(materialsCount):&lt;br /&gt;
        print '\n'&lt;br /&gt;
        materialName, p = parseString(s, p)&lt;br /&gt;
        print 'material%d name =' % (i,), materialName&lt;br /&gt;
        &lt;br /&gt;
        engineShader, p = parseString(s, p)&lt;br /&gt;
        print 'engine shader =', engineShader&lt;br /&gt;
        &lt;br /&gt;
        compilerShader, p = parseString(s, p)&lt;br /&gt;
        print 'compiler shader =', compilerShader&lt;br /&gt;
&lt;br /&gt;
        gameMaterial, p = parseString(s, p)&lt;br /&gt;
        print 'game material =', gameMaterial   &lt;br /&gt;
        &lt;br /&gt;
        texturePath, p = parseString(s, p)&lt;br /&gt;
        print 'texture path =', texturePath&lt;br /&gt;
        &lt;br /&gt;
        texture, p = parseString(s, p)&lt;br /&gt;
        print 'texture =', texture&lt;br /&gt;
&lt;br /&gt;
        print 'flags (2 sided, etc) =', hex(int(unpack('I', s[p : p + 4])[0]))&lt;br /&gt;
        p += 4  &lt;br /&gt;
        &lt;br /&gt;
        size = 8&lt;br /&gt;
        print 'unknown data =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
        p += size   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
def parseAuthorBlock(s):&lt;br /&gt;
    print '\nauthor\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    authorName, p = parseString(s, p)&lt;br /&gt;
    print 'author name =', authorName&lt;br /&gt;
    &lt;br /&gt;
    size = 4&lt;br /&gt;
    print 'creation date =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size   &lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    modifierName, p = parseString(s, p)&lt;br /&gt;
    print 'modifier name =', modifierName&lt;br /&gt;
    &lt;br /&gt;
    print 'modification date =', map(hex, unpack('%dB' % (size,), s[p : p + size]))&lt;br /&gt;
    p += size   &lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
def parseUserDataBlock(s):&lt;br /&gt;
    print '\nuser data\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    userData, p = parseString(s, p)&lt;br /&gt;
    print 'user data =', userData&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
def parseLODBlock(s):&lt;br /&gt;
    print '\nlod\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    reference, p = parseString(s, p)&lt;br /&gt;
    print 'lod reference =', reference  &lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
def parseFlagsBlock(s):&lt;br /&gt;
    print '\nflags (model type)\n'&lt;br /&gt;
    p = 0&lt;br /&gt;
    flags = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'model type =', hex(int(flags))&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
print '\n' * 3&lt;br /&gt;
&lt;br /&gt;
p = 0&lt;br /&gt;
header = unpack('I', s[p : p + 4])[0]   &lt;br /&gt;
print 'header =', hex(int(header))&lt;br /&gt;
p += 4&lt;br /&gt;
&lt;br /&gt;
dataSize = unpack('I', s[p : p + 4])[0] &lt;br /&gt;
print 'data size =', dataSize&lt;br /&gt;
p += 4&lt;br /&gt;
&lt;br /&gt;
while p &amp;lt; len(s):&lt;br /&gt;
    print '\n'&lt;br /&gt;
    print '=' * 79&lt;br /&gt;
    block = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'block =', hex(int(block))&lt;br /&gt;
    p += 4&lt;br /&gt;
    &lt;br /&gt;
    blockSize = unpack('I', s[p : p + 4])[0]&lt;br /&gt;
    print 'block size =', blockSize&lt;br /&gt;
    p += 4  &lt;br /&gt;
&lt;br /&gt;
    if block == 0x0910:&lt;br /&gt;
        parseGeometryBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0907:&lt;br /&gt;
        parseMaterialBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0922:&lt;br /&gt;
        parseAuthorBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0912:&lt;br /&gt;
        parseUserDataBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0925:&lt;br /&gt;
        parseLODBlock(s[p : p + blockSize])&lt;br /&gt;
    elif block == 0x0903:&lt;br /&gt;
        parseFlagsBlock(s[p : p + blockSize])       &lt;br /&gt;
    else:&lt;br /&gt;
        print 'unknown data =', map(hex, unpack('%dB' % (blockSize,), s[p : p + blockSize]))&lt;br /&gt;
    p += blockSize&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>93.125.1.170</name></author>	</entry>

	</feed>