<?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=85.141.105.76&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=85.141.105.76&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/85.141.105.76"/>
		<updated>2026-04-29T19:52:48Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.22.6</generator>

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0</id>
		<title>Попытка</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%9F%D0%BE%D0%BF%D1%8B%D1%82%D0%BA%D0%B0"/>
				<updated>2010-03-07T16:45:04Z</updated>
		
		<summary type="html">&lt;p&gt;85.141.105.76: correct blockid is 0x1012&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Формат разобрал excid'''&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 (0x0907) ===&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;
== Скрипт разбора файла ==&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;
=== Код ===&lt;br /&gt;
&amp;lt;code python&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;br /&gt;
&lt;br /&gt;
=== Результат ===&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
header = 0x7777&lt;br /&gt;
data size = 1113&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x900&lt;br /&gt;
block size = 2&lt;br /&gt;
unknown data = ['0x10', '0x0']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x912&lt;br /&gt;
block size = 1&lt;br /&gt;
&lt;br /&gt;
user data&lt;br /&gt;
&lt;br /&gt;
user data =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x925&lt;br /&gt;
block size = 1&lt;br /&gt;
&lt;br /&gt;
lod&lt;br /&gt;
&lt;br /&gt;
lod reference =&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x903&lt;br /&gt;
block size = 4&lt;br /&gt;
&lt;br /&gt;
flags (model type)&lt;br /&gt;
&lt;br /&gt;
model type = 0x0&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x910&lt;br /&gt;
block size = 929&lt;br /&gt;
&lt;br /&gt;
geometry&lt;br /&gt;
&lt;br /&gt;
mesh0 data size = 921&lt;br /&gt;
&lt;br /&gt;
unknown block = 0x1000&lt;br /&gt;
unknown block size = 2&lt;br /&gt;
unknown data = ['0x11', '0x0']&lt;br /&gt;
&lt;br /&gt;
name block = 0x1001&lt;br /&gt;
name block size = 8&lt;br /&gt;
name = Plane10&lt;br /&gt;
&lt;br /&gt;
bbox block = 0x1004&lt;br /&gt;
bbox block size = 24&lt;br /&gt;
bbox min =  (-0.089013084769248962, 0.00091872771736234426, -0.05408264324069023&lt;br /&gt;
1)&lt;br /&gt;
bbox max =  (0.064492635428905487, 0.017687048763036728, 0.050194162875413895)&lt;br /&gt;
&lt;br /&gt;
unknown block = 0x1002&lt;br /&gt;
unknown block size = 1&lt;br /&gt;
unknown data = ['0x5']&lt;br /&gt;
&lt;br /&gt;
unknown block = 0x1010&lt;br /&gt;
unknown block size = 8&lt;br /&gt;
unknown data = ['0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0', '0x0']&lt;br /&gt;
&lt;br /&gt;
vertices block = 0x1005&lt;br /&gt;
vertices block size = 88&lt;br /&gt;
vertices count = 7&lt;br /&gt;
vertex0 = (-0.0019903033971786499, 0.001169001217931509, 0.0068940594792366028)&lt;br /&gt;
vertex1 = (-0.089013084769248962, 0.00091872771736234426, 0.045723527669906616)&lt;br /&gt;
vertex2 = (0.006468137726187706, 0.0094316964969038963, 0.050194162875413895)&lt;br /&gt;
vertex3 = (-0.039456427097320557, 0.0043633054010570049, -0.039133470505475998)&lt;br /&gt;
vertex4 = (0.023728765547275543, 0.0064991358667612076, -0.054082643240690231)&lt;br /&gt;
vertex5 = (0.031571760773658752, 0.0060988827608525753, 0.0041843997314572334)&lt;br /&gt;
vertex6 = (0.064492635428905487, 0.017687048763036728, -0.038134712725877762)&lt;br /&gt;
&lt;br /&gt;
triangles block = 0x1006&lt;br /&gt;
triangles block size = 148&lt;br /&gt;
triangles count = 6&lt;br /&gt;
triangle0 = (0, 2, 1, 1, 2, 0)&lt;br /&gt;
triangle1 = (0, 8, 3, 7, 1, 6)&lt;br /&gt;
triangle2 = (0, 11, 4, 10, 3, 9)&lt;br /&gt;
triangle3 = (5, 14, 6, 13, 4, 12)&lt;br /&gt;
triangle4 = (0, 17, 2, 16, 5, 15)&lt;br /&gt;
triangle5 = (0, 20, 5, 19, 4, 18)&lt;br /&gt;
&lt;br /&gt;
smoothgroups block = 0x1013&lt;br /&gt;
smoothgroups block size = 24&lt;br /&gt;
triangle0 = 0x1&lt;br /&gt;
triangle1 = 0x1&lt;br /&gt;
triangle2 = 0x1&lt;br /&gt;
triangle3 = 0x1&lt;br /&gt;
triangle4 = 0x1&lt;br /&gt;
triangle5 = 0x1&lt;br /&gt;
&lt;br /&gt;
uv map block = 0x1008&lt;br /&gt;
uv map block size = 193&lt;br /&gt;
count = 21&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 2&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 1&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 0&lt;br /&gt;
uv index = ['0x1', '0x90', '0xdb', '0x11', '0x7'] 12&lt;br /&gt;
uv index = ['0x1', '0x18', '0x87', '0x10', '0x7'] 12&lt;br /&gt;
uv index = ['0x1', '0x80', '0x8c', '0x10', '0x7'] 12&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 1&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 3&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 0&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 3&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 4&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 2&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 4&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 6&lt;br /&gt;
uv index = ['0x1', '0x0', '0x0', '0x0', '0x0'] 5&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 7&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 6&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 5&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 10&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 9&lt;br /&gt;
uv index = ['0x1', '0x1', '0x0', '0x0', '0x0'] 8&lt;br /&gt;
&lt;br /&gt;
materials block = 0x1009&lt;br /&gt;
materials block size = 43&lt;br /&gt;
materials count = 1&lt;br /&gt;
material0 name = 01 - Default&lt;br /&gt;
triangles count = 6&lt;br /&gt;
triangles indices = [0, 1, 2, 3, 4, 5]&lt;br /&gt;
&lt;br /&gt;
texcoords block = 0x1012&lt;br /&gt;
texcoords block size = 294&lt;br /&gt;
uv tables count = 2&lt;br /&gt;
name = Texture&lt;br /&gt;
unknown = 2&lt;br /&gt;
layer index = 0&lt;br /&gt;
uvs count = 7&lt;br /&gt;
uv0 = (0.72911489009857178, 0.70259565114974976)&lt;br /&gt;
uv1 = (0.4648970365524292, 0.95080757141113281)&lt;br /&gt;
uv2 = (0.55649280548095703, 0.58906811475753784)&lt;br /&gt;
uv3 = (0.97081756591796875, 0.88250058889389038)&lt;br /&gt;
uv4 = (0.97814416885375977, 0.69620668888092041)&lt;br /&gt;
uv5 = (0.75604760646820068, 0.52614188194274902)&lt;br /&gt;
uv6 = (0.98893237113952637, 0.51763355731964111)&lt;br /&gt;
index0 = 0&lt;br /&gt;
index1 = 1&lt;br /&gt;
index2 = 2&lt;br /&gt;
index3 = 3&lt;br /&gt;
index4 = 4&lt;br /&gt;
index5 = 5&lt;br /&gt;
index6 = 6&lt;br /&gt;
name = Texture&lt;br /&gt;
unknown = 2&lt;br /&gt;
layer index = 1&lt;br /&gt;
uvs count = 11&lt;br /&gt;
uv0 = (0.72911489009857178, 0.70259565114974976)&lt;br /&gt;
uv1 = (0.4648970365524292, 0.95080757141113281)&lt;br /&gt;
uv2 = (0.72911489009857178, 0.70259565114974976)&lt;br /&gt;
uv3 = (0.97081756591796875, 0.88250058889389038)&lt;br /&gt;
uv4 = (0.97814416885375977, 0.69620668888092041)&lt;br /&gt;
uv5 = (0.72911489009857178, 0.70259565114974976)&lt;br /&gt;
uv6 = (0.5510140061378479, 0.58371180295944214)&lt;br /&gt;
uv7 = (0.75604760646820068, 0.52614188194274902)&lt;br /&gt;
uv8 = (0.72911489009857178, 0.70259565114974976)&lt;br /&gt;
uv9 = (0.75604760646820068, 0.52614188194274902)&lt;br /&gt;
uv10 = (0.97814416885375977, 0.69620668888092041)&lt;br /&gt;
index0 = 0&lt;br /&gt;
index1 = 1&lt;br /&gt;
index2 = 0&lt;br /&gt;
index3 = 3&lt;br /&gt;
index4 = 4&lt;br /&gt;
index5 = 0&lt;br /&gt;
index6 = 2&lt;br /&gt;
index7 = 5&lt;br /&gt;
index8 = 0&lt;br /&gt;
index9 = 5&lt;br /&gt;
index10 = 4&lt;br /&gt;
unknown index0 = 1&lt;br /&gt;
unknown index1 = 1&lt;br /&gt;
unknown index2 = 2&lt;br /&gt;
unknown index3 = 2&lt;br /&gt;
unknown index4 = 3&lt;br /&gt;
unknown index5 = 4&lt;br /&gt;
unknown index6 = 4&lt;br /&gt;
unknown index7 = 4&lt;br /&gt;
unknown index8 = 5&lt;br /&gt;
unknown index9 = 5&lt;br /&gt;
unknown index10 = 5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x907&lt;br /&gt;
block size = 82&lt;br /&gt;
&lt;br /&gt;
materials&lt;br /&gt;
&lt;br /&gt;
materials count = 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
material0 name = 01 - Default&lt;br /&gt;
engine shader = details\blend&lt;br /&gt;
compiler shader = default&lt;br /&gt;
game material = default&lt;br /&gt;
texture path = det\det_listya&lt;br /&gt;
texture = Texture&lt;br /&gt;
flags (2 sided, etc) = 0x0&lt;br /&gt;
unknown data = ['0x12', '0x1', '0x0', '0x0', '0x1', '0x0', '0x0', '0x0']&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===============================================================================&lt;br /&gt;
block = 0x922&lt;br /&gt;
block size = 38&lt;br /&gt;
&lt;br /&gt;
author&lt;br /&gt;
&lt;br /&gt;
author name = \\SUSHKA\cy-27&lt;br /&gt;
creation date = ['0xf', '0x28', '0x98', '0x43']&lt;br /&gt;
modifier name = \\SUSHKA\cy-27&lt;br /&gt;
modification date = ['0xf', '0x28', '0x98', '0x43']&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>85.141.105.76</name></author>	</entry>

	</feed>