<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Recent changes to app5_core</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>Recent changes to app5_core</description><atom:link href="https://sourceforge.net/p/app5/wiki/app5_core/feed" rel="self"/><language>en</language><lastBuildDate>Sun, 19 Feb 2012 11:15:44 -0000</lastBuildDate><atom:link href="https://sourceforge.net/p/app5/wiki/app5_core/feed" rel="self" type="application/rss+xml"/><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v124 
+++ v125 
@@ -128,133 +128,132 @@
 ### Базовый класс Object ###
 Функции объекта можно вызвать в окне ObjectInspector, в командном интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователю  необходимо создать метод Declare. в котором указать каждый нужный метод или свойство си++ и передать его адрес в функцию SET_ATTR или SET_METHOD.
 Каждый обьект может быть сохранен в файл сцены. При отсутствии специальнорго способа сохранения у потомков базового класса, сохраняются только свойства базового класса. Свойство можно пометить как isNotSaving тогда оно не будет сохраняться в файл сцены. 
-~~~~~~
-
+
+~~~~~~
 class Object : public CObject
 {
     public:
 		DECLARE_SERIAL( Object )
 		Object();
 		~Object();
 		Object(Object&amp; B)  
 		
                 virtual operator=(Object&amp; A)
 		virtual void NullReferences(){};
 		void Connect();
 		void Disconnect();
 		virtual void Copy(Object* A);
 		
 		
 		//Установить имя обьекта, недопускаются повторы. 
 		void	SetName(std::string str);
 		
 		//Переименовать 
 		void	Rename(std::string str);
 		
 		//Установить имя класса 
 		void	SetClassName(std::string);
 		
 		void SetAddr2this(t_atr&amp; a)
 			
 		//	Присвоить значение аттрибуту
 		void	SET(char* attrname, char* val)
 			
 		//	Присвоить описание обьекту
 		void	SET_DESCR(string descr);
 		
 		//Задекларировать аттрибут
 		void	SET_ATTR(string name, void* addr, string type, bool bHidden);
 		
 		//Взять аттрибут
 		t_atr* GET_ATTR(string name);
 		
 		//Установить метод
 		void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
 		
 		//Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
 		int   SET_OBJECT(void* this_ptr, char* objname);
 		
 		//Найти обьект в таблице по имени (старый метод)
 		static void* GET_OBJECT(char* objname);
 		
 		//Удалить обьект
 		static void  DELETE_OBJECT(char* objname);
 		
 		//Вызвать метод обьекта
 		int   CALL(char* obname, char* classname, char* methname);	 
 		string GetMethName(char* dummy,...);
 		
 		//Для записи аттрибутов в файл
 		string ReadString(CArchive&amp; archive);
 		void   WriteString(CArchive&amp; archive, string str);
 		
 		int    RemoveSignals();
 		
 		
 		// Обычные слоты  
 		virtual void mouse_move(int x, int y){};
 		virtual void mouse_wheel(int zDelta){};
 		virtual void click_lmb(int state){};	
 		virtual void click_rmb(int state){};
 		virtual void click_mmb(int state){};
 		virtual void key_pressed(int k){};
 		
 		
 		//сюда приходит сигнал апдейта от первого таймера
 		virtual void Slot1(CSignal&amp; sig); 
 		virtual void Slot2(CSignal&amp; sig);
 		virtual void Slot3(CSignal&amp; sig);
 		virtual void Slot4(CSignal&amp; sig);
 		
 		// Слюда приходит сообщение
 		virtual void MessageSlot(CMessage&amp; msg);
 		
 		//События
 		virtual void OnSelect(){};
 		virtual void OnUnselect(){};
 		virtual void OnAttrChange(t_atr&amp; a){};
 		virtual void OnAttrSelect(t_atr&amp; a){};
 		virtual void OnDrag( float x, float y, float z );
 		
 		
-### Базовый класс Object. Свойства ###
+
 		
 		name;  				 //имя
 		classname;  	    //имя класса
 		groupname;  	    //имя группового обьекта
 		int	 livetime;		//время жизни
 		bool	 connected; //соединен с системой сигналов
 		
 		EntetyInfo	  ei;			// информация о ентети
 		vector&lt;t_atr&gt; atrs; 	  // массив аттрибутов
 		map&lt;string,int &gt; atrsmap; // таблица аттрибутов
 		
 		vector&lt;string&gt; expressions;//выражения
 		//tagTYPE	 meth_args[1][1]; // параметры функции
 		
 		bool		 isEntety;      // это сущность мира
 		bool		 isNotSaving;   // это не сохраняемый обьект
 		bool		 isCanRender;   // этот обьект может быть визуализирован
 		int		 isSelected;		// этот обькт выбран в данный момент (0- обьект не выбран,  2 - обьект выбран)
 		bool            isGroup;    // эта группа
 		bool		 isLoading;		// идет загрузка обьекта
 		//bool		 isPhysic;    	
 		bool		 onOpora;		// свободно либо на опоре  
 		int		 isHidden;			//0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
 		bool		 m_Updated;
 		
 		string		 updatescript;		//скрипт для обновления параметров
 		string		 initscript;    	//скрипт для инициализации
 		time_t       osCreationTime;	//время создания
 		DWORD		 osCreationTimeTicks;   //время в тиках
 		bool		 bHideStdAttrs;         // имеет спятанные аттрибуты
 		
 		
 };
-~~~~~~
-
-
-------------------------------------------------------------------------
+
+~~~~~~
+
 
 &lt;h5 id=ren&gt;&lt;/h5&gt;
 ### Класс RenderObject ###
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 11:15:44 -0000</pubDate><guid>https://sourceforge.nete1816f982a7e79e186f111d747c3650c9529f12c</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v123 
+++ v124 
@@ -128,115 +128,130 @@
 ### Базовый класс Object ###
 Функции объекта можно вызвать в окне ObjectInspector, в командном интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователю  необходимо создать метод Declare. в котором указать каждый нужный метод или свойство си++ и передать его адрес в функцию SET_ATTR или SET_METHOD.
 Каждый обьект может быть сохранен в файл сцены. При отсутствии специальнорго способа сохранения у потомков базового класса, сохраняются только свойства базового класса. Свойство можно пометить как isNotSaving тогда оно не будет сохраняться в файл сцены. 
-
-#### Базовый класс Object. Методы ####
-
-#!/usr/bin/python
-# Code goes here ...
-
-Установить имя обьекта (должно быть уникальное). 
-SetName(std::string str);
-
-Переименовать 
-Rename(std::string str);
-
-Установить имя класса 
-SetClassName(std::string);
-
-SetAddr2this(t_atr&amp; a)
-
-Присвоить значение аттрибуту
-SET(char* attrname, char* val)
-
-Присвоить описание обьекту
-SET_DESCR(string descr);
-
-Задекларировать аттрибут
-SET_ATTR(string name, void* addr, string type, bool bHidden);
-
-Взять аттрибут
-t_atr* GET_ATTR(string name);
-
-Установить метод
-void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
-
-Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
-int   SET_OBJECT(void* this_ptr, char* objname);
-
-Найти обьект в таблице по имени (старый метод)
-static void* GET_OBJECT(char* objname);
-
-Удалить обьект
-static void  DELETE_OBJECT(char* objname);
-
-Вызвать метод обьекта
-int   CALL(char* obname, char* classname, char* methname);	 
-string GetMethName(char* dummy,...);
-
-Записать аттрибут в файл
-string ReadString(CArchive&amp; archive);
-void   WriteString(CArchive&amp; archive, string str);
-
-int    RemoveSignals();
-
-
-// Слоты управления 
-virtual void mouse_move(int x, int y){};
-virtual void mouse_wheel(int zDelta){};
-virtual void click_lmb(int state){};	
-virtual void click_rmb(int state){};
-virtual void click_mmb(int state){};
-virtual void key_pressed(int k){};
-
-
-//сюда приходит сигнал апдейта от первого таймера
-virtual void Slot1(CSignal&amp; sig); 
-//сюда приходит апдейт из отдельной нити
-virtual void Slot2(CSignal&amp; sig);
-virtual void Slot4(CSignal&amp; sig);
-
-// Слюда приходит сообщение
-virtual void MessageSlot(CMessage&amp; msg);
-
-//События
-virtual void OnSelect(){};
-virtual void OnUnselect(){};
-virtual void OnAttrChange(t_atr&amp; a){};
-virtual void OnAttrSelect(t_atr&amp; a){};
-virtual void OnDrag( float x, float y, float z );
-
-
+~~~~~~
+
+class Object : public CObject
+{
+    public:
+		DECLARE_SERIAL( Object )
+		Object();
+		~Object();
+		Object(Object&amp; B)  
+		
+                virtual operator=(Object&amp; A)
+		virtual void NullReferences(){};
+		void Connect();
+		void Disconnect();
+		virtual void Copy(Object* A);
+		
+		
+		//Установить имя обьекта, недопускаются повторы. 
+		void	SetName(std::string str);
+		
+		//Переименовать 
+		void	Rename(std::string str);
+		
+		//Установить имя класса 
+		void	SetClassName(std::string);
+		
+		void SetAddr2this(t_atr&amp; a)
+			
+		//	Присвоить значение аттрибуту
+		void	SET(char* attrname, char* val)
+			
+		//	Присвоить описание обьекту
+		void	SET_DESCR(string descr);
+		
+		//Задекларировать аттрибут
+		void	SET_ATTR(string name, void* addr, string type, bool bHidden);
+		
+		//Взять аттрибут
+		t_atr* GET_ATTR(string name);
+		
+		//Установить метод
+		void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
+		
+		//Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
+		int   SET_OBJECT(void* this_ptr, char* objname);
+		
+		//Найти обьект в таблице по имени (старый метод)
+		static void* GET_OBJECT(char* objname);
+		
+		//Удалить обьект
+		static void  DELETE_OBJECT(char* objname);
+		
+		//Вызвать метод обьекта
+		int   CALL(char* obname, char* classname, char* methname);	 
+		string GetMethName(char* dummy,...);
+		
+		//Для записи аттрибутов в файл
+		string ReadString(CArchive&amp; archive);
+		void   WriteString(CArchive&amp; archive, string str);
+		
+		int    RemoveSignals();
+		
+		
+		// Обычные слоты  
+		virtual void mouse_move(int x, int y){};
+		virtual void mouse_wheel(int zDelta){};
+		virtual void click_lmb(int state){};	
+		virtual void click_rmb(int state){};
+		virtual void click_mmb(int state){};
+		virtual void key_pressed(int k){};
+		
+		
+		//сюда приходит сигнал апдейта от первого таймера
+		virtual void Slot1(CSignal&amp; sig); 
+		virtual void Slot2(CSignal&amp; sig);
+		virtual void Slot3(CSignal&amp; sig);
+		virtual void Slot4(CSignal&amp; sig);
+		
+		// Слюда приходит сообщение
+		virtual void MessageSlot(CMessage&amp; msg);
+		
+		//События
+		virtual void OnSelect(){};
+		virtual void OnUnselect(){};
+		virtual void OnAttrChange(t_atr&amp; a){};
+		virtual void OnAttrSelect(t_atr&amp; a){};
+		virtual void OnDrag( float x, float y, float z );
+		
+		
 ### Базовый класс Object. Свойства ###
-
-name;  		    //имя
-classname;  	    //имя класса
-groupname;  	    //имя группового обьекта
-int	 livetime;  //время жизни
-bool	 connected; //соединен с системой сигналов
-
-EntetyInfo	  ei;	// информация о ентети
-vector&lt;t_atr&gt; atrs; 	  // массив аттрибутов
-map&lt;string,int &gt; atrsmap; // таблица аттрибутов
-
-vector&lt;string&gt; expressions;//выражения
-//tagTYPE	 meth_args[1][1]; // параметры функции
-
-bool		 isEntety;     // это сущность мира
-bool		 isNotSaving;  // это не сохраняемый обьект
-bool		 isCanRender;  // этот обьект может быть визуализирован
-int		 isSelected;   // этот обькт выбран в данный момент (0- обьект не выбран,  2 - обьект выбран)
-bool            isGroup;      // эта группа
-bool		 isLoading;   // идет загрузка обьекта
-//bool		 isPhysic;    	
-bool		 onOpora;    // свободно либо на опоре  
-int		 isHidden;   //0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
-bool		 m_Updated;
-
-string		 updatescript;		//скрипт для обновления параметров
-string		 initscript;    	//скрипт для инициализации
-time_t          osCreationTime;	//время создания
-DWORD		 osCreationTimeTicks;   //время в тиках
-bool		 bHideStdAttrs;         // имеет спятанные аттрибуты
+		
+		name;  				 //имя
+		classname;  	    //имя класса
+		groupname;  	    //имя группового обьекта
+		int	 livetime;		//время жизни
+		bool	 connected; //соединен с системой сигналов
+		
+		EntetyInfo	  ei;			// информация о ентети
+		vector&lt;t_atr&gt; atrs; 	  // массив аттрибутов
+		map&lt;string,int &gt; atrsmap; // таблица аттрибутов
+		
+		vector&lt;string&gt; expressions;//выражения
+		//tagTYPE	 meth_args[1][1]; // параметры функции
+		
+		bool		 isEntety;      // это сущность мира
+		bool		 isNotSaving;   // это не сохраняемый обьект
+		bool		 isCanRender;   // этот обьект может быть визуализирован
+		int		 isSelected;		// этот обькт выбран в данный момент (0- обьект не выбран,  2 - обьект выбран)
+		bool            isGroup;    // эта группа
+		bool		 isLoading;		// идет загрузка обьекта
+		//bool		 isPhysic;    	
+		bool		 onOpora;		// свободно либо на опоре  
+		int		 isHidden;			//0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
+		bool		 m_Updated;
+		
+		string		 updatescript;		//скрипт для обновления параметров
+		string		 initscript;    	//скрипт для инициализации
+		time_t       osCreationTime;	//время создания
+		DWORD		 osCreationTimeTicks;   //время в тиках
+		bool		 bHideStdAttrs;         // имеет спятанные аттрибуты
+		
+		
+};
+~~~~~~
 
 
 ------------------------------------------------------------------------
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 11:14:14 -0000</pubDate><guid>https://sourceforge.net23870d9ae41fae932cfae1efbed25df3a98cd83a</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v122 
+++ v123 
@@ -131,6 +131,8 @@
 
 #### Базовый класс Object. Методы ####
 
+#!/usr/bin/python
+# Code goes here ...
 
 Установить имя обьекта (должно быть уникальное). 
 SetName(std::string str);
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 11:01:24 -0000</pubDate><guid>https://sourceforge.netd80d892ab0dbd4168fa7f6f509c115fe8918b017</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v121 
+++ v122 
@@ -11,680 +11,694 @@
 * &lt;a href="app5_core/#mon"&gt;Мониторинг переменных&lt;/a&gt;
 * &lt;a href="app5_core/#act"&gt;Действия над виртуальными обьектами&lt;/a&gt;
 * &lt;a href="app5_core/#bas"&gt;Базовый класс Object&lt;/a&gt;
+* &lt;a href="app5_core/#obj"&gt;Базовый класс Object. Методы&lt;/a&gt;
 * &lt;a href="app5_core/#ren"&gt;Класс RenderObject&lt;/a&gt;
 * &lt;a href="app5_core/#lsc"&gt;Загрузка и сохранение сцены&lt;/a&gt;
 * &lt;a href="app5_core/#reload"&gt;Сохранение и восстановление состояния обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#nam"&gt;Имена обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#atr"&gt;Аттрибуты обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#ids"&gt;Идентификаторы обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#grp"&gt;Группы&lt;/a&gt;
-* &lt;a href="app5_core/#obj"&gt;Базовый класс Object. Методы&lt;/a&gt;
 * &lt;a href="app5_core/#mov"&gt;Класс физики CMovement. Силы действующие на обьект типа Object&lt;/a&gt;
 * &lt;a href="app5_core/#spc"&gt;Класс пространство Space&lt;/a&gt;
 * &lt;a href="app5_core/#cam"&gt;Класс Камера&lt;/a&gt;
 * &lt;a href="app5_core/#mod"&gt;Режимы работы вьюпорта&lt;/a&gt;
 * &lt;a href="app5_core/#sig"&gt;Класс сигнала CSignal&lt;/a&gt;
 * &lt;a href="app5_core/#atr"&gt;Структура t_atr.&lt;/a&gt;
 * &lt;a href="app5_core/#mif"&gt;Класс CMainInterface&lt;/a&gt;
 * &lt;a href="app5_core/#rnd"&gt;Способы отрисовки моделей&lt;/a&gt;
 * &lt;a href="app5_core/#eif"&gt;Структура EntetyInfo&lt;/a&gt;
 * &lt;a href="app5_core/#pif"&gt;Структура PhysicalInfo&lt;/a&gt;
 * &lt;a href="app5_core/#reg"&gt;Реестр обьектов CObjRegistry&lt;/a&gt;
 * &lt;a href="app5_core/#res"&gt;Реестр ресурсов CResRegistry&lt;/a&gt;
 * &lt;a href="app5_core/#inp"&gt;Класс CInput&lt;/a&gt;
 * &lt;a href="app5_core/#ins"&gt;Инспектор обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#geo"&gt;Геометрические примитивы и связанная с ними физика&lt;/a&gt;
 * &lt;a href="app5_core/#bal"&gt;Класс Ball&lt;/a&gt;
 
 &lt;br/&gt;
 
 * &lt;a href="app5_core/#lod"&gt;Загрузка геометрии и материалов из файла формата 3dmax ASE&lt;/a&gt;
     * &lt;a href="app5_core/#ase"&gt;Класс CAsciiLoader&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Класс GemObject&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая вершину сетки Vertex&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая грань сетки TFace&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая точку сплайна Vertex_knot&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Групповой обьект GroupObject&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Сплайновый обьект ShapeObject &lt;/a&gt;
 
 * &lt;a href="app5_core/#veh"&gt;Класс CVehicle&lt;/a&gt;
 * &lt;a href="app5_core/#cur"&gt;Класс Curve&lt;/a&gt;
 
 &lt;br/&gt;
 
 * &lt;a href="app5_core/#dem"&gt;Запись демо&lt;/a&gt;
     * &lt;a href="app5_core/#dem.seq"&gt;В какой последовательности обрабатывается воспроизведение и запись демок?&lt;/a&gt;
     * &lt;a href="app5_core/#dem"&gt;Возможность применения управления поверх записанных параметров.&lt;/a&gt;
     * &lt;a href="app5_core/#demo.file.format"&gt;Формат записи файла демо&lt;/a&gt;
     * &lt;a href="app5_core/#demo.history.view"&gt;Как просматривать историю записей? &lt;/a&gt;
     * &lt;a href="app5_core/#demo.recording.process"&gt;Пользовательский интерфейс. Как записывать демо.&lt;/a&gt;    
     * &lt;a href="app5_core/#demo.recording.process"&gt;Пользовательский интерфейс. Как проигрывать демо.&lt;/a&gt;
     * &lt;a href="app5_core/#demorecorder.interface"&gt;Класс DemoRecorder&lt;/a&gt;
     * &lt;a href="app5_core/#demorecorder.interface"&gt;Класс Demo&lt;/a&gt;
 +
 * &lt;a href="app5_core/#vm"&gt;Cправка по виртуальной машине(необработанная под wiki)&lt;/a&gt;
 
 Классы реализация которых еще не закончена
 
-&lt;a href="vehicle/#vm"&gt;Отдельная страница. Алгоритм ухода от столкновения реализация класса CVehicle &lt;/a&gt;
+&lt;a href="vehicle/#vm"&gt; Алгоритм ухода от столкновения реализация класса CVehicle &lt;/a&gt;
 
 # Интерфейс пользователя #
 [[img src=app5_main_window_min.jpg alt=foobar]]
 
 #####&lt;p align="center"&gt;Рис1. вид главного окна app5.&lt;/p&gt;#####
 
 &lt;h5 id=cro&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Создание обьекта  #####
 Создать обьект можно с помощью кнопки Add, либо c помощью комадны create_obj. 
 
 &lt;h5 id=sel&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Выбор обьекта  #####
 Выбор обьекта осуществляется через список ObjList. Список поддерживает фильтрацию по различным полям. При выборе обьекта он переходит в состояние выбран и его ссылка появляется в списке выбранных обьектов обьекта CSelection.
 
 &lt;h5 id=selv&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Выбор визуального обьекта  #####
 Выбор обьекта можно делать щелкнув по нему мышью. 
 Выбор нескольких обьектов осуществляется с клавишей shift.
 
 &lt;h5 id=fil&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Фильтрация списка обьектов #####
 Может проходить по следующим полям:
 1. По имени в поле контекст(рис 1). Можно задавать несколько имен через пробел 
 2. По классу
 3. По группе
 
 &lt;h5 id=std&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Стандартные типы обьектов в версии 1.01 #####
 
 Следующие типы обьектов являются стандартными и различаются в версии 1.01
 
 * Полигональная сетка (GemObject)
 * Геометрический примитив (сфера, куб, цилиндр, пирамида, обьект Кассини, обьект вращения)
 * Кривые (спираль, дуга, сплайн, кривая Мебиуса)
 * Машины
 * Помошники (точки, стрелки)
 * Группы (содержащие ссылки на другие обьекты)
 * Несгрупированные
 
 &lt;h5 id=act&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Действия над виртуальными обьектами  #####
 Видимые визуальные обьекты можно поворачивать, масштабировать и перемещать в пределах сцены и применять к ним различные функции. Обьекты можно прятать и проявлять. Их можно обьединять в группу и перемещать эту группу. Перемещение обьекта мышью можно ограничить по одной оси, нажав кнопки x,y,z . Параметры обьекта меняются через инспектор обьектов.
 
 &lt;h5 id=mon&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Мониторинг переменных #####
 Любой аттрибут можно вывести на экран обновления строчкой watch("objname","attrname")
 У экрана вывода переменных есть режим surviveMode, означающий что выводится только то что обновляет свое значение в течении N циклов апдейта. Если переменная не меняется она автоматически удаляется из мониторинга. Также можно выводить любую переменную из c++ вызвав pscr.upd(var). За мониторинг сейчас отвечает отдельное прилодение "Монитор app5".
 
 
 &lt;h5 id=bas&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Базовый класс Object ###
-Функции базового объекта можно вызвать в ObjectInspector, интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователью  необходимо создать метод Declare. в котором описать каждый нужный метод или свойство си++ класса и передать адрес функции SET_ATTR или SET_METHOD.
+Функции объекта можно вызвать в окне ObjectInspector, в командном интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователю  необходимо создать метод Declare. в котором указать каждый нужный метод или свойство си++ и передать его адрес в функцию SET_ATTR или SET_METHOD.
 Каждый обьект может быть сохранен в файл сцены. При отсутствии специальнорго способа сохранения у потомков базового класса, сохраняются только свойства базового класса. Свойство можно пометить как isNotSaving тогда оно не будет сохраняться в файл сцены. 
 
-&lt;h5 id=ren&gt;&lt;/h5&gt;
-### Класс RenderObject ###
-------------------------------------------------------------------------
-Обьекты этого класса визуализируются на экране. 
-Другими словами они попадают в конвеер рендеринга.
-Чтобы сделать визуальный обьект сделайте следующее:
-1. Создайте отдельный класс  
-2. Унаследуйте его от RenderObject
-3. Опишите логику этого класса
-3. Напишите функцию отрисовки обьекта в Render()
-4. Добавте свой обьект через диалог создания обьекта
-
-&lt;h5 id=lsc&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Загрузка и сохранение сцены ####
-Для загрузки сцены нужно 3 файла: object.arh classes.arh offset.arh. В файл classes.arh записываются имена классов обьектов, в файл obj.arh записываются данные обьектов, в файл offsets.arh записывается таблица имя оьекта - смещение на начало данных. У обьекта сохраняются все аттрибуты за исключением тех аттрибутов для которых выставлен флаг isNotSaving. 
-
-&lt;h5 id=reload&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Сохранение и восстановление состояния обьекта ####
-Для любого выбранного обьекта можно сохранять его состояние в любой момент времени.
-Потом с помощью кнопки ReloadObj восстановить это сохраненное состояние.
-
-
-&lt;h5 id=nam&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Имена обьектов ####
-Каких либо ограничений на длинну имен обьектов не существует равно как и нет ограничений на символы состовляющие имя обьекта. Единственное требование - имя должно быть уникально. Если при задании имени обьекта возникла коллизия в ячейке таблицы объектов, система атоматически сменит имя добавив к нему окончание в виде первых байт адреса этого обьекта. 
-
-&lt;h5 id=atr&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Аттрибуты обьектов ####
-В текущей версии 1.01 сохраняются все аттрибуты базового класса: дефолтовый размер примерно равен  1.4 кб. Добавление специальных методов Serialize у классов потомков естественно может увеличить размер. Например в случае геометрического обьекта обьем выделяемой памяти зависит от количества вершин. Вам необходимо написать свой метод сериализации таких обьектов, не забыв вызвав метод Serialize базового класса вначале.  
-
-&lt;h5 id=ids&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Идентификаторы обьектов ####
-Идентификаторы генерируются каждый раз при загрузке сцены. Поскольку при создании компилятор размещает обьекты си++ в разные участки памяти нам не нужно заботиться о выдаче уникальных идентификаторов если они вообще понадобятся. Поиск обьектов эффективно реализуется по имени через функцию CObjRegistry::FindObj 
-
-&lt;h5 id=grp&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Группы ####
-Объект может содержать в себе группу обьектов. Для таких объектов должен быть установлен флаг базового класса isGroup.  Кроме того групповой обьект должен быть унаследован от класса Group. Обьект класса Group может содержать обьекты незарегистрированные в реестре обьектов (основной таблице обьектов). 
-
-bool            isGroup; 
-
-#### Элементы PhysicalInfo обьекта  Object ####
- 	 Pnt		 bounds;   // размеры
-	 Pnt		 C0;       //центр
-	 float		 mass; 	   //масса
-	 Pnt		 kurs0;    //курс вектор из точки C0
-	 Pnt              v;       //мгновенная скорость
-&lt;h5 id=mov&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-#### Класс физики CMovement. Силы действующие на обьект типа Object ####
-
-Силы : 
-* сила тяжести на обьекты у которых есть масса (mass&gt;0), 
-* сила трения со стороны поверхности учитывается при расчете движения Vehicle  
-* сила опоры (если обьект на опоре у него выставляется флаг onOpora) 
-* внешняя сила при отскоке по типу упругих шаров 
-
-Движение:
-в классе Ball реализовано качение шара по плоскости в одном направлении
-в классе Vehicle реализовано поступательное движение обьекта.
-
-&lt;h5 id=obj&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
 #### Базовый класс Object. Методы ####
 
 
-Установить имя обьекта, недопускаются повторы. 
+Установить имя обьекта (должно быть уникальное). 
 SetName(std::string str);
 
 Переименовать 
 Rename(std::string str);
 
 Установить имя класса 
 SetClassName(std::string);
 
 SetAddr2this(t_atr&amp; a)
 
 Присвоить значение аттрибуту
 SET(char* attrname, char* val)
 
 Присвоить описание обьекту
 SET_DESCR(string descr);
 
 Задекларировать аттрибут
 SET_ATTR(string name, void* addr, string type, bool bHidden);
 
 Взять аттрибут
 t_atr* GET_ATTR(string name);
 
 Установить метод
 void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
 
 Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
 int   SET_OBJECT(void* this_ptr, char* objname);
 
 Найти обьект в таблице по имени (старый метод)
 static void* GET_OBJECT(char* objname);
 
 Удалить обьект
 static void  DELETE_OBJECT(char* objname);
 
 Вызвать метод обьекта
 int   CALL(char* obname, char* classname, char* methname);	 
 string GetMethName(char* dummy,...);
 
-Для записи аттрибутов в файл
+Записать аттрибут в файл
 string ReadString(CArchive&amp; archive);
 void   WriteString(CArchive&amp; archive, string str);
 
 int    RemoveSignals();
 
 
-// Обычные слоты  
+// Слоты управления 
 virtual void mouse_move(int x, int y){};
 virtual void mouse_wheel(int zDelta){};
 virtual void click_lmb(int state){};	
 virtual void click_rmb(int state){};
 virtual void click_mmb(int state){};
 virtual void key_pressed(int k){};
 
 
 //сюда приходит сигнал апдейта от первого таймера
 virtual void Slot1(CSignal&amp; sig); 
+//сюда приходит апдейт из отдельной нити
 virtual void Slot2(CSignal&amp; sig);
-virtual void Slot3(CSignal&amp; sig);
 virtual void Slot4(CSignal&amp; sig);
 
 // Слюда приходит сообщение
 virtual void MessageSlot(CMessage&amp; msg);
 
 //События
 virtual void OnSelect(){};
 virtual void OnUnselect(){};
 virtual void OnAttrChange(t_atr&amp; a){};
 virtual void OnAttrSelect(t_atr&amp; a){};
 virtual void OnDrag( float x, float y, float z );
 
 
 ### Базовый класс Object. Свойства ###
 
 name;  		    //имя
 classname;  	    //имя класса
 groupname;  	    //имя группового обьекта
 int	 livetime;  //время жизни
 bool	 connected; //соединен с системой сигналов
 
 EntetyInfo	  ei;	// информация о ентети
 vector&lt;t_atr&gt; atrs; 	  // массив аттрибутов
 map&lt;string,int &gt; atrsmap; // таблица аттрибутов
 
 vector&lt;string&gt; expressions;//выражения
 //tagTYPE	 meth_args[1][1]; // параметры функции
 
 bool		 isEntety;     // это сущность мира
 bool		 isNotSaving;  // это не сохраняемый обьект
 bool		 isCanRender;  // этот обьект может быть визуализирован
 int		 isSelected;   // этот обькт выбран в данный момент (0- обьект не выбран,  2 - обьект выбран)
 bool            isGroup;      // эта группа
 bool		 isLoading;   // идет загрузка обьекта
 //bool		 isPhysic;    	
 bool		 onOpora;    // свободно либо на опоре  
 int		 isHidden;   //0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
 bool		 m_Updated;
 
 string		 updatescript;		//скрипт для обновления параметров
 string		 initscript;    	//скрипт для инициализации
 time_t          osCreationTime;	//время создания
 DWORD		 osCreationTimeTicks;   //время в тиках
 bool		 bHideStdAttrs;         // имеет спятанные аттрибуты
 
 
 ------------------------------------------------------------------------
+
+&lt;h5 id=ren&gt;&lt;/h5&gt;
+### Класс RenderObject ###
+------------------------------------------------------------------------
+Обьекты этого класса визуализируются на экране. Другими словами попадают в конвеер рендеринга. 
+
+Интерфейс: 
+class RenderObject : public Object
+{
+    RenderObject();
+    //вызываются из нити рендеринга
+    virtual void Render();
+    virtual void PreRender();
+    virtual void PostRender();
+};
+
+Чтобы сделать визуальный обьект сделайте следующее:
+1. Создайте отдельный класс  
+2. Унаследуйте его от RenderObject
+3. Опишите логику этого класса
+3. Напишите функцию отрисовки обьекта в Render()
+4. Добавте свой обьект через диалог создания обьекта
+5. Сохраните сцену
+
+
+&lt;h5 id=lsc&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Загрузка и сохранение сцены ####
+Для загрузки сцены нужно 3 файла: object.arh classes.arh offset.arh. В файл classes.arh записываются имена классов обьектов, в файл obj.arh записываются данные обьектов, в файл offsets.arh записывается таблица имя оьекта - смещение на начало данных. У обьекта сохраняются все аттрибуты за исключением тех аттрибутов для которых выставлен флаг isNotSaving. 
+
+&lt;h5 id=reload&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Сохранение и восстановление состояния обьекта ####
+Для любого выбранного обьекта можно сохранять его состояние в любой момент времени.
+Потом с помощью кнопки ReloadObj восстановить это сохраненное состояние.
+
+
+&lt;h5 id=nam&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Имена обьектов ####
+Каких либо ограничений на длинну имен обьектов не существует равно как и нет ограничений на символы состовляющие имя обьекта. Единственное требование - имя должно быть уникально. Если при задании имени обьекта возникла коллизия в ячейке таблицы объектов, система атоматически сменит имя добавив к нему окончание в виде первых байт адреса этого обьекта. 
+
+&lt;h5 id=atr&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Аттрибуты обьектов ####
+В текущей версии 1.01 сохраняются все аттрибуты базового класса: дефолтовый размер примерно равен  1.4 кб. Добавление специальных методов Serialize у классов потомков естественно может увеличить размер. Например в случае геометрического обьекта обьем выделяемой памяти зависит от количества вершин. Вам необходимо написать свой метод сериализации таких обьектов, не забыв вызвав метод Serialize базового класса вначале.  
+
+&lt;h5 id=ids&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Идентификаторы обьектов ####
+Идентификаторы генерируются каждый раз при загрузке сцены. Поскольку при создании компилятор размещает обьекты си++ в разные участки памяти нам не нужно заботиться о выдаче уникальных идентификаторов если они вообще понадобятся. Поиск обьектов эффективно реализуется по имени через функцию CObjRegistry::FindObj 
+
+&lt;h5 id=grp&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Группы ####
+Объект может содержать в себе группу обьектов. Для таких объектов должен быть установлен флаг базового класса isGroup.  Кроме того групповой обьект должен быть унаследован от класса Group. Обьект класса Group может содержать обьекты незарегистрированные в реестре обьектов (основной таблице обьектов). 
+
+bool            isGroup; 
+
+#### Элементы PhysicalInfo обьекта  Object ####
+ 	 Pnt		 bounds;   // размеры
+	 Pnt		 C0;       //центр
+	 float		 mass; 	   //масса
+	 Pnt		 kurs0;    //курс вектор из точки C0
+	 Pnt              v;       //мгновенная скорость
+&lt;h5 id=mov&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+#### Класс физики CMovement. Силы действующие на обьект типа Object ####
+
+Силы : 
+* сила тяжести на обьекты у которых есть масса (mass&gt;0), 
+* сила трения со стороны поверхности учитывается при расчете движения Vehicle  
+* сила опоры (если обьект на опоре у него выставляется флаг onOpora) 
+* внешняя сила при отскоке по типу упругих шаров 
+
+Движение:
+в классе Ball реализовано качение шара по плоскости в одном направлении
+в классе Vehicle реализовано поступательное движение обьекта.
+
+&lt;h5 id=obj&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+
 &lt;h5 id=mod&gt;&lt;/h5&gt;
 ##### Режимы работы вьюпорта #####
 MODE_SELECTION - режим выбора обьекта мышью
 MODE_MOVE - режим перемещения мышью
 MODE_SCROLLVIEW - используется для скроллинга вида сверху вдоль осей x и y 
 MODE_PICK - в этом режиме редактор позволяет назначить точку кликом мыши. 
 
 
 ------------------------------------------------------------------------
 &lt;h5 id=sig&gt;&lt;/h5&gt;
 ### Класс сигнала CSignal ###
 
 
 Класс сигнала используется в системе рассылки сигналов.
 Для того чтобы подсоединить обьект к циклу обновления, необходимо вызвать метод базового класса Connect() в конструкторе. По умолчанию задается первый слот (слот апдейта), имя сигнала по умолчанию присваивается в виде "Dest_objname-Src_objname" 
 
 class CSignal 
 {
 public:
 
 	CSignal(Object* dest, int slot_num);
 	CSignal(Object* dest, Object* src,  int slot_num);
 	void SetName(string name){strcpy(Name, name.c_str()); };
 	int Send();   // Немедленная посылка сигнала
 	int Post();   // Запланированная посылка сигнала
 
 	char   Name[255]; // имя сигнала 
 	int    slot_num;  //номер слота
 	void*  data;      // ссылка на произвольные данные
 
 	Object* dest;     // Обьект которому идет сигнал
 	Object* src;      // Обьект от которого идет сигнал
 };
 
 
 &lt;h5 id=atr&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура t_atr.  ###
 Определяет аттрибут обьекта
 
 Тип аттрибута обьекта один из распознаваемых ObjectInspector. Может быть untyped
    Список типов поддерживаемых ObjectInspector
 Обьекты имеют динамический список аттрибутов, которые могут добавлятся в процессе работы программы.
 Например при создании новой точки в кривой появляется новое свойство с именем Pnt1
   
 #### Типы аттрибутов ####
    float 
    + int
    * string
    * selector
    * func
    * GLColor3f 
    * bool
    * Pnt
 
 #### Свойства аттрибутов ####
 min -минимальное зн-е
 max - максимальное зн-е
 step - шаг
 flags - флаги установленные для аттрибута
   
 #### Функции работы с аттрибутами ####
 Hide()
 Ставит флаг isHidden. Прячет аттрибут. Необходимо для функции фильтрации свойств в ObjInspector
 
 Unhide()
 Снимает флаг isHidden. 
 
 Select()
 Ставит флаг isSelected. Для выбранного аттрибута отображается адрес в консоле.
 
 Unselect()
 
 toString()
 Конвертирует значение аттрибута в строку
 
 fromString()
 Парсирует строку в тип аттрибута.
 
 Watch()
 Устанавливает флаг isWatched. Это нужно для просмотра значения аттрибута на экране выводимых переменных. 
 
 isWatched()
 
 ReadOnly()
 Устанавливает флаг isReadOnly. Нужно для защиты от записи аттрибута. Например имя обьекта, поскольку оно занесено в реестр обьектов.
 
 isReadOnly()
 проверяет флаг isReadOnly
 
 NotSaving()
 Устанавливает флаг NotSaving. Это означает что его значение не будет сохраняться в файл при сохранении сцены. 
 
 isNotSaving()
 проверяет флаг isNotSaving()
 
 &lt;h5 id=cam&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Класс Camera #####
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 При запуске мира в нем существует одна камера свободного обзора. 
 Для отображения ортогональных видов применяется тот же класс.
 Активная камера — это та камера которой передается управление мыши, клавиатуры и других устройств ввода. Выбор активной камеры делается кликом по вьюпорту. Камера может быть визуализирована в изображении другой камеры. Камера отображается в другом окне как тетрайдер, основание которого - плоскость проекции виртуального изображения. 
 Управляется камера с помощью клавиш - w,a,s,d направление обзора и движения регулируется мышью. Вектор движения определяется чрез точку lookAt, точкой в которую смотрит камера. Координаты этой точки преобразуются в сферической системе координат взависимости от движений мыши.
 Для более плавного движения камеры рассматривается применение математического аппарата кватернионов. 
 
 &lt;h5 id=mif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс CMainInterface ###
 Определяет начальные действия
 -Инициирует загрузку сцены
 -Создает и разммещает данные обьектов в памяти 
 -Определяет порядок рендеринга обьектов
 
 &lt;h5 id=rnd&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Способы отрисовки моделей ###
 Определяются глобальными флагами flags
 -bShading Шейдинг с наложением материала на полигоны
 -bColorRendering - Используется matid для выбора цвета грань
 -bWire - Режим отображения в виде сеточного каркаса
 -bMayPaintGDI - особый режим отрисовки (нужен для удаленного дисплея)
 
 &lt;h5 id=eif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура EntetyInfo  ###
  характеризуется 
 - файлом модели
 - координатами
 - именем класса обьекта
 - GUID в карте
 - именем
 - типом материала
 - сценарием
 
 
 &lt;h5 id=pif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура PhysicalInfo  ###
 характеризуется:
 -скоростью
 -обьемом(длинами сторон ограничевающего параллепипеда)
 -массой
 -направлением
 
 &lt;h5 id=reg&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Реестр обьектов CObjRegistry ###
 Содержит: 
 Таблицу (objname, EntetyInfo)
 Функции:
 1. Поиск обьектов по имени
 2. Поиск по координатам
 3. Поиск по классу
 
 &lt;h5 id=res&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Реестр ресурсов CResRegistry ###
 Содержит: 
 Таблицу (resname, ResInfo)
 Функции:
 1. Загрузка файлов модели
 2. Загрузка текстур
 3. Загрузка и компиляция шейдеров
 4. Создание новых ресурсов
 5. Поиск по имени ресурса
 6. Обработка исключительных ситуаций при отсутсвии нужного ресурса
 
 
 &lt;h5 id=inp&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс CInput ###
 Перенаправляет действия пользователя обьекту управления.
 Предоставляет двухмерные координаты в экране (вьюпорте OpenGl)
 Предоставляет трехмерные координаты точки в виде "сверху". 
 Содержит включение режима "прилипания" курсора к сетке.
 
 &lt;h5 id=ins&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### ObjInspector ###
 Отображает список свойств обьекта, 
 Изменяет любое свойство не ReadOnly
 Отражает изменение свойства во времени
 Вызывает функции обьекта.
 Плавно меняет свойство в пределах выбранной точности 
 Поддерживает базовые типы: число, строка, флаг
 Поддерживает некоторые специальные типы:
 коллекция строк, вектор, точка, цвет 
 
 &lt;h5 id=spc&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс Space ###
 Описывает пространство. 
 Пространство состоит из набора узловых точек MapPoint. 
 Пространство делится на сектора(Sector) вершины которых представляют собой узловые точки.
 Позволяет осуществить поиск обьектов в окресности некоторой точки.
 Функции мировой системы координат
 Переводы из локальной системы координат в мировую
 Подразумевает деление пространства на отдельные сектора содержащие 
 ссылки на обьекты, которые в нем присутсвуют (целесообразно для больших карт).
 Функции:
 1. Поиск обьектов в окресности некой точки
 Поиск обьектов в зоне
 p = (x / sect_size, y / sect_size, z / sect_size )
 Рассмотрение списков обьетктов 8 секторов узловой точки
 Составление списка секторов зоны ( по умолчанию параллепипед )
 Классы CSector имеют 6 ссылок на соседние сектора (up,down,left,right,front,back)
 
 
 ------------------------------------------------------------------------
 
 ### Класс CSelection. ###
 Реализация механизма выбора обьектов. 
 
 &lt;h5 id=geo&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## Геометрические примитивы и связанная с ними физика ##
 
 
 
 
 &lt;h5 id=bal&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ###  Класс Ball ###
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 
 Класс визуализирующий сферу с физикой мяча 
 
 
 
 &lt;h5 id=lod&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## Загрузка геометрии и материалов из файла формата 3dmax ascii ##
 Для импорта моделей используется формат сцены 3dmax ASE
 http://paulbourke.net/dataformats/ase/
 
 Импорт сцены формата ASE реализован в ascii3d.cpp.
 По спецификации сцены ASE в app5 создаются модели класса GemObject. Внутри GemObject создается агрегированный обьект класса Mesh (полигональная сетка). Каждому полигону присваивается номер matid. Дальше по этому полю возможен цветовой рендеринг в случае отсутсвия текстур. Также в память загружаются материалы. Инициализируются материалы присвоенные полигону, координаты текстур, устанавливается модель меппинга (циллиндрический, планарный, сферический). Импортируются сплайновые обьекты типа Shape.
 
 
 
 &lt;h5 id=ase&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## Класс CAsciiLoader ##
 Класс для загрузки ASE. 
 Создание и правильное размещение обьектов в мире app5.
 
 class CAsciiLoader 
 {
 public:
 	CAsciiLoader();
 	vector&lt;string&gt;	info;
 	std::string  filename;
 	tm      time;
 	int     version;  
 	void    ProcessMesh();
 	char*   NextLine();
 	void    Reset();	
 	void    AssignMt()	
 	void    ResetFlags()
 	//~CAsciiLoader();
 	int LoadASCIIIFile(char* ASC3d_filename);
 	void GetInfo();
 
 };
 
 &lt;h5 id=gem&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ###  Класс GemObject ###
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 
   Copy(Object* A)
   ComputeC0()   | поиск геометрического центра обьекта 
   SetNumFaces() | Установить количество полигонов
   SetNumVert()  | Установить количество вершин
   CenterModel() | Пересчитывает координаты обьекта из мировых в локальные
   Serialize()   | Метод реализирующий бинарный экспорт данных обьекта 
   LoadMesh(string goname); // для обьектов типа Ссылка (ссылка на данные со своими pos, rot, scale и тд))
   FillArrays();
   Render();
 
 
 
 ###  Стуркура определяющая вершину сетки ###
 struct Vertex
 
 ###  Стуркура определяющая точку сплайна ###
 struct Vertex_knot
 {
     int idx;
     Pnt c;
     bool knot; // узловая точка или интерпол
 };
 
 ###  Стуркура определяющая грань сетки  ###
 typedef struct TFace
 {
     Vertex vertices[4]; // полигон состоит из 4 точек
     Pnt facetNormal;   // нормаль полигона
     char matid;        // номер материала 
 }TFace;
 
 ### Групповой обьект ###
 class GroupObject: public Object
 {
 public: 
 	string NODE_NAME;
     string HELPER_CLASS;
     Pnt BOUNDINGBOX_MIN;
     Pnt BOUNDINGBOX_MAX;
     Node_TM nodetm;
 };
 
 
 ### Cплайновый обьект ###
 class ShapeObject : public Object
 {
 public:
     DECLARE_SERIAL( ShapeObject )
     string NODE_NAME;
     string NODE_PARENT;
     Node_TM modetm;
     int SHAPE_LINECOUNT;
     vector&lt;ShapeLine&gt; shapelines;	
 
 
 &lt;h5 id=veh&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс CVehicle ##
 Содержит модель движения автомобиля, анимацию автомобиля (анимируются колеса). 
 Обьекту этого класса может быть присвоена траектория класса Curve. 
 Машину можно перемещать в начало траектории.
 Управление клавишами o,k,l,; 
 При движении на автомобиль кроме силы тяги действует сила тяжести и сила трения.
 Когда машина управляется пользователем на траектории отображаются ближайшая точка.
 Эта точка окрашивается в зеленый цвет если машина движется по направлению к концу траектории и в синиий цвет - если наоборот.
 
 
 &lt;h5 id=cur&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс Curve ##
 
 Содержит визуальный сплайн Эрмита с возможностью редактировать контрольные точки, перемещать их и регулировать степень кривизны (производные в контрольных точках).
 В Curve добавлена Спираль задается двумя радиусами и высотой
 В Curve добавлена Дуга задается двумя точками и высотой
 В Curve добавлен альтернативный алгоритм сплайна Кочана-Бартельса 
 
 
 &lt;h5 id=dem&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс DemoRecorder ##
 
 Деморекордер позволяет записывать положения обьектов и другие параметры 
 в данный момент времени. Или на протяжении периода времени.
 
 -------------------------------------------------------------------------
 Возможность применения управления поверх записанных параметров.
 -------------------------------------------------------------------------
 Например запретить поворот колес. Запретить изменение скорости, задать параметр const.
 Тогда прямое обращение к аттрибуту нужно заменить косвенным.  
 Как это согласовать с контроллером, который присвоен аттрибуту.
 
 &lt;h5 id=demo.seq&gt;&lt;/h5&gt;
 -------------------------------------------------------------------------
 В какой последовательности обрабатывается воспроизведение и запись демок?
 -------------------------------------------------------------------------
 Вызовы функций осуществляются в gtimer.Timer2() при каждом тике 
 
 1. DemoRecorder::Slot1() - воспроизведение
 2. Обработка контроллеров всех параметров
 3. Все Slot1 всех обьектов
 4. DemoRecorder::Slot2() - запись
 
 &lt;h5 id=demo.file.format&gt;&lt;/h5&gt;
 --------------------------------------------------
-&lt;b&gt;Какой формат записи файла демо? &lt;/b&gt;
+&lt;b&gt;Формат записи файла демо &lt;/b&gt;
 --------------------------------------------------
 Для каждого обьекта свой файл следующего содержания
 Формат имени файла: objname_time.mudem
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:58:50 -0000</pubDate><guid>https://sourceforge.neta0cbb0b517e6b50a80af650ace7d25dff1657a1c</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v120 
+++ v121 
@@ -42,7 +42,8 @@
     * &lt;a href="app5_core/#ase"&gt;Класс CAsciiLoader&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Класс GemObject&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая вершину сетки Vertex&lt;/a&gt;
-    * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая полигон TFace&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая грань сетки TFace&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая точку сплайна Vertex_knot&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Групповой обьект GroupObject&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Сплайновый обьект ShapeObject &lt;/a&gt;
 
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:36:06 -0000</pubDate><guid>https://sourceforge.netd25305bcbff2857e0ca0b68c7adc36df2fe35ecd</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v119 
+++ v120 
@@ -591,30 +591,38 @@
 
 
 
-//Стуркура определяющая вершину сетки
+###  Стуркура определяющая вершину сетки ###
 struct Vertex
 
-//Грань сетки 
+###  Стуркура определяющая точку сплайна ###
+struct Vertex_knot
+{
+    int idx;
+    Pnt c;
+    bool knot; // узловая точка или интерпол
+};
+
+###  Стуркура определяющая грань сетки  ###
 typedef struct TFace
 {
     Vertex vertices[4]; // полигон состоит из 4 точек
     Pnt facetNormal;   // нормаль полигона
     char matid;        // номер материала 
 }TFace;
 
-// групповой обьект
+### Групповой обьект ###
 class GroupObject: public Object
 {
 public: 
 	string NODE_NAME;
     string HELPER_CLASS;
     Pnt BOUNDINGBOX_MIN;
     Pnt BOUNDINGBOX_MAX;
     Node_TM nodetm;
 };
 
 
-//сплайновый обьект
+### Cплайновый обьект ###
 class ShapeObject : public Object
 {
 public:
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:33:25 -0000</pubDate><guid>https://sourceforge.netaea8cb52036e10a43d3e5df59dff8a80ecb8b26a</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v118 
+++ v119 
@@ -4,594 +4,648 @@
 * &lt;a href="app5_core/#sel"&gt;Выбор обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#selv"&gt;Выбор визуального обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#fil"&gt;Фильтрация списка обьектов&lt;/a&gt;
-
-&lt;br/&gt;
+&lt;br/&gt;
 * &lt;a href="app5_core/#std"&gt;Стандартные типы обьектов в версии 1.01&lt;/a&gt;
-&lt;br/&gt;
+
 
 * &lt;a href="app5_core/#mon"&gt;Мониторинг переменных&lt;/a&gt;
 * &lt;a href="app5_core/#act"&gt;Действия над виртуальными обьектами&lt;/a&gt;
 * &lt;a href="app5_core/#bas"&gt;Базовый класс Object&lt;/a&gt;
 * &lt;a href="app5_core/#ren"&gt;Класс RenderObject&lt;/a&gt;
 * &lt;a href="app5_core/#lsc"&gt;Загрузка и сохранение сцены&lt;/a&gt;
 * &lt;a href="app5_core/#reload"&gt;Сохранение и восстановление состояния обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#nam"&gt;Имена обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#atr"&gt;Аттрибуты обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#ids"&gt;Идентификаторы обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#grp"&gt;Группы&lt;/a&gt;
 * &lt;a href="app5_core/#obj"&gt;Базовый класс Object. Методы&lt;/a&gt;
 * &lt;a href="app5_core/#mov"&gt;Класс физики CMovement. Силы действующие на обьект типа Object&lt;/a&gt;
 * &lt;a href="app5_core/#spc"&gt;Класс пространство Space&lt;/a&gt;
 * &lt;a href="app5_core/#cam"&gt;Класс Камера&lt;/a&gt;
 * &lt;a href="app5_core/#mod"&gt;Режимы работы вьюпорта&lt;/a&gt;
 * &lt;a href="app5_core/#sig"&gt;Класс сигнала CSignal&lt;/a&gt;
 * &lt;a href="app5_core/#atr"&gt;Структура t_atr.&lt;/a&gt;
 * &lt;a href="app5_core/#mif"&gt;Класс CMainInterface&lt;/a&gt;
 * &lt;a href="app5_core/#rnd"&gt;Способы отрисовки моделей&lt;/a&gt;
 * &lt;a href="app5_core/#eif"&gt;Структура EntetyInfo&lt;/a&gt;
 * &lt;a href="app5_core/#pif"&gt;Структура PhysicalInfo&lt;/a&gt;
 * &lt;a href="app5_core/#reg"&gt;Реестр обьектов CObjRegistry&lt;/a&gt;
 * &lt;a href="app5_core/#res"&gt;Реестр ресурсов CResRegistry&lt;/a&gt;
 * &lt;a href="app5_core/#inp"&gt;Класс CInput&lt;/a&gt;
 * &lt;a href="app5_core/#ins"&gt;Инспектор обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#geo"&gt;Геометрические примитивы и связанная с ними физика&lt;/a&gt;
 * &lt;a href="app5_core/#bal"&gt;Класс Ball&lt;/a&gt;
 
 &lt;br/&gt;
 
 * &lt;a href="app5_core/#lod"&gt;Загрузка геометрии и материалов из файла формата 3dmax ASE&lt;/a&gt;
+    * &lt;a href="app5_core/#ase"&gt;Класс CAsciiLoader&lt;/a&gt;
     * &lt;a href="app5_core/#gem"&gt;Класс GemObject&lt;/a&gt;
-    * &lt;a href="app5_core/#cur"&gt;Класс Curve&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая вершину сетки Vertex&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Стуркура определяющая полигон TFace&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Групповой обьект GroupObject&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Сплайновый обьект ShapeObject &lt;/a&gt;
 
 * &lt;a href="app5_core/#veh"&gt;Класс CVehicle&lt;/a&gt;
+* &lt;a href="app5_core/#cur"&gt;Класс Curve&lt;/a&gt;
 
 &lt;br/&gt;
 
 * &lt;a href="app5_core/#dem"&gt;Запись демо&lt;/a&gt;
     * &lt;a href="app5_core/#dem.seq"&gt;В какой последовательности обрабатывается воспроизведение и запись демок?&lt;/a&gt;
     * &lt;a href="app5_core/#dem"&gt;Возможность применения управления поверх записанных параметров.&lt;/a&gt;
     * &lt;a href="app5_core/#demo.file.format"&gt;Формат записи файла демо&lt;/a&gt;
     * &lt;a href="app5_core/#demo.history.view"&gt;Как просматривать историю записей? &lt;/a&gt;
     * &lt;a href="app5_core/#demo.recording.process"&gt;Пользовательский интерфейс. Как записывать демо.&lt;/a&gt;    
     * &lt;a href="app5_core/#demo.recording.process"&gt;Пользовательский интерфейс. Как проигрывать демо.&lt;/a&gt;
     * &lt;a href="app5_core/#demorecorder.interface"&gt;Класс DemoRecorder&lt;/a&gt;
     * &lt;a href="app5_core/#demorecorder.interface"&gt;Класс Demo&lt;/a&gt;
 +
 * &lt;a href="app5_core/#vm"&gt;Cправка по виртуальной машине(необработанная под wiki)&lt;/a&gt;
 
 Классы реализация которых еще не закончена
 
 &lt;a href="vehicle/#vm"&gt;Отдельная страница. Алгоритм ухода от столкновения реализация класса CVehicle &lt;/a&gt;
 
 # Интерфейс пользователя #
 [[img src=app5_main_window_min.jpg alt=foobar]]
 
 #####&lt;p align="center"&gt;Рис1. вид главного окна app5.&lt;/p&gt;#####
 
 &lt;h5 id=cro&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Создание обьекта  #####
 Создать обьект можно с помощью кнопки Add, либо c помощью комадны create_obj. 
 
 &lt;h5 id=sel&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Выбор обьекта  #####
 Выбор обьекта осуществляется через список ObjList. Список поддерживает фильтрацию по различным полям. При выборе обьекта он переходит в состояние выбран и его ссылка появляется в списке выбранных обьектов обьекта CSelection.
 
 &lt;h5 id=selv&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Выбор визуального обьекта  #####
 Выбор обьекта можно делать щелкнув по нему мышью. 
 Выбор нескольких обьектов осуществляется с клавишей shift.
 
 &lt;h5 id=fil&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Фильтрация списка обьектов #####
 Может проходить по следующим полям:
 1. По имени в поле контекст(рис 1). Можно задавать несколько имен через пробел 
 2. По классу
 3. По группе
 
 &lt;h5 id=std&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Стандартные типы обьектов в версии 1.01 #####
 
 Следующие типы обьектов являются стандартными и различаются в версии 1.01
 
 * Полигональная сетка (GemObject)
 * Геометрический примитив (сфера, куб, цилиндр, пирамида, обьект Кассини, обьект вращения)
 * Кривые (спираль, дуга, сплайн, кривая Мебиуса)
 * Машины
 * Помошники (точки, стрелки)
 * Группы (содержащие ссылки на другие обьекты)
 * Несгрупированные
 
 &lt;h5 id=act&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Действия над виртуальными обьектами  #####
 Видимые визуальные обьекты можно поворачивать, масштабировать и перемещать в пределах сцены и применять к ним различные функции. Обьекты можно прятать и проявлять. Их можно обьединять в группу и перемещать эту группу. Перемещение обьекта мышью можно ограничить по одной оси, нажав кнопки x,y,z . Параметры обьекта меняются через инспектор обьектов.
 
 &lt;h5 id=mon&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Мониторинг переменных #####
 Любой аттрибут можно вывести на экран обновления строчкой watch("objname","attrname")
 У экрана вывода переменных есть режим surviveMode, означающий что выводится только то что обновляет свое значение в течении N циклов апдейта. Если переменная не меняется она автоматически удаляется из мониторинга. Также можно выводить любую переменную из c++ вызвав pscr.upd(var). За мониторинг сейчас отвечает отдельное прилодение "Монитор app5".
 
 
 &lt;h5 id=bas&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Базовый класс Object ###
 Функции базового объекта можно вызвать в ObjectInspector, интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователью  необходимо создать метод Declare. в котором описать каждый нужный метод или свойство си++ класса и передать адрес функции SET_ATTR или SET_METHOD.
 Каждый обьект может быть сохранен в файл сцены. При отсутствии специальнорго способа сохранения у потомков базового класса, сохраняются только свойства базового класса. Свойство можно пометить как isNotSaving тогда оно не будет сохраняться в файл сцены. 
 
 &lt;h5 id=ren&gt;&lt;/h5&gt;
 ### Класс RenderObject ###
 ------------------------------------------------------------------------
 Обьекты этого класса визуализируются на экране. 
 Другими словами они попадают в конвеер рендеринга.
 Чтобы сделать визуальный обьект сделайте следующее:
 1. Создайте отдельный класс  
 2. Унаследуйте его от RenderObject
 3. Опишите логику этого класса
 3. Напишите функцию отрисовки обьекта в Render()
 4. Добавте свой обьект через диалог создания обьекта
 
 &lt;h5 id=lsc&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Загрузка и сохранение сцены ####
 Для загрузки сцены нужно 3 файла: object.arh classes.arh offset.arh. В файл classes.arh записываются имена классов обьектов, в файл obj.arh записываются данные обьектов, в файл offsets.arh записывается таблица имя оьекта - смещение на начало данных. У обьекта сохраняются все аттрибуты за исключением тех аттрибутов для которых выставлен флаг isNotSaving. 
 
 &lt;h5 id=reload&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Сохранение и восстановление состояния обьекта ####
 Для любого выбранного обьекта можно сохранять его состояние в любой момент времени.
 Потом с помощью кнопки ReloadObj восстановить это сохраненное состояние.
 
 
 &lt;h5 id=nam&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Имена обьектов ####
 Каких либо ограничений на длинну имен обьектов не существует равно как и нет ограничений на символы состовляющие имя обьекта. Единственное требование - имя должно быть уникально. Если при задании имени обьекта возникла коллизия в ячейке таблицы объектов, система атоматически сменит имя добавив к нему окончание в виде первых байт адреса этого обьекта. 
 
 &lt;h5 id=atr&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Аттрибуты обьектов ####
 В текущей версии 1.01 сохраняются все аттрибуты базового класса: дефолтовый размер примерно равен  1.4 кб. Добавление специальных методов Serialize у классов потомков естественно может увеличить размер. Например в случае геометрического обьекта обьем выделяемой памяти зависит от количества вершин. Вам необходимо написать свой метод сериализации таких обьектов, не забыв вызвав метод Serialize базового класса вначале.  
 
 &lt;h5 id=ids&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Идентификаторы обьектов ####
 Идентификаторы генерируются каждый раз при загрузке сцены. Поскольку при создании компилятор размещает обьекты си++ в разные участки памяти нам не нужно заботиться о выдаче уникальных идентификаторов если они вообще понадобятся. Поиск обьектов эффективно реализуется по имени через функцию CObjRegistry::FindObj 
 
 &lt;h5 id=grp&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Группы ####
 Объект может содержать в себе группу обьектов. Для таких объектов должен быть установлен флаг базового класса isGroup.  Кроме того групповой обьект должен быть унаследован от класса Group. Обьект класса Group может содержать обьекты незарегистрированные в реестре обьектов (основной таблице обьектов). 
 
 bool            isGroup; 
 
 #### Элементы PhysicalInfo обьекта  Object ####
  	 Pnt		 bounds;   // размеры
 	 Pnt		 C0;       //центр
 	 float		 mass; 	   //масса
 	 Pnt		 kurs0;    //курс вектор из точки C0
 	 Pnt              v;       //мгновенная скорость
 &lt;h5 id=mov&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Класс физики CMovement. Силы действующие на обьект типа Object ####
 
 Силы : 
 * сила тяжести на обьекты у которых есть масса (mass&gt;0), 
 * сила трения со стороны поверхности учитывается при расчете движения Vehicle  
 * сила опоры (если обьект на опоре у него выставляется флаг onOpora) 
 * внешняя сила при отскоке по типу упругих шаров 
 
 Движение:
 в классе Ball реализовано качение шара по плоскости в одном направлении
 в классе Vehicle реализовано поступательное движение обьекта.
 
 &lt;h5 id=obj&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Базовый класс Object. Методы ####
 
 
 Установить имя обьекта, недопускаются повторы. 
 SetName(std::string str);
 
 Переименовать 
 Rename(std::string str);
 
 Установить имя класса 
 SetClassName(std::string);
 
 SetAddr2this(t_atr&amp; a)
 
 Присвоить значение аттрибуту
 SET(char* attrname, char* val)
 
 Присвоить описание обьекту
 SET_DESCR(string descr);
 
 Задекларировать аттрибут
 SET_ATTR(string name, void* addr, string type, bool bHidden);
 
 Взять аттрибут
 t_atr* GET_ATTR(string name);
 
 Установить метод
 void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
 
 Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
 int   SET_OBJECT(void* this_ptr, char* objname);
 
 Найти обьект в таблице по имени (старый метод)
 static void* GET_OBJECT(char* objname);
 
 Удалить обьект
 static void  DELETE_OBJECT(char* objname);
 
 Вызвать метод обьекта
 int   CALL(char* obname, char* classname, char* methname);	 
 string GetMethName(char* dummy,...);
 
 Для записи аттрибутов в файл
 string ReadString(CArchive&amp; archive);
 void   WriteString(CArchive&amp; archive, string str);
 
 int    RemoveSignals();
 
 
 // Обычные слоты  
 virtual void mouse_move(int x, int y){};
 virtual void mouse_wheel(int zDelta){};
 virtual void click_lmb(int state){};	
 virtual void click_rmb(int state){};
 virtual void click_mmb(int state){};
 virtual void key_pressed(int k){};
 
 
 //сюда приходит сигнал апдейта от первого таймера
 virtual void Slot1(CSignal&amp; sig); 
 virtual void Slot2(CSignal&amp; sig);
 virtual void Slot3(CSignal&amp; sig);
 virtual void Slot4(CSignal&amp; sig);
 
 // Слюда приходит сообщение
 virtual void MessageSlot(CMessage&amp; msg);
 
 //События
 virtual void OnSelect(){};
 virtual void OnUnselect(){};
 virtual void OnAttrChange(t_atr&amp; a){};
 virtual void OnAttrSelect(t_atr&amp; a){};
 virtual void OnDrag( float x, float y, float z );
 
 
 ### Базовый класс Object. Свойства ###
 
 name;  		    //имя
 classname;  	    //имя класса
 groupname;  	    //имя группового обьекта
 int	 livetime;  //время жизни
 bool	 connected; //соединен с системой сигналов
 
 EntetyInfo	  ei;	// информация о ентети
 vector&lt;t_atr&gt; atrs; 	  // массив аттрибутов
 map&lt;string,int &gt; atrsmap; // таблица аттрибутов
 
 vector&lt;string&gt; expressions;//выражения
 //tagTYPE	 meth_args[1][1]; // параметры функции
 
 bool		 isEntety;     // это сущность мира
 bool		 isNotSaving;  // это не сохраняемый обьект
 bool		 isCanRender;  // этот обьект может быть визуализирован
 int		 isSelected;   // этот обькт выбран в данный момент (0- обьект не выбран,  2 - обьект выбран)
 bool            isGroup;      // эта группа
 bool		 isLoading;   // идет загрузка обьекта
 //bool		 isPhysic;    	
 bool		 onOpora;    // свободно либо на опоре  
 int		 isHidden;   //0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
 bool		 m_Updated;
 
 string		 updatescript;		//скрипт для обновления параметров
 string		 initscript;    	//скрипт для инициализации
 time_t          osCreationTime;	//время создания
 DWORD		 osCreationTimeTicks;   //время в тиках
 bool		 bHideStdAttrs;         // имеет спятанные аттрибуты
 
 
 ------------------------------------------------------------------------
 &lt;h5 id=mod&gt;&lt;/h5&gt;
 ##### Режимы работы вьюпорта #####
 MODE_SELECTION - режим выбора обьекта мышью
 MODE_MOVE - режим перемещения мышью
 MODE_SCROLLVIEW - используется для скроллинга вида сверху вдоль осей x и y 
 MODE_PICK - в этом режиме редактор позволяет назначить точку кликом мыши. 
 
 
 ------------------------------------------------------------------------
 &lt;h5 id=sig&gt;&lt;/h5&gt;
 ### Класс сигнала CSignal ###
 
 
 Класс сигнала используется в системе рассылки сигналов.
 Для того чтобы подсоединить обьект к циклу обновления, необходимо вызвать метод базового класса Connect() в конструкторе. По умолчанию задается первый слот (слот апдейта), имя сигнала по умолчанию присваивается в виде "Dest_objname-Src_objname" 
 
 class CSignal 
 {
 public:
 
 	CSignal(Object* dest, int slot_num);
 	CSignal(Object* dest, Object* src,  int slot_num);
 	void SetName(string name){strcpy(Name, name.c_str()); };
 	int Send();   // Немедленная посылка сигнала
 	int Post();   // Запланированная посылка сигнала
 
 	char   Name[255]; // имя сигнала 
 	int    slot_num;  //номер слота
 	void*  data;      // ссылка на произвольные данные
 
 	Object* dest;     // Обьект которому идет сигнал
 	Object* src;      // Обьект от которого идет сигнал
 };
 
 
 &lt;h5 id=atr&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура t_atr.  ###
 Определяет аттрибут обьекта
 
 Тип аттрибута обьекта один из распознаваемых ObjectInspector. Может быть untyped
    Список типов поддерживаемых ObjectInspector
 Обьекты имеют динамический список аттрибутов, которые могут добавлятся в процессе работы программы.
 Например при создании новой точки в кривой появляется новое свойство с именем Pnt1
   
 #### Типы аттрибутов ####
    float 
    + int
    * string
    * selector
    * func
    * GLColor3f 
    * bool
    * Pnt
 
 #### Свойства аттрибутов ####
 min -минимальное зн-е
 max - максимальное зн-е
 step - шаг
 flags - флаги установленные для аттрибута
   
 #### Функции работы с аттрибутами ####
 Hide()
 Ставит флаг isHidden. Прячет аттрибут. Необходимо для функции фильтрации свойств в ObjInspector
 
 Unhide()
 Снимает флаг isHidden. 
 
 Select()
 Ставит флаг isSelected. Для выбранного аттрибута отображается адрес в консоле.
 
 Unselect()
 
 toString()
 Конвертирует значение аттрибута в строку
 
 fromString()
 Парсирует строку в тип аттрибута.
 
 Watch()
 Устанавливает флаг isWatched. Это нужно для просмотра значения аттрибута на экране выводимых переменных. 
 
 isWatched()
 
 ReadOnly()
 Устанавливает флаг isReadOnly. Нужно для защиты от записи аттрибута. Например имя обьекта, поскольку оно занесено в реестр обьектов.
 
 isReadOnly()
 проверяет флаг isReadOnly
 
 NotSaving()
 Устанавливает флаг NotSaving. Это означает что его значение не будет сохраняться в файл при сохранении сцены. 
 
 isNotSaving()
 проверяет флаг isNotSaving()
 
 &lt;h5 id=cam&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Класс Camera #####
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 При запуске мира в нем существует одна камера свободного обзора. 
 Для отображения ортогональных видов применяется тот же класс.
 Активная камера — это та камера которой передается управление мыши, клавиатуры и других устройств ввода. Выбор активной камеры делается кликом по вьюпорту. Камера может быть визуализирована в изображении другой камеры. Камера отображается в другом окне как тетрайдер, основание которого - плоскость проекции виртуального изображения. 
 Управляется камера с помощью клавиш - w,a,s,d направление обзора и движения регулируется мышью. Вектор движения определяется чрез точку lookAt, точкой в которую смотрит камера. Координаты этой точки преобразуются в сферической системе координат взависимости от движений мыши.
 Для более плавного движения камеры рассматривается применение математического аппарата кватернионов. 
 
 &lt;h5 id=mif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс CMainInterface ###
 Определяет начальные действия
 -Инициирует загрузку сцены
 -Создает и разммещает данные обьектов в памяти 
 -Определяет порядок рендеринга обьектов
 
 &lt;h5 id=rnd&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Способы отрисовки моделей ###
 Определяются глобальными флагами flags
 -bShading Шейдинг с наложением материала на полигоны
 -bColorRendering - Используется matid для выбора цвета грань
 -bWire - Режим отображения в виде сеточного каркаса
 -bMayPaintGDI - особый режим отрисовки (нужен для удаленного дисплея)
 
 &lt;h5 id=eif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура EntetyInfo  ###
  характеризуется 
 - файлом модели
 - координатами
 - именем класса обьекта
 - GUID в карте
 - именем
 - типом материала
 - сценарием
 
 
 &lt;h5 id=pif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура PhysicalInfo  ###
 характеризуется:
 -скоростью
 -обьемом(длинами сторон ограничевающего параллепипеда)
 -массой
 -направлением
 
 &lt;h5 id=reg&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Реестр обьектов CObjRegistry ###
 Содержит: 
 Таблицу (objname, EntetyInfo)
 Функции:
 1. Поиск обьектов по имени
 2. Поиск по координатам
 3. Поиск по классу
 
 &lt;h5 id=res&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Реестр ресурсов CResRegistry ###
 Содержит: 
 Таблицу (resname, ResInfo)
 Функции:
 1. Загрузка файлов модели
 2. Загрузка текстур
 3. Загрузка и компиляция шейдеров
 4. Создание новых ресурсов
 5. Поиск по имени ресурса
 6. Обработка исключительных ситуаций при отсутсвии нужного ресурса
 
 
 &lt;h5 id=inp&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс CInput ###
 Перенаправляет действия пользователя обьекту управления.
 Предоставляет двухмерные координаты в экране (вьюпорте OpenGl)
 Предоставляет трехмерные координаты точки в виде "сверху". 
 Содержит включение режима "прилипания" курсора к сетке.
 
 &lt;h5 id=ins&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### ObjInspector ###
 Отображает список свойств обьекта, 
 Изменяет любое свойство не ReadOnly
 Отражает изменение свойства во времени
 Вызывает функции обьекта.
 Плавно меняет свойство в пределах выбранной точности 
 Поддерживает базовые типы: число, строка, флаг
 Поддерживает некоторые специальные типы:
 коллекция строк, вектор, точка, цвет 
 
 &lt;h5 id=spc&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс Space ###
 Описывает пространство. 
 Пространство состоит из набора узловых точек MapPoint. 
 Пространство делится на сектора(Sector) вершины которых представляют собой узловые точки.
 Позволяет осуществить поиск обьектов в окресности некоторой точки.
 Функции мировой системы координат
 Переводы из локальной системы координат в мировую
 Подразумевает деление пространства на отдельные сектора содержащие 
 ссылки на обьекты, которые в нем присутсвуют (целесообразно для больших карт).
 Функции:
 1. Поиск обьектов в окресности некой точки
 Поиск обьектов в зоне
 p = (x / sect_size, y / sect_size, z / sect_size )
 Рассмотрение списков обьетктов 8 секторов узловой точки
 Составление списка секторов зоны ( по умолчанию параллепипед )
 Классы CSector имеют 6 ссылок на соседние сектора (up,down,left,right,front,back)
 
 
 ------------------------------------------------------------------------
 
 ### Класс CSelection. ###
 Реализация механизма выбора обьектов. 
 
 &lt;h5 id=geo&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## Геометрические примитивы и связанная с ними физика ##
 
+
+
+
+&lt;h5 id=bal&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+###  Класс Ball ###
+&lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
+	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
+
+Класс визуализирующий сферу с физикой мяча 
+
+
+
+&lt;h5 id=lod&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+## Загрузка геометрии и материалов из файла формата 3dmax ascii ##
+Для импорта моделей используется формат сцены 3dmax ASE
+http://paulbourke.net/dataformats/ase/
+
+Импорт сцены формата ASE реализован в ascii3d.cpp.
+По спецификации сцены ASE в app5 создаются модели класса GemObject. Внутри GemObject создается агрегированный обьект класса Mesh (полигональная сетка). Каждому полигону присваивается номер matid. Дальше по этому полю возможен цветовой рендеринг в случае отсутсвия текстур. Также в память загружаются материалы. Инициализируются материалы присвоенные полигону, координаты текстур, устанавливается модель меппинга (циллиндрический, планарный, сферический). Импортируются сплайновые обьекты типа Shape.
+
+
+
+&lt;h5 id=ase&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
+## Класс CAsciiLoader ##
+Класс для загрузки ASE. 
+Создание и правильное размещение обьектов в мире app5.
+
+class CAsciiLoader 
+{
+public:
+	CAsciiLoader();
+	vector&lt;string&gt;	info;
+	std::string  filename;
+	tm      time;
+	int     version;  
+	void    ProcessMesh();
+	char*   NextLine();
+	void    Reset();	
+	void    AssignMt()	
+	void    ResetFlags()
+	//~CAsciiLoader();
+	int LoadASCIIIFile(char* ASC3d_filename);
+	void GetInfo();
+
+};
+
+&lt;h5 id=gem&gt;&lt;/h5&gt;
+------------------------------------------------------------------------
 ###  Класс GemObject ###
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 
-
-&lt;b&gt;Методы:&lt;/b&gt;
-
+  Copy(Object* A)
   ComputeC0()   | поиск геометрического центра обьекта 
   SetNumFaces() | Установить количество полигонов
   SetNumVert()  | Установить количество вершин
   CenterModel() | Пересчитывает координаты обьекта из мировых в локальные
   Serialize()   | Метод реализирующий бинарный экспорт данных обьекта 
+  LoadMesh(string goname); // для обьектов типа Ссылка (ссылка на данные со своими pos, rot, scale и тд))
+  FillArrays();
+  Render();
+
 
 
 //Стуркура определяющая вершину сетки
 struct Vertex
 
 //Грань сетки 
 typedef struct TFace
 {
     Vertex vertices[4]; // полигон состоит из 4 точек
     Pnt facetNormal;   // нормаль полигона
     char matid;        // номер материала 
 }TFace;
 
-
-
-&lt;h5 id=bal&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-###  Класс Ball ###
-&lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
-	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
-
-Класс визуализирующий сферу с физикой мяча 
+// групповой обьект
+class GroupObject: public Object
+{
+public: 
+	string NODE_NAME;
+    string HELPER_CLASS;
+    Pnt BOUNDINGBOX_MIN;
+    Pnt BOUNDINGBOX_MAX;
+    Node_TM nodetm;
+};
+
+
+//сплайновый обьект
+class ShapeObject : public Object
+{
+public:
+    DECLARE_SERIAL( ShapeObject )
+    string NODE_NAME;
+    string NODE_PARENT;
+    Node_TM modetm;
+    int SHAPE_LINECOUNT;
+    vector&lt;ShapeLine&gt; shapelines;	
 
 
 &lt;h5 id=veh&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс CVehicle ##
 Содержит модель движения автомобиля, анимацию автомобиля (анимируются колеса). 
 Обьекту этого класса может быть присвоена траектория класса Curve. 
 Машину можно перемещать в начало траектории.
 Управление клавишами o,k,l,; 
 При движении на автомобиль кроме силы тяги действует сила тяжести и сила трения.
 Когда машина управляется пользователем на траектории отображаются ближайшая точка.
 Эта точка окрашивается в зеленый цвет если машина движется по направлению к концу траектории и в синиий цвет - если наоборот.
 
 
 &lt;h5 id=cur&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс Curve ##
 
 Содержит визуальный сплайн Эрмита с возможностью редактировать контрольные точки, перемещать их и регулировать степень кривизны (производные в контрольных точках).
 В Curve добавлена Спираль задается двумя радиусами и высотой
 В Curve добавлена Дуга задается двумя точками и высотой
 В Curve добавлен альтернативный алгоритм сплайна Кочана-Бартельса 
-
-
-
-&lt;h5 id=lod&gt;&lt;/h5&gt;
-------------------------------------------------------------------------
-## Загрузка геометрии и материалов из файла формата 3dmax ascii ##
-Для импорта моделей используется формат сцены 3dmax ASE
-http://paulbourke.net/dataformats/ase/
-
-Импорт сцены формата ASE реализован в ascii3d.cpp.
-По спецификации сцены ASE в app5 создаются модели класса GemObject. Внутри GemObject создается агрегированный обьект класса Mesh (полигональная сетка). Каждому полигону присваивается номер matid. Дальше по этому полю возможен цветовой рендеринг в случае отсутсвия текстур. Также в память загружаются материалы. Инициализируются материалы присвоенные полигону, координаты текстур, устанавливается модель меппинга (циллиндрический, планарный, сферический). Импортируются сплайновые обьекты типа Shape.
-
-
-
-
-
 
 
 &lt;h5 id=dem&gt;&lt;/h5&gt;
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:29:30 -0000</pubDate><guid>https://sourceforge.netc520f683c968cd5b382e2fcb3d392d5fe91e8b59</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v117 
+++ v118 
@@ -4,38 +4,46 @@
 * &lt;a href="app5_core/#sel"&gt;Выбор обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#selv"&gt;Выбор визуального обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#fil"&gt;Фильтрация списка обьектов&lt;/a&gt;
+
+&lt;br/&gt;
 * &lt;a href="app5_core/#std"&gt;Стандартные типы обьектов в версии 1.01&lt;/a&gt;
+&lt;br/&gt;
+
 * &lt;a href="app5_core/#mon"&gt;Мониторинг переменных&lt;/a&gt;
 * &lt;a href="app5_core/#act"&gt;Действия над виртуальными обьектами&lt;/a&gt;
 * &lt;a href="app5_core/#bas"&gt;Базовый класс Object&lt;/a&gt;
 * &lt;a href="app5_core/#ren"&gt;Класс RenderObject&lt;/a&gt;
 * &lt;a href="app5_core/#lsc"&gt;Загрузка и сохранение сцены&lt;/a&gt;
 * &lt;a href="app5_core/#reload"&gt;Сохранение и восстановление состояния обьекта&lt;/a&gt;
 * &lt;a href="app5_core/#nam"&gt;Имена обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#atr"&gt;Аттрибуты обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#ids"&gt;Идентификаторы обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#grp"&gt;Группы&lt;/a&gt;
 * &lt;a href="app5_core/#obj"&gt;Базовый класс Object. Методы&lt;/a&gt;
 * &lt;a href="app5_core/#mov"&gt;Класс физики CMovement. Силы действующие на обьект типа Object&lt;/a&gt;
 * &lt;a href="app5_core/#spc"&gt;Класс пространство Space&lt;/a&gt;
 * &lt;a href="app5_core/#cam"&gt;Класс Камера&lt;/a&gt;
 * &lt;a href="app5_core/#mod"&gt;Режимы работы вьюпорта&lt;/a&gt;
 * &lt;a href="app5_core/#sig"&gt;Класс сигнала CSignal&lt;/a&gt;
 * &lt;a href="app5_core/#atr"&gt;Структура t_atr.&lt;/a&gt;
 * &lt;a href="app5_core/#mif"&gt;Класс CMainInterface&lt;/a&gt;
 * &lt;a href="app5_core/#rnd"&gt;Способы отрисовки моделей&lt;/a&gt;
 * &lt;a href="app5_core/#eif"&gt;Структура EntetyInfo&lt;/a&gt;
 * &lt;a href="app5_core/#pif"&gt;Структура PhysicalInfo&lt;/a&gt;
 * &lt;a href="app5_core/#reg"&gt;Реестр обьектов CObjRegistry&lt;/a&gt;
 * &lt;a href="app5_core/#res"&gt;Реестр ресурсов CResRegistry&lt;/a&gt;
 * &lt;a href="app5_core/#inp"&gt;Класс CInput&lt;/a&gt;
 * &lt;a href="app5_core/#ins"&gt;Инспектор обьектов&lt;/a&gt;
 * &lt;a href="app5_core/#geo"&gt;Геометрические примитивы и связанная с ними физика&lt;/a&gt;
-* &lt;a href="app5_core/#gem"&gt;Класс GemObject&lt;/a&gt;
 * &lt;a href="app5_core/#bal"&gt;Класс Ball&lt;/a&gt;
+
+&lt;br/&gt;
+
 * &lt;a href="app5_core/#lod"&gt;Загрузка геометрии и материалов из файла формата 3dmax ASE&lt;/a&gt;
-* &lt;a href="app5_core/#veh"&gt;класс CVehicle&lt;/a&gt;
-* &lt;a href="app5_core/#cur"&gt;класс Curve&lt;/a&gt;
+    * &lt;a href="app5_core/#gem"&gt;Класс GemObject&lt;/a&gt;
+    * &lt;a href="app5_core/#cur"&gt;Класс Curve&lt;/a&gt;
+
+* &lt;a href="app5_core/#veh"&gt;Класс CVehicle&lt;/a&gt;
 
 &lt;br/&gt;
 
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:16:38 -0000</pubDate><guid>https://sourceforge.net08509761f80b27e5bcdd62c7b7dd0265c14ea53d</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v116 
+++ v117 
@@ -36,7 +36,9 @@
 * &lt;a href="app5_core/#lod"&gt;Загрузка геометрии и материалов из файла формата 3dmax ASE&lt;/a&gt;
 * &lt;a href="app5_core/#veh"&gt;класс CVehicle&lt;/a&gt;
 * &lt;a href="app5_core/#cur"&gt;класс Curve&lt;/a&gt;
-+
+
+&lt;br/&gt;
+
 * &lt;a href="app5_core/#dem"&gt;Запись демо&lt;/a&gt;
     * &lt;a href="app5_core/#dem.seq"&gt;В какой последовательности обрабатывается воспроизведение и запись демок?&lt;/a&gt;
     * &lt;a href="app5_core/#dem"&gt;Возможность применения управления поверх записанных параметров.&lt;/a&gt;
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:14:31 -0000</pubDate><guid>https://sourceforge.net9a28f51c75de935e455767169894a0a95ddb82fd</guid></item><item><title>WikiPage app5_core modified by Vladimir Baranov</title><link>https://sourceforge.net/p/app5/wiki/app5_core/</link><description>&lt;pre&gt;--- v115 
+++ v116 
@@ -33,548 +33,550 @@
 * &lt;a href="app5_core/#geo"&gt;Геометрические примитивы и связанная с ними физика&lt;/a&gt;
 * &lt;a href="app5_core/#gem"&gt;Класс GemObject&lt;/a&gt;
 * &lt;a href="app5_core/#bal"&gt;Класс Ball&lt;/a&gt;
-* &lt;a href="app5_core/#lod"&gt;Загрузка геометрии из файла формата 3dmax ascii&lt;/a&gt;
+* &lt;a href="app5_core/#lod"&gt;Загрузка геометрии и материалов из файла формата 3dmax ASE&lt;/a&gt;
 * &lt;a href="app5_core/#veh"&gt;класс CVehicle&lt;/a&gt;
 * &lt;a href="app5_core/#cur"&gt;класс Curve&lt;/a&gt;
 +
 * &lt;a href="app5_core/#dem"&gt;Запись демо&lt;/a&gt;
     * &lt;a href="app5_core/#dem.seq"&gt;В какой последовательности обрабатывается воспроизведение и запись демок?&lt;/a&gt;
     * &lt;a href="app5_core/#dem"&gt;Возможность применения управления поверх записанных параметров.&lt;/a&gt;
     * &lt;a href="app5_core/#demo.file.format"&gt;Формат записи файла демо&lt;/a&gt;
     * &lt;a href="app5_core/#demo.history.view"&gt;Как просматривать историю записей? &lt;/a&gt;
     * &lt;a href="app5_core/#demo.recording.process"&gt;Пользовательский интерфейс. Как записывать демо.&lt;/a&gt;    
     * &lt;a href="app5_core/#demo.recording.process"&gt;Пользовательский интерфейс. Как проигрывать демо.&lt;/a&gt;
     * &lt;a href="app5_core/#demorecorder.interface"&gt;Класс DemoRecorder&lt;/a&gt;
     * &lt;a href="app5_core/#demorecorder.interface"&gt;Класс Demo&lt;/a&gt;
 +
 * &lt;a href="app5_core/#vm"&gt;Cправка по виртуальной машине(необработанная под wiki)&lt;/a&gt;
 
 Классы реализация которых еще не закончена
 
 &lt;a href="vehicle/#vm"&gt;Отдельная страница. Алгоритм ухода от столкновения реализация класса CVehicle &lt;/a&gt;
 
 # Интерфейс пользователя #
 [[img src=app5_main_window_min.jpg alt=foobar]]
 
 #####&lt;p align="center"&gt;Рис1. вид главного окна app5.&lt;/p&gt;#####
 
 &lt;h5 id=cro&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Создание обьекта  #####
 Создать обьект можно с помощью кнопки Add, либо c помощью комадны create_obj. 
 
 &lt;h5 id=sel&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Выбор обьекта  #####
 Выбор обьекта осуществляется через список ObjList. Список поддерживает фильтрацию по различным полям. При выборе обьекта он переходит в состояние выбран и его ссылка появляется в списке выбранных обьектов обьекта CSelection.
 
 &lt;h5 id=selv&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Выбор визуального обьекта  #####
 Выбор обьекта можно делать щелкнув по нему мышью. 
 Выбор нескольких обьектов осуществляется с клавишей shift.
 
 &lt;h5 id=fil&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Фильтрация списка обьектов #####
 Может проходить по следующим полям:
 1. По имени в поле контекст(рис 1). Можно задавать несколько имен через пробел 
 2. По классу
 3. По группе
 
 &lt;h5 id=std&gt; &lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Стандартные типы обьектов в версии 1.01 #####
 
 Следующие типы обьектов являются стандартными и различаются в версии 1.01
 
 * Полигональная сетка (GemObject)
 * Геометрический примитив (сфера, куб, цилиндр, пирамида, обьект Кассини, обьект вращения)
 * Кривые (спираль, дуга, сплайн, кривая Мебиуса)
 * Машины
 * Помошники (точки, стрелки)
 * Группы (содержащие ссылки на другие обьекты)
 * Несгрупированные
 
 &lt;h5 id=act&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Действия над виртуальными обьектами  #####
 Видимые визуальные обьекты можно поворачивать, масштабировать и перемещать в пределах сцены и применять к ним различные функции. Обьекты можно прятать и проявлять. Их можно обьединять в группу и перемещать эту группу. Перемещение обьекта мышью можно ограничить по одной оси, нажав кнопки x,y,z . Параметры обьекта меняются через инспектор обьектов.
 
 &lt;h5 id=mon&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Мониторинг переменных #####
 Любой аттрибут можно вывести на экран обновления строчкой watch("objname","attrname")
 У экрана вывода переменных есть режим surviveMode, означающий что выводится только то что обновляет свое значение в течении N циклов апдейта. Если переменная не меняется она автоматически удаляется из мониторинга. Также можно выводить любую переменную из c++ вызвав pscr.upd(var). За мониторинг сейчас отвечает отдельное прилодение "Монитор app5".
 
 
 &lt;h5 id=bas&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Базовый класс Object ###
 Функции базового объекта можно вызвать в ObjectInspector, интерпретаторе, либо посредством muapi. Для того чтобы свойства обьекта были доступны пользователью  необходимо создать метод Declare. в котором описать каждый нужный метод или свойство си++ класса и передать адрес функции SET_ATTR или SET_METHOD.
 Каждый обьект может быть сохранен в файл сцены. При отсутствии специальнорго способа сохранения у потомков базового класса, сохраняются только свойства базового класса. Свойство можно пометить как isNotSaving тогда оно не будет сохраняться в файл сцены. 
 
 &lt;h5 id=ren&gt;&lt;/h5&gt;
 ### Класс RenderObject ###
 ------------------------------------------------------------------------
 Обьекты этого класса визуализируются на экране. 
 Другими словами они попадают в конвеер рендеринга.
 Чтобы сделать визуальный обьект сделайте следующее:
 1. Создайте отдельный класс  
 2. Унаследуйте его от RenderObject
 3. Опишите логику этого класса
 3. Напишите функцию отрисовки обьекта в Render()
 4. Добавте свой обьект через диалог создания обьекта
 
 &lt;h5 id=lsc&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Загрузка и сохранение сцены ####
 Для загрузки сцены нужно 3 файла: object.arh classes.arh offset.arh. В файл classes.arh записываются имена классов обьектов, в файл obj.arh записываются данные обьектов, в файл offsets.arh записывается таблица имя оьекта - смещение на начало данных. У обьекта сохраняются все аттрибуты за исключением тех аттрибутов для которых выставлен флаг isNotSaving. 
 
 &lt;h5 id=reload&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Сохранение и восстановление состояния обьекта ####
 Для любого выбранного обьекта можно сохранять его состояние в любой момент времени.
 Потом с помощью кнопки ReloadObj восстановить это сохраненное состояние.
 
 
 &lt;h5 id=nam&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Имена обьектов ####
 Каких либо ограничений на длинну имен обьектов не существует равно как и нет ограничений на символы состовляющие имя обьекта. Единственное требование - имя должно быть уникально. Если при задании имени обьекта возникла коллизия в ячейке таблицы объектов, система атоматически сменит имя добавив к нему окончание в виде первых байт адреса этого обьекта. 
 
 &lt;h5 id=atr&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Аттрибуты обьектов ####
 В текущей версии 1.01 сохраняются все аттрибуты базового класса: дефолтовый размер примерно равен  1.4 кб. Добавление специальных методов Serialize у классов потомков естественно может увеличить размер. Например в случае геометрического обьекта обьем выделяемой памяти зависит от количества вершин. Вам необходимо написать свой метод сериализации таких обьектов, не забыв вызвав метод Serialize базового класса вначале.  
 
 &lt;h5 id=ids&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Идентификаторы обьектов ####
 Идентификаторы генерируются каждый раз при загрузке сцены. Поскольку при создании компилятор размещает обьекты си++ в разные участки памяти нам не нужно заботиться о выдаче уникальных идентификаторов если они вообще понадобятся. Поиск обьектов эффективно реализуется по имени через функцию CObjRegistry::FindObj 
 
 &lt;h5 id=grp&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Группы ####
 Объект может содержать в себе группу обьектов. Для таких объектов должен быть установлен флаг базового класса isGroup.  Кроме того групповой обьект должен быть унаследован от класса Group. Обьект класса Group может содержать обьекты незарегистрированные в реестре обьектов (основной таблице обьектов). 
 
 bool            isGroup; 
 
 #### Элементы PhysicalInfo обьекта  Object ####
  	 Pnt		 bounds;   // размеры
 	 Pnt		 C0;       //центр
 	 float		 mass; 	   //масса
 	 Pnt		 kurs0;    //курс вектор из точки C0
 	 Pnt              v;       //мгновенная скорость
 &lt;h5 id=mov&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Класс физики CMovement. Силы действующие на обьект типа Object ####
 
 Силы : 
 * сила тяжести на обьекты у которых есть масса (mass&gt;0), 
 * сила трения со стороны поверхности учитывается при расчете движения Vehicle  
 * сила опоры (если обьект на опоре у него выставляется флаг onOpora) 
 * внешняя сила при отскоке по типу упругих шаров 
 
 Движение:
 в классе Ball реализовано качение шара по плоскости в одном направлении
 в классе Vehicle реализовано поступательное движение обьекта.
 
 &lt;h5 id=obj&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 #### Базовый класс Object. Методы ####
 
 
 Установить имя обьекта, недопускаются повторы. 
 SetName(std::string str);
 
 Переименовать 
 Rename(std::string str);
 
 Установить имя класса 
 SetClassName(std::string);
 
 SetAddr2this(t_atr&amp; a)
 
 Присвоить значение аттрибуту
 SET(char* attrname, char* val)
 
 Присвоить описание обьекту
 SET_DESCR(string descr);
 
 Задекларировать аттрибут
 SET_ATTR(string name, void* addr, string type, bool bHidden);
 
 Взять аттрибут
 t_atr* GET_ATTR(string name);
 
 Установить метод
 void* SET_METHOD(char* parentclassname, char* argstr, char* classname, char* methname, ...);
 
 Установить обьект (старый метод обобавляющий его в реестр всех обьектов, а также в глобальную таблицу Луа)
 int   SET_OBJECT(void* this_ptr, char* objname);
 
 Найти обьект в таблице по имени (старый метод)
 static void* GET_OBJECT(char* objname);
 
 Удалить обьект
 static void  DELETE_OBJECT(char* objname);
 
 Вызвать метод обьекта
 int   CALL(char* obname, char* classname, char* methname);	 
 string GetMethName(char* dummy,...);
 
 Для записи аттрибутов в файл
 string ReadString(CArchive&amp; archive);
 void   WriteString(CArchive&amp; archive, string str);
 
 int    RemoveSignals();
 
 
 // Обычные слоты  
 virtual void mouse_move(int x, int y){};
 virtual void mouse_wheel(int zDelta){};
 virtual void click_lmb(int state){};	
 virtual void click_rmb(int state){};
 virtual void click_mmb(int state){};
 virtual void key_pressed(int k){};
 
 
 //сюда приходит сигнал апдейта от первого таймера
 virtual void Slot1(CSignal&amp; sig); 
 virtual void Slot2(CSignal&amp; sig);
 virtual void Slot3(CSignal&amp; sig);
 virtual void Slot4(CSignal&amp; sig);
 
 // Слюда приходит сообщение
 virtual void MessageSlot(CMessage&amp; msg);
 
 //События
 virtual void OnSelect(){};
 virtual void OnUnselect(){};
 virtual void OnAttrChange(t_atr&amp; a){};
 virtual void OnAttrSelect(t_atr&amp; a){};
 virtual void OnDrag( float x, float y, float z );
 
 
 ### Базовый класс Object. Свойства ###
 
 name;  		    //имя
 classname;  	    //имя класса
 groupname;  	    //имя группового обьекта
 int	 livetime;  //время жизни
 bool	 connected; //соединен с системой сигналов
 
 EntetyInfo	  ei;	// информация о ентети
 vector&lt;t_atr&gt; atrs; 	  // массив аттрибутов
 map&lt;string,int &gt; atrsmap; // таблица аттрибутов
 
 vector&lt;string&gt; expressions;//выражения
 //tagTYPE	 meth_args[1][1]; // параметры функции
 
 bool		 isEntety;     // это сущность мира
 bool		 isNotSaving;  // это не сохраняемый обьект
 bool		 isCanRender;  // этот обьект может быть визуализирован
 int		 isSelected;   // этот обькт выбран в данный момент (0- обьект не выбран,  2 - обьект выбран)
 bool            isGroup;      // эта группа
 bool		 isLoading;   // идет загрузка обьекта
 //bool		 isPhysic;    	
 bool		 onOpora;    // свободно либо на опоре  
 int		 isHidden;   //0-виден в сцене 1 - отфильтрован флагами 2-спрятан пользователем
 bool		 m_Updated;
 
 string		 updatescript;		//скрипт для обновления параметров
 string		 initscript;    	//скрипт для инициализации
 time_t          osCreationTime;	//время создания
 DWORD		 osCreationTimeTicks;   //время в тиках
 bool		 bHideStdAttrs;         // имеет спятанные аттрибуты
 
 
 ------------------------------------------------------------------------
 &lt;h5 id=mod&gt;&lt;/h5&gt;
 ##### Режимы работы вьюпорта #####
 MODE_SELECTION - режим выбора обьекта мышью
 MODE_MOVE - режим перемещения мышью
 MODE_SCROLLVIEW - используется для скроллинга вида сверху вдоль осей x и y 
 MODE_PICK - в этом режиме редактор позволяет назначить точку кликом мыши. 
 
 
 ------------------------------------------------------------------------
 &lt;h5 id=sig&gt;&lt;/h5&gt;
 ### Класс сигнала CSignal ###
 
 
 Класс сигнала используется в системе рассылки сигналов.
 Для того чтобы подсоединить обьект к циклу обновления, необходимо вызвать метод базового класса Connect() в конструкторе. По умолчанию задается первый слот (слот апдейта), имя сигнала по умолчанию присваивается в виде "Dest_objname-Src_objname" 
 
 class CSignal 
 {
 public:
 
 	CSignal(Object* dest, int slot_num);
 	CSignal(Object* dest, Object* src,  int slot_num);
 	void SetName(string name){strcpy(Name, name.c_str()); };
 	int Send();   // Немедленная посылка сигнала
 	int Post();   // Запланированная посылка сигнала
 
 	char   Name[255]; // имя сигнала 
 	int    slot_num;  //номер слота
 	void*  data;      // ссылка на произвольные данные
 
 	Object* dest;     // Обьект которому идет сигнал
 	Object* src;      // Обьект от которого идет сигнал
 };
 
 
 &lt;h5 id=atr&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура t_atr.  ###
 Определяет аттрибут обьекта
 
 Тип аттрибута обьекта один из распознаваемых ObjectInspector. Может быть untyped
    Список типов поддерживаемых ObjectInspector
 Обьекты имеют динамический список аттрибутов, которые могут добавлятся в процессе работы программы.
 Например при создании новой точки в кривой появляется новое свойство с именем Pnt1
   
 #### Типы аттрибутов ####
    float 
    + int
    * string
    * selector
    * func
    * GLColor3f 
    * bool
    * Pnt
 
 #### Свойства аттрибутов ####
 min -минимальное зн-е
 max - максимальное зн-е
 step - шаг
 flags - флаги установленные для аттрибута
   
 #### Функции работы с аттрибутами ####
 Hide()
 Ставит флаг isHidden. Прячет аттрибут. Необходимо для функции фильтрации свойств в ObjInspector
 
 Unhide()
 Снимает флаг isHidden. 
 
 Select()
 Ставит флаг isSelected. Для выбранного аттрибута отображается адрес в консоле.
 
 Unselect()
 
 toString()
 Конвертирует значение аттрибута в строку
 
 fromString()
 Парсирует строку в тип аттрибута.
 
 Watch()
 Устанавливает флаг isWatched. Это нужно для просмотра значения аттрибута на экране выводимых переменных. 
 
 isWatched()
 
 ReadOnly()
 Устанавливает флаг isReadOnly. Нужно для защиты от записи аттрибута. Например имя обьекта, поскольку оно занесено в реестр обьектов.
 
 isReadOnly()
 проверяет флаг isReadOnly
 
 NotSaving()
 Устанавливает флаг NotSaving. Это означает что его значение не будет сохраняться в файл при сохранении сцены. 
 
 isNotSaving()
 проверяет флаг isNotSaving()
 
 &lt;h5 id=cam&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ##### Класс Camera #####
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 При запуске мира в нем существует одна камера свободного обзора. 
 Для отображения ортогональных видов применяется тот же класс.
 Активная камера — это та камера которой передается управление мыши, клавиатуры и других устройств ввода. Выбор активной камеры делается кликом по вьюпорту. Камера может быть визуализирована в изображении другой камеры. Камера отображается в другом окне как тетрайдер, основание которого - плоскость проекции виртуального изображения. 
 Управляется камера с помощью клавиш - w,a,s,d направление обзора и движения регулируется мышью. Вектор движения определяется чрез точку lookAt, точкой в которую смотрит камера. Координаты этой точки преобразуются в сферической системе координат взависимости от движений мыши.
 Для более плавного движения камеры рассматривается применение математического аппарата кватернионов. 
 
 &lt;h5 id=mif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс CMainInterface ###
 Определяет начальные действия
 -Инициирует загрузку сцены
 -Создает и разммещает данные обьектов в памяти 
 -Определяет порядок рендеринга обьектов
 
 &lt;h5 id=rnd&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Способы отрисовки моделей ###
 Определяются глобальными флагами flags
 -bShading Шейдинг с наложением материала на полигоны
 -bColorRendering - Используется matid для выбора цвета грань
 -bWire - Режим отображения в виде сеточного каркаса
 -bMayPaintGDI - особый режим отрисовки (нужен для удаленного дисплея)
 
 &lt;h5 id=eif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура EntetyInfo  ###
  характеризуется 
 - файлом модели
 - координатами
 - именем класса обьекта
 - GUID в карте
 - именем
 - типом материала
 - сценарием
 
 
 &lt;h5 id=pif&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Структура PhysicalInfo  ###
 характеризуется:
 -скоростью
 -обьемом(длинами сторон ограничевающего параллепипеда)
 -массой
 -направлением
 
 &lt;h5 id=reg&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Реестр обьектов CObjRegistry ###
 Содержит: 
 Таблицу (objname, EntetyInfo)
 Функции:
 1. Поиск обьектов по имени
 2. Поиск по координатам
 3. Поиск по классу
 
 &lt;h5 id=res&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Реестр ресурсов CResRegistry ###
 Содержит: 
 Таблицу (resname, ResInfo)
 Функции:
 1. Загрузка файлов модели
 2. Загрузка текстур
 3. Загрузка и компиляция шейдеров
 4. Создание новых ресурсов
 5. Поиск по имени ресурса
 6. Обработка исключительных ситуаций при отсутсвии нужного ресурса
 
 
 &lt;h5 id=inp&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс CInput ###
 Перенаправляет действия пользователя обьекту управления.
 Предоставляет двухмерные координаты в экране (вьюпорте OpenGl)
 Предоставляет трехмерные координаты точки в виде "сверху". 
 Содержит включение режима "прилипания" курсора к сетке.
 
 &lt;h5 id=ins&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### ObjInspector ###
 Отображает список свойств обьекта, 
 Изменяет любое свойство не ReadOnly
 Отражает изменение свойства во времени
 Вызывает функции обьекта.
 Плавно меняет свойство в пределах выбранной точности 
 Поддерживает базовые типы: число, строка, флаг
 Поддерживает некоторые специальные типы:
 коллекция строк, вектор, точка, цвет 
 
 &lt;h5 id=spc&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ### Класс Space ###
 Описывает пространство. 
 Пространство состоит из набора узловых точек MapPoint. 
 Пространство делится на сектора(Sector) вершины которых представляют собой узловые точки.
 Позволяет осуществить поиск обьектов в окресности некоторой точки.
 Функции мировой системы координат
 Переводы из локальной системы координат в мировую
 Подразумевает деление пространства на отдельные сектора содержащие 
 ссылки на обьекты, которые в нем присутсвуют (целесообразно для больших карт).
 Функции:
 1. Поиск обьектов в окресности некой точки
 Поиск обьектов в зоне
 p = (x / sect_size, y / sect_size, z / sect_size )
 Рассмотрение списков обьетктов 8 секторов узловой точки
 Составление списка секторов зоны ( по умолчанию параллепипед )
 Классы CSector имеют 6 ссылок на соседние сектора (up,down,left,right,front,back)
 
 
 ------------------------------------------------------------------------
 
 ### Класс CSelection. ###
 Реализация механизма выбора обьектов. 
 
 &lt;h5 id=geo&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## Геометрические примитивы и связанная с ними физика ##
 
 ###  Класс GemObject ###
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 
 
 &lt;b&gt;Методы:&lt;/b&gt;
 
   ComputeC0()   | поиск геометрического центра обьекта 
   SetNumFaces() | Установить количество полигонов
   SetNumVert()  | Установить количество вершин
   CenterModel() | Пересчитывает координаты обьекта из мировых в локальные
   Serialize()   | Метод реализирующий бинарный экспорт данных обьекта 
 
 
 //Стуркура определяющая вершину сетки
 struct Vertex
 
 //Грань сетки 
 typedef struct TFace
 {
     Vertex vertices[4]; // полигон состоит из 4 точек
     Pnt facetNormal;   // нормаль полигона
     char matid;        // номер материала 
 }TFace;
 
 
 
 &lt;h5 id=bal&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ###  Класс Ball ###
 &lt;P LANG="ru-RU" STYLE="margin-bottom: 0cm"&gt;&lt;FONT COLOR="#000080"&gt;&lt;I&gt;&lt;B&gt;Наследование:
 	&lt;SPAN LANG="en-US"&gt;Object-&gt;RenderObject&lt;/SPAN&gt;&lt;/B&gt;&lt;/I&gt;&lt;/FONT&gt;&lt;/P&gt;
 
 Класс визуализирующий сферу с физикой мяча 
 
 
 &lt;h5 id=veh&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс CVehicle ##
 Содержит модель движения автомобиля, анимацию автомобиля (анимируются колеса). 
 Обьекту этого класса может быть присвоена траектория класса Curve. 
 Машину можно перемещать в начало траектории.
 Управление клавишами o,k,l,; 
 При движении на автомобиль кроме силы тяги действует сила тяжести и сила трения.
 Когда машина управляется пользователем на траектории отображаются ближайшая точка.
 Эта точка окрашивается в зеленый цвет если машина движется по направлению к концу траектории и в синиий цвет - если наоборот.
 
 
 &lt;h5 id=cur&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
 ## класс Curve ##
 
 Содержит визуальный сплайн Эрмита с возможностью редактировать контрольные точки, перемещать их и регулировать степень кривизны (производные в контрольных точках).
 В Curve добавлена Спираль задается двумя радиусами и высотой
 В Curve добавлена Дуга задается двумя точками и высотой
 В Curve добавлен альтернативный алгоритм сплайна Кочана-Бартельса 
 
 
 
 &lt;h5 id=lod&gt;&lt;/h5&gt;
 ------------------------------------------------------------------------
-## Загрузка геометрии из файла формата 3dmax ascii ##
-
-
-Модифицирован разбор 3d max ascii файла
+## Загрузка геометрии и материалов из файла формата 3dmax ascii ##
+Для импорта моделей используется формат сцены 3dmax ASE
+http://paulbourke.net/dataformats/ase/
+
+Импорт сцены формата ASE реализован в ascii3d.cpp.
+По спецификации сцены ASE в app5 создаются модели класса GemObject. Внутри GemObject создается агрегированный обьект класса Mesh (полигональная сетка). Каждому полигону присваивается номер matid. Дальше по этому полю возможен цветовой рендеринг в случае отсутсвия текстур. Также в память загружаются материалы. Инициализируются материалы присвоенные полигону, координаты текстур, устанавливается модель меппинга (циллиндрический, планарный, сферический). Импортируются сплайновые обьекты типа Shape.
 
 
 
&lt;/pre&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Vladimir Baranov</dc:creator><pubDate>Sun, 19 Feb 2012 10:11:56 -0000</pubDate><guid>https://sourceforge.net0cbd332966f6f18ae60e2a60398085c709102db5</guid></item></channel></rss>