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

	<entry>
		<id>http://stalkerin.gameru.net/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_*.ogf_(%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%B8%D0%B3%D1%80%D1%8B)</id>
		<title>Формат файлов *.ogf (модели игры)</title>
		<link rel="alternate" type="text/html" href="http://stalkerin.gameru.net/wiki/index.php?title=%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2_*.ogf_(%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8_%D0%B8%D0%B3%D1%80%D1%8B)"/>
				<updated>2010-03-24T10:27:31Z</updated>
		
		<summary type="html">&lt;p&gt;81.88.222.98: /* Описание формата(из src X-RAY tools) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Описание формата(из src X-RAY tools)==&lt;br /&gt;
&lt;br /&gt;
// OGF v3 - builds 1098, 1114, 1154&lt;br /&gt;
&lt;br /&gt;
// OGF v4 - builds 2215, 2945, 2939, 2947+&lt;br /&gt;
&lt;br /&gt;
// OGF v4+ - builds 3120, 3456+&lt;br /&gt;
&lt;br /&gt;
// OGF chunk ids.&lt;br /&gt;
&lt;br /&gt;
'''OGF Chunk ID:'''&lt;br /&gt;
&lt;br /&gt;
	OGF_HEADER		= 0x1,&lt;br /&gt;
&lt;br /&gt;
	OGF3_TEXTURE		= 0x2,&lt;br /&gt;
&lt;br /&gt;
	OGF3_TEXTURE_L		= 0x3,&lt;br /&gt;
&lt;br /&gt;
	OGF3_CHILD_REFS		= 0x5,&lt;br /&gt;
&lt;br /&gt;
	OGF3_BBOX		= 0x6,&lt;br /&gt;
&lt;br /&gt;
	OGF3_VERTICES		= 0x7,&lt;br /&gt;
&lt;br /&gt;
	OGF3_INDICES		= 0x8,&lt;br /&gt;
&lt;br /&gt;
	OGF3_LODDATA		= 0x9,	// not sure&lt;br /&gt;
&lt;br /&gt;
	OGF3_VCONTAINER		= 0xa,&lt;br /&gt;
&lt;br /&gt;
	OGF3_BSPHERE		= 0xb,&lt;br /&gt;
&lt;br /&gt;
	OGF3_CHILDREN_L		= 0xc,&lt;br /&gt;
&lt;br /&gt;
	OGF3_S_BONE_NAMES	= 0xd,&lt;br /&gt;
&lt;br /&gt;
	OGF3_S_MOTIONS		= 0xe,&lt;br /&gt;
&lt;br /&gt;
	OGF3_DPATCH		= 0xf,	// guessed name&lt;br /&gt;
&lt;br /&gt;
	OGF3_LODS		= 0x10,	// guessed name&lt;br /&gt;
&lt;br /&gt;
	OGF3_CHILDREN		= 0x11,&lt;br /&gt;
&lt;br /&gt;
	OGF3_S_SMPARAMS		= 0x12,&lt;br /&gt;
&lt;br /&gt;
	OGF4_TEXTURE		= 0x2,&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTICES		= 0x3,&lt;br /&gt;
&lt;br /&gt;
	OGF4_INDICES		= 0x4,&lt;br /&gt;
&lt;br /&gt;
	OGF4_P_MAP		= 0x5,&lt;br /&gt;
&lt;br /&gt;
	OGF4_SWIDATA		= 0x6,&lt;br /&gt;
&lt;br /&gt;
	OGF4_VCONTAINER		= 0x7,&lt;br /&gt;
&lt;br /&gt;
	OGF4_ICONTAINER		= 0x8,&lt;br /&gt;
&lt;br /&gt;
	OGF4_CHILDREN		= 0x9,&lt;br /&gt;
&lt;br /&gt;
	OGF4_CHILDREN_L		= 0xa,&lt;br /&gt;
&lt;br /&gt;
	OGF4_LODDEF2		= 0xb,&lt;br /&gt;
&lt;br /&gt;
	OGF4_TREEDEF2		= 0xc,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_BONE_NAMES	= 0xd,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_MOTIONS		= 0xe,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_SMPARAMS		= 0xf,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_IKDATA		= 0x10,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_USERDATA		= 0x11,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_DESC		= 0x12,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_MOTION_REFS_0	= 0x13,	// pre-CS format&lt;br /&gt;
&lt;br /&gt;
	OGF4_SWICONTAINER	= 0x14,&lt;br /&gt;
&lt;br /&gt;
	OGF4_GCONTAINER		= 0x15,&lt;br /&gt;
&lt;br /&gt;
	OGF4_FASTPATH		= 0x16,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_LODS		= 0x17,&lt;br /&gt;
&lt;br /&gt;
	OGF4_S_MOTION_REFS_1	= 0x18,	// introduced in clear sky&lt;br /&gt;
&lt;br /&gt;
// OGF header definitions.&lt;br /&gt;
&lt;br /&gt;
'''OGF Version:'''&lt;br /&gt;
&lt;br /&gt;
	OGF3_VERSION	= 3,&lt;br /&gt;
	OGF4_VERSION	= 4,&lt;br /&gt;
&lt;br /&gt;
'''OGF Model Type:'''&lt;br /&gt;
&lt;br /&gt;
	MT3_NORMAL		= 0,	// Fvisual&lt;br /&gt;
&lt;br /&gt;
	MT3_HIERRARHY		= 0x1,	// FHierrarhyVisual&lt;br /&gt;
&lt;br /&gt;
	MT3_PROGRESSIVE		= 0x2,	// FProgressiveFixedVisual&lt;br /&gt;
&lt;br /&gt;
	MT3_SKELETON_GEOMDEF_PM	= 0x3,	// CSkeletonX_PM&lt;br /&gt;
&lt;br /&gt;
	MT3_SKELETON_ANIM	= 0x4,	// CKinematics&lt;br /&gt;
&lt;br /&gt;
	MT3_DETAIL_PATCH	= 0x6,	// FDetailPatch&lt;br /&gt;
&lt;br /&gt;
	MT3_SKELETON_GEOMDEF_ST	= 0x7,	// CSkeletonX_ST&lt;br /&gt;
&lt;br /&gt;
	MT3_CACHED		= 0x8,	// FCached&lt;br /&gt;
&lt;br /&gt;
	MT3_PARTICLE		= 0x9,	// CPSVisual&lt;br /&gt;
&lt;br /&gt;
	MT3_PROGRESSIVE2	= 0xa,	// FProgressive&lt;br /&gt;
&lt;br /&gt;
	MT4_NORMAL		= 0,	// Fvisual&lt;br /&gt;
&lt;br /&gt;
	MT4_HIERRARHY		= 0x1,	// FHierrarhyVisual&lt;br /&gt;
&lt;br /&gt;
	MT4_PROGRESSIVE		= 0x2,	// FProgressive&lt;br /&gt;
&lt;br /&gt;
	MT4_SKELETON_ANIM	= 0x3,	// CKinematicsAnimated&lt;br /&gt;
&lt;br /&gt;
	MT4_SKELETON_GEOMDEF_PM	= 0x4,	// CSkeletonX_PM&lt;br /&gt;
&lt;br /&gt;
	MT4_SKELETON_GEOMDEF_ST	= 0x5,	// CSkeletonX_ST&lt;br /&gt;
&lt;br /&gt;
	MT4_LOD			= 0x6,	// FLOD&lt;br /&gt;
&lt;br /&gt;
	MT4_TREE_ST		= 0x7,	// FTreeVisual_ST&lt;br /&gt;
&lt;br /&gt;
	MT4_PARTICLE_EFFECT	= 0x8,	// PS::CParticleEffect&lt;br /&gt;
&lt;br /&gt;
	MT4_PARTICLE_GROUP	= 0x9,	// PS::CParticleGroup&lt;br /&gt;
&lt;br /&gt;
	MT4_SKELETON_RIGID	= 0xa,	// CKinematics&lt;br /&gt;
&lt;br /&gt;
	MT4_TREE_PM		= 0xb,	// FTreeVisual_PM&lt;br /&gt;
&lt;br /&gt;
	MT4_OMF			= 0x40,	// fake model type to distinguish .omf&lt;br /&gt;
&lt;br /&gt;
'''OGF3 Header:'''&lt;br /&gt;
&lt;br /&gt;
	uint8_t		version;&lt;br /&gt;
&lt;br /&gt;
	uint8_t		type;&lt;br /&gt;
&lt;br /&gt;
	uint16_t	unused;		// really?&lt;br /&gt;
&lt;br /&gt;
'''OGF4 Header:'''&lt;br /&gt;
&lt;br /&gt;
	uint8_t		format_version;&lt;br /&gt;
&lt;br /&gt;
	uint8_t		type;&lt;br /&gt;
&lt;br /&gt;
	uint16_t	shader_id;&lt;br /&gt;
&lt;br /&gt;
	ogf_bbox	bb;&lt;br /&gt;
&lt;br /&gt;
	ogf_bsphere	bs;&lt;br /&gt;
&lt;br /&gt;
// Vertex formats.&lt;br /&gt;
&lt;br /&gt;
'''OGF VERTEX FORMAT:'''&lt;br /&gt;
&lt;br /&gt;
	OGF_VERTEXFORMAT_FVF		= 0x00000112, // XRay Actor Editor exports in this format&lt;br /&gt;
&lt;br /&gt;
	OGF3_VERTEXFORMAT_FVF_1L	= 0x12071980,&lt;br /&gt;
&lt;br /&gt;
	OGF3_VERTEXFORMAT_FVF_2L	= 0x240e3300,&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_1L	= 0x12071980,&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_2L	= 0x240e3300,&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_NL	= 0x36154c80, // non existent?&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_1L_CS	= 0x1, // equals OGF3_VERTEXFORMAT_FVF_1L&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_2L_CS	= 0x2, // equals OGF3_VERTEXFORMAT_FVF_2L&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_3L_CS	= 0x3, // equals OGF3_VERTEXFORMAT_FVF_3L&lt;br /&gt;
&lt;br /&gt;
	OGF4_VERTEXFORMAT_FVF_4L_CS	= 0x4,&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''OGF VERTEX RENDER:''' // OGF_VERTEXFORMAT_FVF&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	float		u, v;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ogf3_vert_boned_1w''' // OGF3_VERTEXFORMAT_FVF_1L&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	float		u, v; // texture coords&lt;br /&gt;
&lt;br /&gt;
	uint32_t	matrix;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ogf3_vert_boned_2w''' // OGF3_VERTEXFORMAT_FVF_1L&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	fvector3	t, b; // tangent, binormal (for bump mapping)&lt;br /&gt;
&lt;br /&gt;
	float		w;&lt;br /&gt;
&lt;br /&gt;
	float		u, v; // texture coords&lt;br /&gt;
&lt;br /&gt;
	uint16_t	matrix0, matrix1;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ogf4_vert_boned_1w''' // OGF4_VERTEXFORMAT_FVF_1L, OGF4_VERTEXFORMAT_FVF_1L_CS&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	fvector3	t, b; // tangent, binormal (for bump mapping)&lt;br /&gt;
&lt;br /&gt;
	float		u, v; // texture coords&lt;br /&gt;
&lt;br /&gt;
	uint32_t	matrix;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ogf4_vert_boned_2w''' // OGF4_VERTEXFORMAT_FVF_2L, OGF4_VERTEXFORMAT_FVF_2L_CS&lt;br /&gt;
&lt;br /&gt;
	uint16_t	matrix0, matrix1;&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	fvector3	t, b; // tangent, binormal (for bump mapping)&lt;br /&gt;
&lt;br /&gt;
	float		w;&lt;br /&gt;
&lt;br /&gt;
	float		u, v; // texture coords&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ogf4_vert_boned_3w''' // OGF4_VERTEXFORMAT_FVF_3L, OGF4_VERTEXFORMAT_FVF_3L_CS&lt;br /&gt;
&lt;br /&gt;
	uint16_t	matrices[3];&lt;br /&gt;
&lt;br /&gt;
	uint16_t	unused;&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	fvector3	t, b; // tangent, binormal (for bump mapping)&lt;br /&gt;
&lt;br /&gt;
	float		w[2];&lt;br /&gt;
&lt;br /&gt;
	float		u, v; // texture coords&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
'''ogf4_vert_boned_4w''' // OGF4_VERTEXFORMAT_FVF_4L_CS&lt;br /&gt;
&lt;br /&gt;
	uint16_t	matrices[4];&lt;br /&gt;
&lt;br /&gt;
	fvector3	p, n; // point, normal&lt;br /&gt;
&lt;br /&gt;
	fvector3	t, b; // tangent, binormal (for bump mapping)&lt;br /&gt;
&lt;br /&gt;
	float		w[3];&lt;br /&gt;
&lt;br /&gt;
	float		u, v; // texture coords&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
	OGF3_HOPPE_HEADER	= 1,&lt;br /&gt;
&lt;br /&gt;
	OGF3_HOPPE_VERT_SPLITS	= 2,&lt;br /&gt;
&lt;br /&gt;
	OGF3_HOPPE_FIX_FACES	= 3,&lt;br /&gt;
&lt;br /&gt;
// OGF v3 LOD information in fixed progressive (Hoppe's PM).&lt;br /&gt;
&lt;br /&gt;
'''ogf3_vsplit'''&lt;br /&gt;
&lt;br /&gt;
	uint16_t	vert;&lt;br /&gt;
&lt;br /&gt;
	uint8_t		new_tris;&lt;br /&gt;
&lt;br /&gt;
	uint8_t		fix_faces;&lt;br /&gt;
&lt;br /&gt;
// OGF v4 progressive mesh definitions (SWPM).&lt;br /&gt;
&lt;br /&gt;
'''ogf4_slide_window'''&lt;br /&gt;
&lt;br /&gt;
	uint32_t	offset;&lt;br /&gt;
&lt;br /&gt;
	uint16_t	num_tris;&lt;br /&gt;
&lt;br /&gt;
	uint16_t	num_verts;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Bone and kinematics definitions are mostly shared with editor object.&lt;br /&gt;
&lt;br /&gt;
const uint32_t OGF4_S_JOINT_IK_DATA_VERSION = 1;&lt;br /&gt;
&lt;br /&gt;
// Motions definitions.&lt;br /&gt;
&lt;br /&gt;
const uint16_t OGF4_S_SMPARAMS_VERSION_3 = 3;	// 2215, 2947+&lt;br /&gt;
&lt;br /&gt;
const uint16_t OGF4_S_SMPARAMS_VERSION_4 = 4;	// 3120, 3456+&lt;br /&gt;
&lt;br /&gt;
const float OGF3_MOTION_FPS = 30.f;&lt;br /&gt;
&lt;br /&gt;
const float OGF4_MOTION_FPS = 30.f;&lt;br /&gt;
&lt;br /&gt;
'''ogf3_motion_type'''&lt;br /&gt;
&lt;br /&gt;
	SMT_FX		= 0,&lt;br /&gt;
&lt;br /&gt;
	SMT_CYCLE	= 1,&lt;br /&gt;
&lt;br /&gt;
'''ogf4_key_presence_flag'''&lt;br /&gt;
&lt;br /&gt;
	KPF_T_PRESENT	= 0x01,&lt;br /&gt;
&lt;br /&gt;
	KPF_R_ABSENT	= 0x02,&lt;br /&gt;
&lt;br /&gt;
	KPF_T_HQ	= 0x04,		// 3456+&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;struct ogf_key_qr {&lt;br /&gt;
&lt;br /&gt;
	int16_t				x, y, z, w;&lt;br /&gt;
&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt; void	dequantize(_quaternion&amp;lt;T&amp;gt;&amp;amp; q) const;&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt; inline void ogf_key_qr::dequantize(_quaternion&amp;lt;T&amp;gt;&amp;amp; q) const&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	const T m = 1/T(32767);&lt;br /&gt;
&lt;br /&gt;
	q.x = x*m;&lt;br /&gt;
&lt;br /&gt;
	q.y = y*m;&lt;br /&gt;
&lt;br /&gt;
	q.z = z*m;&lt;br /&gt;
&lt;br /&gt;
	q.w = w*m;&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt; struct _ogf4_key_qt&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	T	x, y, z;&lt;br /&gt;
&lt;br /&gt;
	void	dequantize(fvector3&amp;amp; value, const fvector3&amp;amp; scale) const;&lt;br /&gt;
&lt;br /&gt;
typedef _ogf4_key_qt&amp;lt;int8_t&amp;gt; ogf4_key_qt;&lt;br /&gt;
&lt;br /&gt;
typedef _ogf4_key_qt&amp;lt;int16_t&amp;gt; ogf4_key_qt_hq;&lt;br /&gt;
&lt;br /&gt;
template&amp;lt;typename T&amp;gt; inline void _ogf4_key_qt&amp;lt;T&amp;gt;::dequantize(fvector3&amp;amp; value, const fvector3&amp;amp; scale) const&lt;br /&gt;
&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
	value.x = x*scale.x;&lt;br /&gt;
&lt;br /&gt;
	value.y = y*scale.y;&lt;br /&gt;
&lt;br /&gt;
	value.z = z*scale.z;&lt;br /&gt;
&lt;br /&gt;
}; &amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''ogf_motion_def'''&lt;br /&gt;
&lt;br /&gt;
	uint16_t	bone_or_part;&lt;br /&gt;
&lt;br /&gt;
	uint16_t	motion;&lt;br /&gt;
&lt;br /&gt;
	float		speed;&lt;br /&gt;
&lt;br /&gt;
	float		power;&lt;br /&gt;
&lt;br /&gt;
	float		accrue;&lt;br /&gt;
&lt;br /&gt;
	float		falloff;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// level tree definitions&lt;br /&gt;
&lt;br /&gt;
'''ogf4_5color'''&lt;br /&gt;
&lt;br /&gt;
	fvector3	rgb;&lt;br /&gt;
&lt;br /&gt;
	float		hemi;&lt;br /&gt;
&lt;br /&gt;
	float		sun;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// level mesh LOD definitions (billboards)&lt;br /&gt;
&lt;br /&gt;
'''ogf4_lod_vertex'''&lt;br /&gt;
&lt;br /&gt;
	fvector3	v;&lt;br /&gt;
&lt;br /&gt;
	fvector2	t;&lt;br /&gt;
&lt;br /&gt;
	rgba32		c_rgb_hemi;&lt;br /&gt;
&lt;br /&gt;
	uint8_t		c_sun;&lt;br /&gt;
&lt;br /&gt;
	uint8_t		pad[3];&lt;br /&gt;
&lt;br /&gt;
// on-disk format!!!&lt;br /&gt;
&lt;br /&gt;
'''ogf4_lod_face:'''&lt;br /&gt;
&lt;br /&gt;
	ogf4_lod_vertex	v[4];&lt;br /&gt;
&lt;br /&gt;
====Разобрал bardak====&lt;br /&gt;
====Дополнил NatteFrost====&lt;br /&gt;
&lt;br /&gt;
===Ссылки===&lt;br /&gt;
Утилиты так или иначе связанные с импортом\экспортом OGF:&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=29 OGFViewer 1.0.2 src] от '''batya'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=287 X-RAY Tools src] от '''bardak'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=184 OGF2SMD src 2.03] от '''kasper'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=222 OGF Viewer RC1 src] от '''Landgraf Paul'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=331 xrFSL src 18/06/08] от '''Neo]['''&lt;br /&gt;
-----------------------------&lt;br /&gt;
*[http://www.gameru.net/forum/index.php?s=&amp;amp;showtopic=33123&amp;amp;view=findpost&amp;amp;p=940184 OGFViewer 1.0.5] от '''NatteFrost'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=288 X-RAY Tools] от '''bardak'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=348 X-RAY Tools update 2.0] от '''bardak'''&lt;br /&gt;
*[http://www.stalkerin.gameru.net/downloads/other/converter-1469-t1.7z X-RAY Tools converter] от '''bardak'''(частичная поддержка OGF 1511, 1469, 1472)&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=118 OGF to SMD 2.03 anims support] от '''kasper'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=204 OGF2SMD 3.0 pre-alpha] от '''kasper'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=186 OgfViewer 1.0 beta 2] от '''SmanxX1'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=28 OGFViewer 1.0.4] от '''batya'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=349 Maya 2009 plugin import/export] от '''bardak'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=347 Maya 2008 plugin import/export] от '''bardak'''&lt;br /&gt;
*[http://stalkerin.gameru.net/modules.php?name=Downloads&amp;amp;d_op=getit&amp;amp;lid=324 OGF Master 2.0.1 beta] от '''DesWer'''&lt;br /&gt;
[[Категория:Форматы файлов]]&lt;/div&gt;</summary>
		<author><name>81.88.222.98</name></author>	</entry>

	<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-24T10:12:56Z</updated>
		
		<summary type="html">&lt;p&gt;81.88.222.98: /* Материалы объекта — Object Materials (0x1009) */&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]||||Три пары индекс вершины, индекс текстурной координаты (v0,vref0,v1,vref1,v2,vref2)&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||Номер таблицы (в блоке 0x1012)&lt;br /&gt;
|-&lt;br /&gt;
|Индекс текстурных координаты||uint(4)||0x0 или 0x1||Индекс в таблице, определяемой предыдущим значением (в блоке 0x1012).&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]||||из таблицы Грани — Faces (0x1006)&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]||||Индекс вершины (в блоке 0x1005)&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>81.88.222.98</name></author>	</entry>

	<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-24T10:09:01Z</updated>
		
		<summary type="html">&lt;p&gt;81.88.222.98: /* Словарь текстурных координат — UVs map (0x1008) */&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]||||Три пары индекс вершины, индекс текстурной координаты (v0,vref0,v1,vref1,v2,vref2)&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||Номер таблицы (в блоке 0x1012)&lt;br /&gt;
|-&lt;br /&gt;
|Индекс текстурных координаты||uint(4)||0x0 или 0x1||Индекс в таблице, определяемой предыдущим значением (в блоке 0x1012).&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]||||Индекс вершины (в блоке 0x1005)&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>81.88.222.98</name></author>	</entry>

	<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-24T10:08:33Z</updated>
		
		<summary type="html">&lt;p&gt;81.88.222.98: /* Словарь текстурных координат — UVs map (0x1008) */&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]||||Три пары индекс вершины, индекс текстурной координаты (v0,vref0,v1,vref1,v2,vref2)&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||Номер таблицы (в блоке 0x1012)&lt;br /&gt;
Возможно, только первый байт содержит эти данные,&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||Индекс в таблице, определяемой предыдущим значением (в блоке 0x1012).&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]||||Индекс вершины (в блоке 0x1005)&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>81.88.222.98</name></author>	</entry>

	<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-24T10:06:23Z</updated>
		
		<summary type="html">&lt;p&gt;81.88.222.98: /* Грани — Faces (0x1006) */&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]||||Три пары индекс вершины, индекс текстурной координаты (v0,vref0,v1,vref1,v2,vref2)&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]||||Индекс вершины (в блоке 0x1005)&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>81.88.222.98</name></author>	</entry>

	<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-24T08:23:00Z</updated>
		
		<summary type="html">&lt;p&gt;81.88.222.98: /* Текстурные координаты — UVs (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]||||Индекс вершины (в блоке 0x1005)&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>81.88.222.98</name></author>	</entry>

	</feed>