diff --git a/docs/settings_doxygen/Doxyfile b/docs/settings_doxygen/Doxyfile
index 8900f2882579620cd327e8885edc5832b7d4912a..4f540082694cd17504d392c2a608ad7ec4c7c937 100644
--- a/docs/settings_doxygen/Doxyfile
+++ b/docs/settings_doxygen/Doxyfile
@@ -51,7 +51,7 @@ PROJECT_BRIEF          = "3D real-time render"
 # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
 # the logo to the output directory.
 
-PROJECT_LOGO           = 
+PROJECT_LOGO           = ./logo.png
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
 # into which the generated documentation will be written. If a relative path is
@@ -795,25 +795,23 @@ INPUT                  = ../../source/gdefines.h \
                          ../../source/GRegisterIndex.h \
                          ../../source/input/sxinput.h \
                          ../../source/gcore/sxgcore.h \
+                         ../../source/score/sxscore.h \
                          ../../source/geom/sxgeom.h \
                          ../../source/mtllight/sxmtllight.h \
                          ../../source/pp/sxpp.h \
-                         ../../source/SkyXEngine.h \
-                         ../../source/managed_render/gdata.h \
-                         ../../source/managed_render/camera_update.h \
-                         ../../source/managed_render/handler_out_log.cpp \
-                         ../../source/managed_render/render_func.h \
-                         ../../source/managed_render/level.h \
                          ../../source/anim/sxanim.h \
                          ../../source/anim/ModelFile.h \
                          ../../source/gcore/ModelFile.h \
                          ../../source/SXGUIWinApi/SXGUI.h \
                          ../../source/particles/sxparticles.h \
-                         ../../source/score/sxscore.h \
                          ../../source/decals/sxdecals.h \
                          ../../source/aigrid/sxaigrid.h \
+                         ../../source/render/sxrender.h \
+                         ../../source/level/sxlevel.h \
+                         ../../source/SkyXEngine.h \
                          ../../source/sxmaterialeditor/sxmaterialeditor.cpp \
-                         ../../source/sxparticleseditor/sxparticleseditor.cpp
+                         ../../source/sxparticleseditor/sxparticleseditor.cpp \
+                         ../../source/sxleveleditor/sxleveleditor.cpp
 
 # This tag can be used to specify the character encoding of the source files
 # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/docs/settings_doxygen/logo.png b/docs/settings_doxygen/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..313d97c65a59f92cc33f31d360b9d84a27f08671
Binary files /dev/null and b/docs/settings_doxygen/logo.png differ
diff --git a/source/SkyXEngine.h b/source/SkyXEngine.h
index 99febaf86af04950111d4ea8eb7df3d980366760..2fac47598f3dc93c2def166e4c61495f3634b100 100644
--- a/source/SkyXEngine.h
+++ b/source/SkyXEngine.h
@@ -20,14 +20,14 @@ See the license in LICENSE
 /*! \page info_engine Информация о движке SkyXEngine
 \tableofcontents
 \section ie_common Общее
-SkyXEngine - графический 3D движок с real-time рендером, использует технологии DirectX 9. \n
+\b SkyXEngine - движок для создания 3D игр с real-time рендером, использует технологии DirectX 9. \n
 <small>Сразу уточнение, DirectX 9 мы используем в связи с личными предпочтениями, так как на наш взгляд эта технология является одной из лучших, хоть и считается устаревшей. 
 Все новое это забытое старое)) И как нам кажется ... нет ничего такого, чего нельзя было бы сделать на DirectX 9, но что можно сделать на другом GAPI, для создания игр любого жанра с real-time рендером.
 Но это только точка зрения нашей команды и она может быть ошибочная. Однако в планах есть расширение поддерживаемых GAPI.</small>
 
 <b>Формирование уровня</b> осуществляется посредством:
  - загрузки статических моделей формата dse, с их автоматическим разбиением на "куски рендера" как quad или octo дерево, возможны сохранение/загрузка в бинарный файл всей геометрии уровня
- - генерации растительности по маске, возможны 2 вида: трава (чем дальше тем меньше размер объекта) и деревья (с возможностью загрузки лодов), возможны возможны сохранение/загрузка в бинарный файл всей растительности уровня.
+ - генерации растительности по маске, возможны 2 вида: трава (чем дальше тем меньше размер объекта) и деревья (с возможностью загрузки лодов), возможны возможны сохранение/загрузка в бинарный файл всей растительности уровня. Ручная расстановка расстительности поддерживается. Редактирование поддерживается.
 
 <b>Освещение</b> представлено 3 видами источников света (опционально поддерживается генерация теней от каждого исчтоника света):
  - глобальный (солнце), тени - PSSM
@@ -49,10 +49,12 @@ HDR эффект присутсвует.
  - детальность
  - детальность по маске (до 4 текстур)
  - комбинированный микрорельеф с детальностью по маске (до 4 текстур)
- - альфа тест.
+ - альфа тест
+ - просвечиваемость (для освещения тонких поверхностей, к примеру листвы и травы).
 
  Вся система материалов является открытой и практически любой функционал системы доступен для собственной интерпретации, посредством шейдеров. Имеется встроенный набор данных.\n
  Поддерживаются различные пользовательские данные которые интерпретируются только создающим материалы.
+ Настрока физического материала доступна.
 
 <b>Постпроцесс</b> состоит из эффектов:
  - черно-белое изображение
@@ -68,6 +70,26 @@ HDR эффект присутсвует.
  - nfaa
  - dlaa.
 
+<b>Декали</b> .
+
+<b>Физика</b> .
+
+<b>Звуковой движок</b> поддерживает воспроизведение в пространстве и в фоне. Поддерживаемые форматы ogg, wav. Доступно создание инстансов без возможности управления.
+
+<b>Партиклы</b> с необходимым набором логики и с многочисленными и простыми настроками.
+
+<b>AI сетка</b> для навигации живых игровых объектов.
+
+<b>Игровой движок</b> .
+
+<b>Эффекты окружения</b> представлены фоновыми ambient звуками, погодой, определяемой для каждого уровня, с различными погодными эффектами.
+
+<b>Real-time конфигурация (cvars)</b> позволяет в режиме реального времени через консоль изменять разного рода установки движка
+
+<b>Редакторы:</b> 
+ - \link level_editor SXLevelEditor - редактор уровней \endlink \n
+ - \link material_editor SXMaterialEditor - редактор материалов \endlink \n
+ - \link particles_editor SXParticlesEditor - редактор партиклов \endlink \n
 
 \section dogma_engine Идеология движка
 Основной технической идеей при разработке движка была идея о том что программист должен иметь контроль над объектами которыми он оперирует, НО этот контроль должен быть в меру. \n
@@ -186,39 +208,81 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот
 
 /*! \page engine_cvar Движковые квары
 \tableofcontents
-\section managed_render Managed render
- \subsection pp Post process
+
+\section engine_cvar_naming Правила именования
+Все имена кваров пишутся только в нижнем регистре, в качестве пробела используется _ (нижний пробел).
+Если квар является дефолтным, относительно него буду происходит расчеты либо действия, то тогда prefix_default_cvar.
+ - r_  - все, что связано с рендером непосредственно
+ - cl_ - игрок управление
+ - phy_ - физика
+ - env_ - погода (от environment, не знаю, как сократить weather)
+ - pp_ - постпроцесс
+ - ai_ - ИИ
+ - mtl_ - настройки материалов
+ - ent_ - то, что связано  с системой объектов
+ - lvl_ - то, что связано с уровнем
+ - nav_ - навигация
+ - snd_ - звуки
+ - ed_ - для редакторов
+ - pt_ - партиклы
+
+ \section engine_cvar_camera Камера
+ - \b r_default_fov дефолтный fov
+ - \b r_near ближняя плоскость отсечения
+ - \b r_far дальняя плоскость отсечения
+
+\section engine_cvar_window Окно
+ - \b r_win_width размер окна по горизонтали (в пикселях)
+ - \b r_win_height размер окна по вертикали (в пикселях)
+ - \b r_win_windowed режим рендера true - оконный, false - полноэкранный
+ - \b r_final_image тип финального (выводимого в окно рендера) изображения из перечисления DS_RT
+ - \b r_resize тип изменения размеров окан рендера из перечисления RENDER_RESIZE
+
+\section engine_cvar_pp Post process
  - \b pp_ssao установка качества ssao (0 - не рисовать, 1 - среднее, 2 - хорошее, 3 - высокое)
  - \b pp_bloom рисовать ли эффект bloom (true/false)
  - \b pp_lensflare true рисовать ли эффект lens flare (true/false)
  - \b pp_lensflare_usebloom при рендере эффекта lens flare использовать ли данные от прохода эффекта bloom (true/false)
  - \b pp_dlaa рисовать ли эффект dlaa (true/false)
  - \b pp_nfaa рисовать ли эффект nfaa (true/false)
+ - \b pp_fog_density коэфициент плотности тумана, чем больше тем больше все в тумане, имеет смысл [0,1]
  - \b pp_motionblur рисовать ли эффект motion blur (true/false)
  - \b pp_motionblur_coef коэфициент размытия эффекта motion blur [0.0, 1.0]
 
- \subsection light Light
- - \b pssm_4or3 для рисования глобальных теней использовать 4 сплита (true) или 3 (false)
- - \b pssm_q коэфициент увеличения карты глубины для глобальных теней относительно размеров окна рендера [0.5, 2]
- - \b lsm_q коэфициент увеличения карты глубины для локальных теней относительно размеров окна рендера [0.5, 2]
- - \b shadow_soft качество сглаживания теней (0 - без сглаживания, 1 - один проход, 2 - двойное сглаживание)
- - \b hdr_adapted_coef коэфициент адаптации глаза к освещению (0,1] (медленно,быстро]
+\section engine_cvar_light Свет, освещение, тени
+ - \b r_pssm_4or3 для рисования глобальных теней использовать 4 сплита (true) или 3 (false)
+ - \b r_pssm_shadowed отрасывает ли глобальный источник света тени (true/false)
+ - \b r_pssm_quality коэфициент увеличения карты глубины для глобальных теней относительно размеров окна рендера [0.5, 2]
+ - \b r_lsm_quality коэфициент увеличения карты глубины для локальных теней относительно размеров окна рендера [0.5, 2]
+ - \b r_shadow_soft качество сглаживания теней (0 - без сглаживания, 1 - один проход, 2 - двойное сглаживание)
+ - \b r_hdr_adapted_coef коэфициент адаптации глаза к освещению (0,1] (медленно,быстро]
 
- \subsection green Растительность
- - \b grass_frec плотность рендера травы (0, 100]
- - \b green_lod0 дистанция от наблюдателя на которой заканчивается нулевой лод растительности (он же лод травы), то есть дальность отрисовки травы (0,100)
- - \b green_lod1 дистанция от наблюдателя на которой заканчивается первый лод растительности (50,150)
- - \b green_less дистанция от наблюдателя c которой начнет уменьшаться трава (0,green_lod0)
-
- \subsection other Прочие 
- - \b r_s_filter фильтрация текстур (0 - point, 1 - linear, 2 - anisotropy)
- - \b r_s_max_anisotropy значение анизитропной фильтрации [0,16]
- - \b r_s_max_miplevel максимально возможный mip уровень текстур [0, #SXGC_LOADTEX_COUNT_MIPMAP]
- - \b p_far дальность видимости (отрисовки мира)
+ \section engine_cvar_green Растительность
+ - \b r_grass_freq плотность рендера травы (0, 100]
+ - \b r_green_lod0 дистанция от наблюдателя на которой заканчивается нулевой лод растительности (он же лод травы), то есть дальность отрисовки травы (0,100)
+ - \b r_green_lod1 дистанция от наблюдателя на которой заканчивается первый лод растительности (50,150)
+ - \b r_green_less дистанция от наблюдателя c которой начнет уменьшаться трава (0,green_lod0)
+
+ \section engine_cvar_texfilter Фильтрация текстур 
+ - \b r_texfilter_type тип фильтрации текстур, 0 - точечная, 1 - линейная, 2 - анизотропная
+ - \b r_texfilter_max_anisotropy максимальное значение анизотропной фильтрации (если включена) [1,16]
+ - \b r_texfilter_max_miplevel какой mip уровень текстур использовать? 0 - самый высокий, 1 - ниже на один уровень и т.д.
+ - \b r_stats показывать ли статистику? 0 - нет, 1 - fps и игровое время, 2 - показать полностью
+
+\section engine_cvar_env Окружение
+  - \b env_default_rain_density коэфициент плотности дождя (0,1]
+  - \b env_default_thunderbolt могут ли воспроизводится эффекты молнии?
+  - \b env_weather_snd_volume громкость звуков погоды [0,1]
+  - \b env_ambient_snd_volume громкость фоновых звуков на уровне [0,1]
+
+\section engine_cvar_game Игра
+  - \b g_time_run запущено ли игрвоое время?"
+  - \b g_time_speed скорость/соотношение течения игрового времени
 
 //##########################################################################
 
 \page editors Редакторы
+\link level_editor SXLevelEditor - редактор уровней \endlink \n
 \link material_editor SXMaterialEditor - редактор материалов \endlink \n 
 \link particles_editor SXParticlesEditor - редактор партиклов \endlink \n
 */
@@ -357,14 +421,6 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот
 
 //#############################################################################
 
-//#include <managed_render/handler_log.h>
-/*#include <managed_render/gdata.h>
-#include <managed_render/camera_update.h>
-#include <managed_render/render_func.h>*/
-//#include <managed_render/level.h>
-
-#include <render/sxrender.h>
-
 #if defined(SX_GAME)
 #include <SkyXEngine_Build/resource.h>
 #endif
@@ -383,22 +439,25 @@ QT стиль документирования (!) и QT_AUTOBRIEF - корот
 #include <sxparticleseditor/resource.h>
 #include <sxparticleseditor/particles_editor.h>
 #endif
-
-//#include <managed_render/redefined_func.h>
-//#include <managed_render/render_func.h>
-
-
-/*#ifndef IDI_ICON_LOGO
-#define IDI_ICON_LOGO 0 
-#endif*/
 
 //#############################################################################
 
+/*! \defgroup skyxengine Функции и данные движка
+@{*/
+
 //! инициализация движка
 void SkyXEngine_Init(HWND hWnd3D = 0, HWND hWndParent3D = 0);
+
+//! инициализация путей в регистрах
 void SkyXEngine_InitPaths();
+
+//! создание кваров и загрузка файлов настроек
 void SkyXEngine_CreateLoadCVar();
+
+//! обработчик для окна рендера
 LRESULT CALLBACK SkyXEngine_WndProc(HWND hWnd, UINT uiMessage, WPARAM wParam, LPARAM lParam);
+
+//! создание окна рендера
 HWND SkyXEngine_CreateWindow(const char *szName, const char *szCaption, int iWidth, int iHeight);
 
 //**************************************************************************
@@ -420,6 +479,7 @@ void SkyXEngine_PrintfLog(int level, const char *szFormat, ...);
 //! кадр
 void SkyXEngine_Frame(DWORD timeDelta);
 
+//! обновление данных кваром (реакция на обновление)
 void SkyXEngind_UpdateDataCVar();
 
 //! запуск основного цикла обработки
@@ -428,6 +488,11 @@ int SkyXEngine_CycleMain();
 //! уничтожение данных движка, освобождение памяти
 void SkyXEngine_Kill();
 
+//**************************************************************************
+
+/*! \name skyxengine_preview_wnd preview_wnd - Функции превью окна движка
+@{*/
+
 //! обработчик для превьюокна
 LRESULT CALLBACK SkyXEngine_PreviewWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
 
@@ -437,10 +502,11 @@ void SkyXEngine_PreviewCreate();
 //! уничтожение превью окна
 void SkyXEngine_PreviewKill();
 
+//!@} 
+
 //**************************************************************************
 
-/*! \defgroup managed_render_redefined_func redefined_func - Функции обертки, для передачи графическому ядру для замены стандартных
-\ingroup managed_render
+/*! \name skyxengine_redefined_func redefined_func - Функции обертки, для передачи графическому ядру для замены стандартных
 @{*/
 
 //! функция отрисовки, в данной версии не назначается
@@ -458,6 +524,8 @@ bool SkyXEngine_RFuncAIQuadPhyNavigate(float3_t * pos);
 //! просчет столкновения частицы с миром
 bool SkyXEngine_RFuncParticlesPhyCollision(const float3 * lastpos, const float3* nextpos, float3* coll_pos, float3* coll_nrm);
 
-//!@} managed_render_redefined_func
+//!@}
+
+//!@} skyxengine
 
 #endif
\ No newline at end of file
diff --git a/source/game/SXbaseEntity.cpp b/source/game/SXbaseEntity.cpp
index a5c7fc38f2e9c0d9a76fa788ed65cd22b3eb9c45..a70265c186421be292a6dc2f918d3d745e3eb39d 100644
--- a/source/game/SXbaseEntity.cpp
+++ b/source/game/SXbaseEntity.cpp
@@ -9,7 +9,7 @@ BEGIN_PROPTABLE_NOBASE(SXbaseEntity)
 	DEFINE_FIELD_VECTOR(m_vPosition, 0, "origin", "Origin", EDITOR_TEXTFIELD)
 	DEFINE_FIELD_ANGLES(m_vOrientation, 0, "rotation", "Rotation", EDITOR_TEXTFIELD)
 	DEFINE_FIELD_PARENT(m_pParent, 0, "parent", "Parent entity", EDITOR_TEXTFIELD)
-	DEFINE_FIELD_FLAGS(m_iFlags, 0, "flags", "Flags", EDITOR_TEXTFIELD)
+	DEFINE_FIELD_FLAGS(m_iFlags, 0, "flags", "Flags", EDITOR_FLAGS)
 	DEFINE_FIELD_ENTITY(m_pOwner, PDFF_NOEXPORT | PDFF_NOEDIT, "owner", "", EDITOR_NONE)
 
 	//DEFINE_FIELD_STRING(m_szName, 0, "some opt", "Option", EDITOR_COMBOBOX)
diff --git a/source/game/crosshair.cpp b/source/game/crosshair.cpp
index d783efa63b4359decf9c8c30a29fdf1d10f22d2c..aa3abddf47051d9b96f8a0897bc2d038fa7dcc7f 100644
--- a/source/game/crosshair.cpp
+++ b/source/game/crosshair.cpp
@@ -63,12 +63,12 @@ void Crosshair::Update()
 			}
 		}
 
-		static const int *winr_width = GET_PCVAR_INT("winr_width");
-		static const int *winr_height = GET_PCVAR_INT("winr_height");
+		static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+		static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 		//build new buffer
-		float fScreenWidth = *winr_width;
-		float fScreenHeight = *winr_height;
+		float fScreenWidth = *r_win_width;
+		float fScreenHeight = *r_win_height;
 		float fTexWidth = m_f2TexSize.x;
 		float fTexHeight = m_f2TexSize.y;
 		float fXradius = fTexWidth / fScreenWidth * 0.5f;
diff --git a/source/game/proptable.h b/source/game/proptable.h
index 7dfe71ec5ace0a2a8229af338090e74212941ed9..19ab24e41e5977199b93bf25b9d6a813f15b2432 100644
--- a/source/game/proptable.h
+++ b/source/game/proptable.h
@@ -265,6 +265,7 @@ const char * GetEmptyString();
 
 #define EDITOR_NONE {PDE_NONE, NULL}}
 #define EDITOR_TEXTFIELD {PDE_TEXTFIELD, NULL}}
+#define EDITOR_FLAGS {PDE_FLAGS, NULL}}
 
 #define EDITOR_COMBOBOX _GetEditorCombobox(0
 #define COMBO_OPTION(name, value) , name, value
diff --git a/source/game/sxgame.h b/source/game/sxgame.h
index a361a3e7cb3426e137aefef1f91686fc7bc3544a..41f37d56a92d3cf8aa0d4e5d48a38456e34c63a9 100644
--- a/source/game/sxgame.h
+++ b/source/game/sxgame.h
@@ -111,9 +111,11 @@ SX_LIB_API const char * SXGame_EntGetDefault(const char * classname, const char
 */
 SX_LIB_API int SXGame_EntGetCount();
 
-/*! ���������� ���� entity
+/*! ���������� entity �� ��� id
 */
-SX_LIB_API SXbaseEntity * SXGame_EntGet(ID id);
+SX_LIB_API SXbaseEntity *SXGame_EntGet(ID id);
+
+SX_LIB_API SXbaseEntity *SXGame_EntGetByName(const char *szName, ID idStart = 0);
 
 #endif
 
diff --git a/source/game/sxgame_dll.cpp b/source/game/sxgame_dll.cpp
index c28a834fd80182d91f21961fa8e5ba476452bca3..e438e5a092ac7e16ae716de1b0bf86037375e459 100644
--- a/source/game/sxgame_dll.cpp
+++ b/source/game/sxgame_dll.cpp
@@ -355,8 +355,26 @@ SX_LIB_API int SXGame_EntGetCount()
 	return(GameData::m_pMgr->GetCount());
 }
 
-SX_LIB_API SXbaseEntity * SXGame_EntGet(ID id)
+SX_LIB_API SXbaseEntity *SXGame_EntGet(ID id)
 {
 	SG_PRECOND(NULL);
 	return(GameData::m_pMgr->GetById(id));
 }
+
+SX_LIB_API SXbaseEntity *SXGame_EntGetByName(const char *szName, ID idStart)
+{
+	SG_PRECOND(NULL);
+
+	SXbaseEntity *pEnt = 0;
+
+	for (int i = 0, il = SXGame_EntGetCount(); i < il; ++i)
+	{
+		pEnt = SXGame_EntGet(i);
+		if (pEnt && strcmp(szName, pEnt->GetName()) == 0)
+		{
+			return pEnt;
+		}
+	}
+
+	return 0;
+}
diff --git a/source/gdefines.h b/source/gdefines.h
index c178c52c97e472a41fde8d5c6b40d452fa6fe80f..c95938ce80dc3d6652388fbb6718322c9253d1e5 100644
--- a/source/gdefines.h
+++ b/source/gdefines.h
@@ -44,7 +44,7 @@ struct IBaseObject
 Стандартная функция имеет ограничение на длину сообщения которое регулируется макроопределением REPORT_MSG_MAX_LEN объявленном в gdefines.h. При написании своего обработчика сообщений следует использовать данное ограничение.\n
 Уровни критичности сообщений объявлены в gdefines.h: \n
  - #REPORT_MSG_LEVEL_NOTICE
- - #REPORT_MSG_LEVEL_WARRNING
+ - #REPORT_MSG_LEVEL_WARNING
  - #REPORT_MSG_LEVEL_ERROR
 
 В случае переназначения стандартной функции сообщений необходимо самостоятельно(в переназначаемой функции) обрабатывать уровни критичности, для примера можно использовать механизм стандартной функции.\n
diff --git a/source/level/AmbientSounds.cpp b/source/level/AmbientSounds.cpp
index 9217582bb2106411649b6a75da060d5274bc4b0f..23660b1bdae1ca2f6f625cbe60787cf495d61412 100644
--- a/source/level/AmbientSounds.cpp
+++ b/source/level/AmbientSounds.cpp
@@ -57,8 +57,8 @@ void CAmbientSounds::update()
 	if (!m_isPlaying)
 		return;
 
-	static const float * ambient_snd_volume = GET_PCVAR_FLOAT("ambient_snd_volume");
-	static float ambient_snd_volume_old = 1.f;
+	static const float * env_ambient_snd_volume = GET_PCVAR_FLOAT("env_ambient_snd_volume");
+	static float env_ambient_snd_volume_old = 1.f;
 
 	if (SSCore_SndStateGet(m_aIDSnds[m_iPlayingLast]) != SOUND_OBJSTATE_PLAY)
 	{
@@ -67,15 +67,15 @@ void CAmbientSounds::update()
 		else
 			m_iPlayingLast = 0;
 
-		SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], ambient_snd_volume_old*100.f);
+		SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], env_ambient_snd_volume_old*100.f);
 		SSCore_SndPlay(m_aIDSnds[m_iPlayingLast]);
 	}
 
-	if (ambient_snd_volume && ambient_snd_volume_old != (*ambient_snd_volume))
+	if (env_ambient_snd_volume && env_ambient_snd_volume_old != (*env_ambient_snd_volume))
 	{
-		ambient_snd_volume_old = *ambient_snd_volume;
+		env_ambient_snd_volume_old = *env_ambient_snd_volume;
 		if (m_iPlayingLast >= 0)
-			SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], ambient_snd_volume_old*100.f);
+			SSCore_SndVolumeSet(m_aIDSnds[m_iPlayingLast], env_ambient_snd_volume_old*100.f);
 	}
 }
 
diff --git a/source/level/sxlevel.h b/source/level/sxlevel.h
index 7eecf34faed3365c61bc77642409f034221a494d..e0f5baeb6d906f3d7a49d4912d5fb7c5ae7b4a8f 100644
--- a/source/level/sxlevel.h
+++ b/source/level/sxlevel.h
@@ -1,9 +1,14 @@
 
 /******************************************************
-Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
 See the license in LICENSE
 ******************************************************/
 
+/*!
+\file
+Заголовочный файл sxlevel, библиотека управления уровнем
+*/
+
 #ifndef __SXLEVEL_H
 #define __SXLEVEL_H
 
@@ -76,139 +81,144 @@ See the license in LICENSE
 
 //#############################################################################
 
-//! ������ ����������
+/*! \defgroup sxlevel sxlevel - библиотека управления уровнем
+@{*/
+
+//! версия подсистемы
 SX_LIB_API long SLevel_0GetVersion();
 
-//! ��������� ������� ������ ���������
+//! установка функции вывода сообщений
 SX_LIB_API void SLevel_Dbg_Set(report_func rf);
 
-//! ������������� ����������
+//! инициализация подсистемы
 SX_LIB_API void SLevel_0Create(
-	const char *szName,			//!< ������������� ��� ����������
-	bool isUnic = true			//!< ������ �� ���������� ���� ���������� �� ������ �����
+	const char *szName,			//!< передваваемое имя подсистемы
+	bool isUnic = true			//!< должна ли подсистема быть уникальной на основе имени
 	);
 
-//! ����������� ����
+//! уничтожение либы
 SX_LIB_API void SLevel_AKill();
 
 //#############################################################################
 
-//! ������� ������
+//! очистка уровня
 SX_LIB_API void SLevel_Clear();					
 
-//! �������� ������
+//! загрузка уровня
 SX_LIB_API void SLevel_Load(const char *szName, bool isGame);	
 
-//! ���������� ������
+//! сохранение уровня
 SX_LIB_API void SLevel_Save(const char *szName);
 
-//! ���������� � ���������� ��� ������
+//! возвращает и записывает имя уровня
 SX_LIB_API const char* SLevel_GetName(char *szName=0);
 
 
-//! �������� ����� � ����� � ��������
+//! загрузка файла с инфой о частицах
 SX_LIB_API void SLevel_LoadParticles();			
 
-//! ���������� ����� � ����� � ��������
+//! сохранение файла с инфой о частицах
 SX_LIB_API void SLevel_SaveParticles();			
 
 //#############################################################################
 
-/*! defgroup sxgame_ambient_snd ������� ����� ���������
-\ingroup sxgame
-\note ����� ����������� ����������
-\note ���� �� ����� ������������ ���������� �� �������
+/*! \defgroup sxlevel_ambient_snd Фоновые звуки окружения
+\ingroup sxlevel
+\note Звуки проигрывают поочередно
+\note Путь до звука относительно директории со звуками
 @{
 */
 
-//! �������� ����
+//! добавить звук
 SX_LIB_API void SLevel_AmbientSndAdd(const char* path);
 
-//! ���������� ����� ���������� ����������� ������
+//! возвращает общее количество загруженных звуков
 SX_LIB_API UINT SLevel_AmbientSndGetCount();
 
-//! � path ���������� ���� �� ����� �� ��� id
+//! в path записывает путь до звука по его id
 SX_LIB_API void SLevel_AmbientSndGet(ID id, char* path);
 
-//! ������� ������ ������
+//! очистка списка звуков
 SX_LIB_API void SLevel_AmbientSndClear();
 
-//! ������ ������������ ������
+//! начать проигрывание звуков
 SX_LIB_API void SLevel_AmbientSndPlay();
 
-//! ���������� ������������
+//! обновление проигрывания
 SX_LIB_API void SLevel_AmbientSndUpdate();
 
-//! ����� ������������
+//! пауза проигрывания
 SX_LIB_API void SLevel_AmbientSndPause();
 
-//! ���������� "������������� �� �����"
+//! возвращает "проигрываются ли звуки"
 SX_LIB_API bool SLevel_AmbientSndGetPlaying();
 
-//!@} sxgame_ambient_snd
+//!@} sxlevel_ambient_snd
 
 //#############################################################################
 
-/*! defgroup sxgame_weather ������� ����� ���������
-\ingroup sxgame
-\note ����� ������ ���������� �� ��������� �������� �������
-\note ��� ����� ������ ��� ��������� ���������� �������� ������������ ������ �� ������� ������ � ������� �� ��������� �������� �������, ������� #SXLevel_WeatherUpdate ���������� �������� � �������� ����� (� �������) ��� ������ �����
-
-����-������ ������� ��:
-- �������� ������ (sections) � ������� ������ ���������� ����� ������ �� �������, � ������� ��� ����� 01:11:12 ��� ������ ��� ���� �������� ��� ������ � ������� ��� 1 ���� ���� 11 ����� � 12 ������
-- ������ � ����������� ������ (��� ������� ���������� �������)
-- ������ � ����������� ��������� ������, ���� ������� ������� \n
-
-������ ������ ������� ��:
-- sky_texture - ��� �������� ��� ���������
-- sky_rotation - ���� �������� ��������� (� ��������)
-- sky_color - ���� ���� float4 [0-1] ��� ������ ��� ���������� ��� ��� ����, � ��������� ���������� �� ������� ����� �������� ����
-- clouds_texture - �������� �������
-- clouds_color - ���� ������� float4 [0-1] ��� ������ ��� ���������� ��� ��� ����, � ��������� ���������� �� ������� ����� �������� ����
-- clouds_rotate - ������� ������� (� ��������)
-- clouds_transparency - ������������ ������� [0-1]
-- clouds_speed - �������� �������� �������
-- sun_texture - �������� ������, ���� ������� 0 �� ������ ����� ���������
-- sun_color - ���� ������ � ��������� �� ������ float3 [0-1]
-- sun_pos - ������� ������ � �������� �� ��� X � Z
-- far - ��������� ���������
-- rain_density ��������� ����� [0-1]
-- rain_color - ���� ����� float4 [0-1] ��� ������ ��� ���������� ��� ��� ����, � ��������� ���������� �� ������� ����� �������� ����
-- thunderbolt - ����� �� ������
-- thunder_period - ������������ ������ ������ ������
-- fog_color - ���� ������ float3 [0-1]
-- fog_density - ��������� ������
-- env_ambient - ��� ������ � ���������� ������� ��� ������ ������ \n
-
-��� ����� � ������ ������ �����������, �� ����������� env_ambient \n
-��� ���������� �������� ����������� \n
-
-������ � ���������� ������� ������� ��:
-- period - ���������� (� �����) ����� ���������������� UINT2 (�� � ��), ���������� ��������
-- volume - ��������� (� ���������) ��������������� UINT2 (�� � ��), ���������� ��������
-- sounds - ������ ������ ����� �������
+/*! \defgroup sxlevel_weather Погода
+\ingroup sxlevel
+\note Смена погоды происходит на основании игрового времени
+\note При смене погоды для некоторых параметров возможна интерполяция данных от прошлой погоды к текущей на основании игрового времени, поэтому #SLevel_WeatherUpdate необходимо вызывать в основном цикле (в рендере) для планой смены
+
+Файл-конфиг состоит из:
+- основной секции (sections) с набором ключей содержащих имена секций по времени, к примеру имя ключа 01:11:12 это значит что ключ содержит имя секции с погодой для 1 часа ночи 11 минут и 12 секунд
+- секции с параметрами погоды (для каждого указанного времени)
+- секции с параметрами рандомных звуков, если таковые имеются \n
+
+Секции погоды состоят из:
+- sky_texture - имя текстуры для скайбокса
+- sky_rotation - угол поворота скайбокса (в радианах)
+- sky_color - цвет неба float4 [0-1] где первые три компоненты это сам цвет, а четвертая компонента на сколько будет применен цвет
+- clouds_texture - текстура облаков
+- clouds_color - цвет облаков float4 [0-1] где первые три компоненты это сам цвет, а четвертая компонента на сколько будет применен цвет
+- clouds_rotate - поворот облаков (в радианах)
+- clouds_transparency - прозрачность облаков [0-1]
+- clouds_speed - скорость движения облаков
+- sun_texture - текстура солнца, если указать 0 то солнце будет выключено
+- sun_color - цвет солнца и освещения от солнца float3 [0-1]
+- sun_pos - позиция сонлца в градусах по оси X и Z
+- far - дальность видимости
+- rain_density плотность дождя [0-1]
+- rain_color - цвет дождя float4 [0-1] где первые три компоненты это сам цвет, а четвертая компонента на сколько будет применен цвет
+- thunderbolt - будет ли молния
+- thunder_period - перидичность звуков ударов молнии
+- fog_color - цвет тумана float3 [0-1]
+- fog_density - плотность тумана
+- env_ambient - имя секции с рандомными звуками для данной погоды \n
+
+Все ключи в секции погоды обязательны, за исключением env_ambient \n
+Все компоненты векторов обязательны \n
+
+Секция с рандомными звуками состоит из:
+- period - промежуток (в млсек) между воспроизведением UINT2 (от и до), выбирается случайно
+- volume - громкость (в процентах) воспроизведения UINT2 (от и до), выбирается случайно
+- sounds - список звуков через запятую
 
 @{
 */
 
-//! �������� ������� ������
+//! загрузка конфига погоды
 SX_LIB_API void SLevel_WeatherLoad(const char* path);
 
-//! ���������� ������
+//! обновление погоды
 SX_LIB_API void SLevel_WeatherUpdate();
 
-//! ���������� ������� ��������� �����
+//! возвращает текущую плотность дождя
 SX_LIB_API float SLevel_WeatherGetCurrRainDensity();
 
-//! ������ ��������������� ������ ������
+//! начать воспроизведение звуков погоды
 SX_LIB_API void SLevel_WeatherSndPlay();
 
-//! ������������� ��������������� ������ ������
+//! приостановить воспроизведение звуков погоды
 SX_LIB_API void SLevel_WeatherSndPause();
 
-//! ���������� "��������������� �� ����� ������"
+//! возвращает "воспроизводятся ли звуки погоды"
 SX_LIB_API bool SLevel_WeatherSndIsPlaying();
 
-//!@} sxgame_weather
+//!@} sxlevel_weather
+
+//!@} sxlevel
 
 #endif
\ No newline at end of file
diff --git a/source/level/weather.cpp b/source/level/weather.cpp
index 1e1d7a90a00fe08247beba3de14ad705350f13e5..e5c227ee0966d198e7bd7b96e0607a746bf015fb 100644
--- a/source/level/weather.cpp
+++ b/source/level/weather.cpp
@@ -87,7 +87,7 @@ void CWeatherRndSnd::update()
 	if (!m_isPlaying)
 		return;
 
-	static const float * weather_snd_volume = GET_PCVAR_FLOAT("weather_snd_volume");
+	static const float * env_weather_snd_volume = GET_PCVAR_FLOAT("env_weather_snd_volume");
 
 	if (m_aCurrSndIDs.size() > 0 && (m_ulNextPlay == 0 || m_ulNextPlay < TimeGetMls(Core_RIntGet(G_RI_INT_TIMER_RENDER))))
 	{
@@ -97,7 +97,7 @@ void CWeatherRndSnd::update()
 			m_idCurrPlay = m_aCurrSndIDs[tmpkeysnd];
 			SSCore_SndPosCurrSet(m_idCurrPlay, 0);
 			int tmprndvol = (rand() % (m_iVolumeE - m_iVolumeB)) + m_iVolumeB;
-			SSCore_SndVolumeSet(m_idCurrPlay, (long)(weather_snd_volume ? (float)tmprndvol * (*weather_snd_volume) : tmprndvol), SOUND_VOL_PCT);
+			SSCore_SndVolumeSet(m_idCurrPlay, (long)(env_weather_snd_volume ? (float)tmprndvol * (*env_weather_snd_volume) : tmprndvol), SOUND_VOL_PCT);
 			SSCore_SndPlay(m_idCurrPlay);
 
 			DWORD tmprnd = (rand() % (m_ulPeriodE - m_ulPeriodB)) + m_ulPeriodB;
@@ -559,7 +559,7 @@ void CWeather::update()
 
 	ID gid = SML_LigthsGetGlobal();
 
-	static const float * weather_snd_volume = GET_PCVAR_FLOAT("weather_snd_volume");
+	static const float * env_weather_snd_volume = GET_PCVAR_FLOAT("env_weather_snd_volume");
 
 	//если есть дождь то обновл¤ем его позицию и громкость
 	if (m_iSectionCurr >= 0 && (int)m_aTimeSections.size() > m_iSectionCurr && m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity > 0.f)
@@ -570,14 +570,14 @@ void CWeather::update()
 		updateRainSound();
 	}
 
-	static float * main_rain_density = (float*)GET_PCVAR_FLOAT("main_rain_density");
-	static float main_rain_density_old = 1.f;
+	static float * env_default_rain_density = (float*)GET_PCVAR_FLOAT("env_default_rain_density");
+	static float env_default_rain_density_old = 1.f;
 
-	if (main_rain_density && (*main_rain_density) != main_rain_density_old)
+	if (env_default_rain_density && (*env_default_rain_density) != env_default_rain_density_old)
 	{
-		main_rain_density_old = *main_rain_density;
+		env_default_rain_density_old = *env_default_rain_density;
 		if (m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity > 0.f)
-			SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, main_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
+			SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, env_default_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
 	}
 
 	//получаем текущую игровую дату
@@ -638,7 +638,7 @@ void CWeather::update()
 		if (m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity > 0.f)
 		{
 			SPE_EmitterSet(m_idEffRain, 0, Color, m_aTimeSections[m_iSectionCurr].m_DataSection.m_vRainColor);
-			SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, main_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
+			SPE_EmitterSet(m_idEffRain, 0, ReCreateCount, env_default_rain_density_old * m_aTimeSections[m_iSectionCurr].m_DataSection.m_fRainDensity * float(WEATHER_RAIN_RECREATE_COUNT));
 			SPE_EffectEnableSet(m_idEffRain, true);
 
 			SSCore_SndPosCurrSet(m_idSndRain, 0);
@@ -727,7 +727,7 @@ void CWeather::update()
 
 		//дальность видимости
 		float tmpfar = lerpf(m_aTimeSections[m_iSectionOld].m_DataSection.m_fFar, m_aTimeSections[m_iSectionCurr].m_DataSection.m_fFar, lerp_factor);
-		Core_0SetCVarFloat("p_far", tmpfar);
+		Core_0SetCVarFloat("r_far", tmpfar);
 
 		//плотность тумана
 		static float * pp_fog_density = (float*)GET_PCVAR_FLOAT("pp_fog_density");
@@ -756,9 +756,9 @@ void CWeather::update()
 		//иначе если предыдущее врем¤ грозы нулевое и врем¤ следующей грозы наступило
 		else if (m_ulTimeBoltLast == 0 && TimeGetMls(Core_RIntGet(G_RI_INT_TIMER_RENDER)) >= m_ulTimeBoltNext)
 		{
-			static const bool * main_thunderbolt = GET_PCVAR_BOOL("main_thunderbolt");
+			static const bool * env_default_thunderbolt = GET_PCVAR_BOOL("env_default_thunderbolt");
 			//если предусмотерна молни¤ то показываем
-			if (m_aTimeSections[m_iSectionCurr].m_DataSection.m_hasThunderbolt && (!main_thunderbolt || (main_thunderbolt && *main_thunderbolt)))
+			if (m_aTimeSections[m_iSectionCurr].m_DataSection.m_hasThunderbolt && (!env_default_thunderbolt || (env_default_thunderbolt && *env_default_thunderbolt)))
 			{
 				static float3 campos;
 				Core_RFloat3Set(G_RI_FLOAT3_OBSERVER_POSITION, &campos);
@@ -776,7 +776,7 @@ void CWeather::update()
 			else
 			{
 				SSCore_SndPosCurrSet(m_idSndThunder, 0);
-				SSCore_SndVolumeSet(m_idSndThunder, (weather_snd_volume ? (*weather_snd_volume) : 1.f) * 100.f, SOUND_VOL_PCT);
+				SSCore_SndVolumeSet(m_idSndThunder, (env_weather_snd_volume ? (*env_weather_snd_volume) : 1.f) * 100.f, SOUND_VOL_PCT);
 
 				if (m_isPlaying)
 					SSCore_SndPlay(m_idSndThunder);
@@ -823,7 +823,7 @@ void CWeather::updateRainSound()
 	if (m_idEffRain < 0 || !m_isPlaying)
 		return;
 
-	static const float * weather_snd_volume = GET_PCVAR_FLOAT("weather_snd_volume");
+	static const float * env_weather_snd_volume = GET_PCVAR_FLOAT("env_weather_snd_volume");
 
 	//если пришло врем¤ обновл¤ть громкость
 	if (m_ulTimeRainVolSndLast == 0 || TimeGetMls(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - m_ulTimeRainVolSndLast >= WEATHER_RAIN_VOL_SND_UPDATE)
@@ -854,7 +854,7 @@ void CWeather::updateRainSound()
 	}
 
 	m_fRainVolume /= tmpcount / 4;
-	SSCore_SndVolumeSet(m_idSndRain, (weather_snd_volume ? (*weather_snd_volume) : 1.f) *  m_fRainVolume * 100.f, SOUND_VOL_PCT);
+	SSCore_SndVolumeSet(m_idSndRain, (env_weather_snd_volume ? (*env_weather_snd_volume) : 1.f) *  m_fRainVolume * 100.f, SOUND_VOL_PCT);
 }
 
 float CWeather::getCurrRainDensity()
diff --git a/source/mtllight/light.cpp b/source/mtllight/light.cpp
index 2ec8c0a778299777a27631531999c1c1d4316c60..2ce59c31ff6a80cc4e3b4feecf12f367442b85d2 100644
--- a/source/mtllight/light.cpp
+++ b/source/mtllight/light.cpp
@@ -5,11 +5,11 @@ Lights::Lights()
 {
 	HowShadow = 0;
 
-	const int *winr_width = GET_PCVAR_INT("winr_width");
-	const int *winr_height = GET_PCVAR_INT("winr_height");
+	const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
-	ShadowMap = SGCore_RTAdd(*winr_width, *winr_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "shadowmap", 1);
-	ShadowMap2 = SGCore_RTAdd(*winr_width, *winr_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "shadowmap2", 1);
+	ShadowMap = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "shadowmap", 1);
+	ShadowMap2 = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "shadowmap2", 1);
 
 	GlobalLight = -1;
 	m_isCastGlobalShadow = false;
@@ -1257,11 +1257,11 @@ void Lights::ShadowSoft(bool randomsam, float size, bool isfirst)
 	if (isfirst)
 		HowShadow = 0;
 
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	LPDIRECT3DSURFACE9 RenderSurf,BackBuf;
 
@@ -1299,13 +1299,13 @@ void Lights::ShadowSoft(bool randomsam, float size, bool isfirst)
 	
 		if(randomsam)
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "PixelSize", &float2_t(size / float(*winr_width), size / float(*winr_height)));
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "NearFar", &float2_t(*p_near, *p_far));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "PixelSize", &float2_t(size / float(*r_win_width), size / float(*r_win_height)));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBasedNoise, "NearFar", &float2_t(*r_near, *r_far));
 		}
 		else
 		{
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "PixelSize", &float2_t(size / float(*winr_width), size / float(*winr_height)));
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "NearFar", &float2_t(*p_near, *p_far));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "PixelSize", &float2_t(size / float(*r_win_width), size / float(*r_win_height)));
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PPBlurDepthBased, "NearFar", &float2_t(*r_near, *r_far));
 		}
 
 	
@@ -1326,10 +1326,10 @@ void Lights::ShadowSoft(bool randomsam, float size, bool isfirst)
 
 void Lights::ToneMappingCom(DWORD timeDelta, float factor_adapted)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
-	MLSet::GetArrDownScale4x4(*winr_width, *winr_height, MLSet::HDRSampleOffsets);
+	MLSet::GetArrDownScale4x4(*r_win_width, *r_win_height, MLSet::HDRSampleOffsets);
 
 	LPDIRECT3DSURFACE9 SurfSceneScale, BackBuf;
 
diff --git a/source/mtllight/material.cpp b/source/mtllight/material.cpp
index c9abad27f6880f81f9f1e12ac2e1aa886c9cad9a..03cb3ba29402ed55e980e593ea88f11b08a9974c 100644
--- a/source/mtllight/material.cpp
+++ b/source/mtllight/material.cpp
@@ -1892,11 +1892,11 @@ void Materials::Render(ID id, float4x4* world)
 {
 	MTL_PRE_COND_ID(id);
 
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	if (!world)
 		world = &(SMMatrixIdentity());
@@ -2074,10 +2074,10 @@ void Materials::Render(ID id, float4x4* world)
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "TimeDelta", &float2(CountTimeDelta, float(CurrTimeDelta) * 0.001f));
 
 	if (tmpmaterial->VS.IsTransWinSize)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "WinSize", &float2_t(*winr_width, *winr_height));
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "WinSize", &float2_t(*r_win_width, *r_win_height));
 
 	if (tmpmaterial->PS.IsTransWinSize)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "WinSize", &float2_t(*winr_width, *winr_height));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "WinSize", &float2_t(*r_win_width, *r_win_height));
 
 	//если материалом назначен альфа тест и не включен принудительный
 	if (tmpmaterial->IsAlphaTest && !IsForceblyAlphaTest)
@@ -2125,7 +2125,7 @@ void Materials::Render(ID id, float4x4* world)
 		if (tmpmaterial->LightParam.TypeRefraction == MTLTYPE_TRANSPARENCY_ALPHA_LIGHT)
 			++(CurrIdSurf);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "NearFarIsUnlit", &float4_t(*p_near, *p_far, zz, float(CurrIdSurf) / 255.f));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "NearFarIsUnlit", &float4_t(*r_near, *r_far, zz, float(CurrIdSurf) / 255.f));
 	}
 }
 
diff --git a/source/mtllight/ml_data.cpp b/source/mtllight/ml_data.cpp
index 2cdbc1556d3e19a91d16f64a68d98912cc871ea5..4f786f7dd1fd64a6b8fda2de2602e3569a298e26 100644
--- a/source/mtllight/ml_data.cpp
+++ b/source/mtllight/ml_data.cpp
@@ -30,14 +30,14 @@ namespace MLSet
 
 	void ReCalcSize()
 	{
-		static const int *winr_width = GET_PCVAR_INT("winr_width");
-		static const int *winr_height = GET_PCVAR_INT("winr_height");
+		static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+		static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
-		SizeTexDepthGlobal.x = float(*winr_width) * CoefSizeDepthMapForGlobal;
-		SizeTexDepthGlobal.y = float(*winr_height) * CoefSizeDepthMapForGlobal;
+		SizeTexDepthGlobal.x = float(*r_win_width) * CoefSizeDepthMapForGlobal;
+		SizeTexDepthGlobal.y = float(*r_win_height) * CoefSizeDepthMapForGlobal;
 
-		SizeTexDepthLocal.x = float(*winr_width) * CoefSizeDepthMapForLocal;
-		SizeTexDepthLocal.y = float(*winr_height) * CoefSizeDepthMapForLocal;
+		SizeTexDepthLocal.x = float(*r_win_width) * CoefSizeDepthMapForLocal;
+		SizeTexDepthLocal.y = float(*r_win_height) * CoefSizeDepthMapForLocal;
 	}
 
 	void GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]);
@@ -171,8 +171,8 @@ void MLSet::MLInit()
 {
 	MLSet::DXDevice = SGCore_GetDXDevice();
 
-	const int *winr_width = GET_PCVAR_INT("winr_width");
-	const int *winr_height = GET_PCVAR_INT("winr_height");
+	const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
@@ -322,7 +322,7 @@ void MLSet::MLInit()
 
 	//////////
 	float tmpcoefsizert = 1;
-	float2_t tmp_sizert = float2_t(float(*winr_width) * tmpcoefsizert, (*winr_height) * tmpcoefsizert);
+	float2_t tmp_sizert = float2_t(float(*r_win_width) * tmpcoefsizert, (*r_win_height) * tmpcoefsizert);
 
 	//цвет (текстуры)
 	MLSet::IDsRenderTargets::ColorScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_color", tmpcoefsizert);
@@ -345,7 +345,7 @@ void MLSet::MLInit()
 	while (true)
 	{
 		int tmpsize = 1 << (2 * tmpcount);
-		if (tmpsize >= float(*winr_width)*0.25 || tmpsize > (*winr_height)*0.25)
+		if (tmpsize >= float(*r_win_width)*0.25 || tmpsize > (*r_win_height)*0.25)
 			break;
 		MLSet::IDsRenderTargets::ToneMaps[tmpcount] = SGCore_RTAdd(tmpsize, tmpsize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "qq", 0);
 		MLSet::IDsRenderTargets::SurfToneMap[tmpcount] = 0;
@@ -356,13 +356,13 @@ void MLSet::MLInit()
 	MLSet::IDsRenderTargets::AdaptLumCurr = SGCore_RTAdd(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "", 0);
 	MLSet::IDsRenderTargets::AdaptLumLast = SGCore_RTAdd(1, 1, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "", 0);
 
-	MLSet::IDsRenderTargets::LigthCom = SGCore_RTAdd(*winr_width, *winr_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcom", 1);
-	MLSet::IDsRenderTargets::LigthCom2 = SGCore_RTAdd(*winr_width, *winr_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcom2", 1);
-	MLSet::IDsRenderTargets::LigthCom3 = SGCore_RTAdd(*winr_width, *winr_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_lightcom3", 1);
+	MLSet::IDsRenderTargets::LigthCom = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcom", 1);
+	MLSet::IDsRenderTargets::LigthCom2 = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcom2", 1);
+	MLSet::IDsRenderTargets::LigthCom3 = SGCore_RTAdd(*r_win_width, *r_win_height, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_lightcom3", 1);
 	
-	MLSet::IDsRenderTargets::LigthComScaled = SGCore_RTAdd(float(*winr_width)*0.25f, float(*winr_height)*0.25f, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcomscaled", 0.25);
+	MLSet::IDsRenderTargets::LigthComScaled = SGCore_RTAdd(float(*r_win_width)*0.25f, float(*r_win_height)*0.25f, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A16B16G16R16F, D3DPOOL_DEFAULT, "ds_lightcomscaled", 0.25);
 
-	MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*winr_width) / float(*winr_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);
+	MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);
 	MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);
 }
 
diff --git a/source/mtllight/shadow.cpp b/source/mtllight/shadow.cpp
index 76b0a9d199c324918b1e44501d43661e18d9a0cc..20c69f5ee6a3fb3248ea1eeab6b279d011208460 100644
--- a/source/mtllight/shadow.cpp
+++ b/source/mtllight/shadow.cpp
@@ -115,8 +115,8 @@ void PSSM::OnLostDevice()
 
 void PSSM::OnResetDevice()
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
@@ -135,7 +135,7 @@ void PSSM::OnResetDevice()
 	MLSet::DXDevice->CreateDepthStencilSurface(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, D3DFMT_D24X8,D3DMULTISAMPLE_NONE, 0, TRUE, &DepthStencilSurface, NULL);
 	
 	FovRatio.x = *r_default_fov;
-	FovRatio.y = float(*winr_width) / float(*winr_height);
+	FovRatio.y = float(*r_win_width) / float(*r_win_height);
 
 	float2 fOffset = float2(0.5, 0.5) - (float2(0.5f, 0.5f) / MLSet::SizeTexDepthGlobal);
 	float range = 1.0f;
@@ -148,16 +148,16 @@ void PSSM::OnResetDevice()
 
 void PSSM::Init()
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	FovRatio.x = *r_default_fov;
-	FovRatio.y = float(*winr_width) / float(*winr_height);
+	FovRatio.y = float(*r_win_width) / float(*r_win_height);
 
 		for(int i=0;i<5;i++)
 		{
@@ -170,7 +170,7 @@ void PSSM::Init()
 			Frustums[i] = SGCore_CrFrustum();
 		}
 
-	NearFar[0].x = *p_near;
+	NearFar[0].x = *r_near;
 	NearFar[0].y = MLSet::DistForPSSM.x;
 
 	NearFar[1].x = MLSet::DistForPSSM.x;
@@ -183,8 +183,8 @@ void PSSM::Init()
 	NearFar[3].y = MLSet::DistForPSSM.w;
 
 
-	NearFar[4].x = *p_near;
-	NearFar[4].y = *p_far;
+	NearFar[4].x = *r_near;
+	NearFar[4].y = *r_far;
 
 	MLSet::DXDevice->CreateDepthStencilSurface(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, D3DFMT_D24X8,D3DMULTISAMPLE_NONE, 0, TRUE, &DepthStencilSurface, NULL);
 	
@@ -200,13 +200,13 @@ void PSSM::Init()
 
 void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
 	FovRatio.x = *r_default_fov;
-	FovRatio.y = float(*winr_width) / float(*winr_height);
+	FovRatio.y = float(*r_win_width) / float(*r_win_height);
 
 	Frustums[split]->Update(&(Views[split]), &(Projs[split]));
 
@@ -415,13 +415,13 @@ void PSSM::Flickering(float4x4 *matLVP,float size_x,float size_y)
 
 void PSSM::GenShadow2(IDirect3DTexture9* shadowmap)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 
@@ -468,8 +468,8 @@ void PSSM::GenShadow2(IDirect3DTexture9* shadowmap)
 	float3 observerpos;
 	Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &observerpos);
 	
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*winr_width, *winr_height, *r_default_fov));
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*p_near, *p_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*r_near, *r_far));
 	
 	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ViewInv", &ViewInv);
 
@@ -477,14 +477,14 @@ void PSSM::GenShadow2(IDirect3DTexture9* shadowmap)
 	{
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "PosCam", &observerpos);
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "PixelSize", &float2(BlurPixel / MLSet::SizeTexDepthGlobal.x, BlurPixel / MLSet::SizeTexDepthGlobal.y));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "NearFar", &float2_t(*p_near, *p_far));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "NearFar", &float2_t(*r_near, *r_far));
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "DistSplit", &float4(NearFar[0].y, NearFar[1].y, NearFar[2].y, NearFar[3].y));
 	}
 	else
 	{
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "PosCam", &observerpos);
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "PixelSize", &float2(BlurPixel / MLSet::SizeTexDepthGlobal.x, BlurPixel / MLSet::SizeTexDepthGlobal.y));
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "NearFar", &float2_t(*p_near, *p_far));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "NearFar", &float2_t(*r_near, *r_far));
 		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "DistSplit", &float4(NearFar[0].y, NearFar[1].y, NearFar[2].y, NearFar[3].y));
 	}
 
@@ -742,13 +742,13 @@ void ShadowMapTech::End()
 
 void ShadowMapTech::GenShadow2(IDirect3DTexture9* shadowmap)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 	shadowmap->GetSurfaceLevel(0, &RenderSurf);
@@ -786,8 +786,8 @@ void ShadowMapTech::GenShadow2(IDirect3DTexture9* shadowmap)
 	else
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowDirect9);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*winr_width, *winr_height, *r_default_fov));
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*p_near, *p_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*r_near, *r_far));
 
 	float3 observerpos;
 	Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &observerpos);
@@ -1082,13 +1082,13 @@ void ShadowMapCubeTech::End()
 
 void ShadowMapCubeTech::GenShadow2(IDirect3DTexture9* shadowmap)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 
@@ -1116,8 +1116,8 @@ void ShadowMapCubeTech::GenShadow2(IDirect3DTexture9* shadowmap)
 	else
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::GenShadowCube6);
 
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*winr_width, *winr_height, *r_default_fov));
-	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*p_near, *p_far));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "ParamProj", &float3_t(*r_win_width, *r_win_height, *r_default_fov));
+	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::ResPosDepth, "NearFar", &float2_t(*r_near, *r_far));
 
 	float pixel_size = BlurPixel / MLSet::SizeTexDepthLocal.x;
 	float3 observerpos;
diff --git a/source/mtllight/sxmtllight.cpp b/source/mtllight/sxmtllight.cpp
index 859d23c7727b03061e3c153343efbf8d01225c46..219108b7021ee5a8237b3dcc098c0e03576fecd4 100644
--- a/source/mtllight/sxmtllight.cpp
+++ b/source/mtllight/sxmtllight.cpp
@@ -111,15 +111,15 @@ SX_LIB_API void SML_OnResetDevice()
 
 SX_LIB_API void SML_Update(DWORD timeDelta)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
 	if (ArrMaterials)
 		ArrMaterials->Update(timeDelta);
 
-	MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*winr_width) / float(*winr_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);
+	MLSet::RefMProjPlane = SMMatrixPerspectiveFovLH(*r_default_fov, float(*r_win_width) / float(*r_win_height), MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);
 	MLSet::RefMProjCube = SMMatrixPerspectiveFovLH(SM_PI * 0.5f, 1, MTl_REF_PROJ_NEAR, MTl_REF_PROJ_FAR);
 }
 
diff --git a/source/particles/emitter.cpp b/source/particles/emitter.cpp
index 58dff55a7e7d7e4fc2c4acce7e072729c9c19e0d..8c50a071e630ab8d262f2ac6b120958630738216 100644
--- a/source/particles/emitter.cpp
+++ b/source/particles/emitter.cpp
@@ -1199,8 +1199,8 @@ void Emitter::Compute(const float4x4 * mat)
 
 void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
 {
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	if (!Enable)
 		return;
@@ -1249,8 +1249,8 @@ void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
 		static float2_t NearFar;
 		static float3 ConstCamPos;
 		Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &ConstCamPos);
-		NearFar.x = *p_near;
-		NearFar.y = *p_far;
+		NearFar.x = *r_near;
+		NearFar.y = *r_far;
 
 		Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &MCamView);
 		Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &MCamProj);
diff --git a/source/pp/sxpp.cpp b/source/pp/sxpp.cpp
index a61f36382ece4b0497dc09b30de1271a0f0f4d2b..4bfeb1322340988df81555422a52223e4d3771f4 100644
--- a/source/pp/sxpp.cpp
+++ b/source/pp/sxpp.cpp
@@ -112,12 +112,12 @@ namespace PPSet
 
 void PPSet::Init()
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	PPSet::DXDevice = SGCore_GetDXDevice();
-	PPSet::WinSize.x = *winr_width;
-	PPSet::WinSize.y = *winr_height;
+	PPSet::WinSize.x = *r_win_width;
+	PPSet::WinSize.y = *r_win_height;
 	Core_SetOutPtr();
 	PPSet::IDsShaders::VS::ResPos = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "pp_res_pos.vs", "pp_quad_render_res_pos", SHADER_CHECKDOUBLE_PATH);
 
@@ -316,11 +316,11 @@ SX_LIB_API void SPP_Update()
 {
 	PP_PRECOND(_VOID);
 	
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
@@ -332,13 +332,13 @@ SX_LIB_API void SPP_Update()
 	Core_RMatrixGet(G_RI_MATRIX_OBSERVER_VIEW, &PPSet::MCamView);
 	Core_RMatrixGet(G_RI_MATRIX_OBSERVER_PROJ, &PPSet::MCamProj);
 
-	PPSet::WinSize.x = *winr_width;
-	PPSet::WinSize.y = *winr_height;
+	PPSet::WinSize.x = *r_win_width;
+	PPSet::WinSize.y = *r_win_height;
 
 	PPSet::ProjRatio = PPSet::WinSize.x / PPSet::WinSize.y;
 
-	PPSet::NearFar.x = *p_near;
-	PPSet::NearFar.y = *p_far;
+	PPSet::NearFar.x = *r_near;
+	PPSet::NearFar.y = *r_far;
 
 	PPSet::ProjFov = *r_default_fov;
 }
diff --git a/source/render/gdata.cpp b/source/render/gdata.cpp
index e1b2f2032c93c94e5bfac42227f06a0201fbfc53..4afa522465fdf01f674d5253cebbe01919517919 100644
--- a/source/render/gdata.cpp
+++ b/source/render/gdata.cpp
@@ -89,17 +89,17 @@ namespace GData
 
 void GData::InitAllMatrix()
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 	static float2_t vWinSize;
-	vWinSize = float2(*winr_width, *winr_height);
+	vWinSize = float2(*r_win_width, *r_win_height);
 
-	static const float *p_near = GET_PCVAR_FLOAT("p_near");
-	static const float *p_far = GET_PCVAR_FLOAT("p_far");
+	static const float *r_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	GData::NearFar.x = *p_near;
-	GData::NearFar.y = *p_far;
+	GData::NearFar.x = *r_near;
+	GData::NearFar.y = *r_far;
 	GData::ProjFov = *r_default_fov;
 
 	GData::MCamProj = SMMatrixPerspectiveFovLH(GData::ProjFov, vWinSize.x / vWinSize.y, GData::NearFar.x, GData::NearFar.y);
diff --git a/source/render/render_func.cpp b/source/render/render_func.cpp
index a42ac435ad607d0526ba683cbf552ab63035124e..1a2c1edaf5f81a2dc16be7decf4a72d337fb1d3f 100644
--- a/source/render/render_func.cpp
+++ b/source/render/render_func.cpp
@@ -62,41 +62,41 @@ inline void SXRenderFunc::SetSamplerAddress(DWORD begin_id, DWORD end_id, DWORD
 
 void SXRenderFunc::SetRenderSceneFilter()
 {
-	static const int * r_s_filter = GET_PCVAR_INT("r_s_filter");
-	static const int * r_s_max_anisotropy = GET_PCVAR_INT("r_s_max_anisotropy");
-	static const int * r_s_max_miplevel = GET_PCVAR_INT("r_s_max_miplevel");
+	static const int * r_texfilter_type = GET_PCVAR_INT("r_texfilter_type");
+	static const int * r_texfilter_max_anisotropy = GET_PCVAR_INT("r_texfilter_max_anisotropy");
+	static const int * r_texfilter_max_miplevel = GET_PCVAR_INT("r_texfilter_max_miplevel");
 
-	static int r_s_filter2 = 1;
-	static int r_s_max_anisotropy2 = 0;
-	static int r_s_max_miplevel2 = 0;
+	static int r_texfilter_type2 = 1;
+	static int r_texfilter_max_anisotropy2 = 0;
+	static int r_texfilter_max_miplevel2 = 0;
 
-	if (r_s_filter)
-		r_s_filter2 = (*r_s_filter);
+	if (r_texfilter_type)
+		r_texfilter_type2 = (*r_texfilter_type);
 	else
-		r_s_filter2 = 1;
+		r_texfilter_type2 = 1;
 
-	if (r_s_max_anisotropy)
-		r_s_max_anisotropy2 = (*r_s_max_anisotropy);
+	if (r_texfilter_max_anisotropy)
+		r_texfilter_max_anisotropy2 = (*r_texfilter_max_anisotropy);
 	else
-		r_s_max_anisotropy2 = 1;
+		r_texfilter_max_anisotropy2 = 1;
 
-	if (r_s_max_miplevel)
-		r_s_max_miplevel2 = (*r_s_max_miplevel);
+	if (r_texfilter_max_miplevel)
+		r_texfilter_max_miplevel2 = (*r_texfilter_max_miplevel);
 	else
-		r_s_max_miplevel2 = 1;
+		r_texfilter_max_miplevel2 = 1;
 	
-	if (r_s_filter2 == 0)
+	if (r_texfilter_type2 == 0)
 		SetSamplerFilter(0, 16, D3DTEXF_POINT);
-	else if (r_s_filter2 == 2)
+	else if (r_texfilter_type2 == 2)
 	{
 		for (int i = 0; i<16; ++i)
-			GData::DXDevice->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, r_s_max_anisotropy2);
+			GData::DXDevice->SetSamplerState(i, D3DSAMP_MAXANISOTROPY, r_texfilter_max_anisotropy2);
 		SetSamplerFilter(0, 16, D3DTEXF_ANISOTROPIC);
 	}
 	else
 		SetSamplerFilter(0, 16, D3DTEXF_LINEAR);
 
-	GData::DXDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, r_s_max_miplevel2);
+	GData::DXDevice->SetSamplerState(0, D3DSAMP_MAXMIPLEVEL, r_texfilter_max_miplevel2);
 
 	SetSamplerAddress(0, 16, D3DTADDRESS_WRAP);
 }
@@ -110,20 +110,20 @@ void SXRenderFunc::SetRenderSceneFilterUn()
 
 void SXRenderFunc::ComDeviceLost()
 {
-	static int *resize = (int*)GET_PCVAR_INT("resize");
+	static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
 
-	static int *winr_width = (int*)GET_PCVAR_INT("winr_width");
-	static int *winr_height = (int*)GET_PCVAR_INT("winr_height");
-	static const bool *winr_windowed = GET_PCVAR_BOOL("winr_windowed");
+	static int *r_win_width = (int*)GET_PCVAR_INT("r_win_width");
+	static int *r_win_height = (int*)GET_PCVAR_INT("r_win_height");
+	static const bool *r_win_windowed = GET_PCVAR_BOOL("r_win_windowed");
 
-	if (*resize != RENDER_RESIZE_CHANGE)
+	if (*r_resize != RENDER_RESIZE_CHANGE)
 	{
 		//получаем текущий размер окна в которое рисовали
 		RECT rect_scene;
 		GetClientRect(GData::Handle3D, &rect_scene);
 
-		*winr_width = rect_scene.right;
-		*winr_height = rect_scene.bottom;
+		*r_win_width = rect_scene.right;
+		*r_win_height = rect_scene.bottom;
 	}
 
 	//сбрасываем все что необходимо для восстановления устройства
@@ -133,8 +133,8 @@ void SXRenderFunc::ComDeviceLost()
 	SPE_OnLostDevice();
 
 	SXRenderFunc::InitModeWindow();
-	bool bf = SGCore_OnDeviceReset(*winr_width, *winr_height, *winr_windowed);
-	g_fnReportf(REPORT_MSG_LEVEL_WARNING, "winr_width %d, winr_height %d, winr_windowed %d \n", *winr_width, *winr_height, *winr_windowed);
+	bool bf = SGCore_OnDeviceReset(*r_win_width, *r_win_height, *r_win_windowed);
+	g_fnReportf(REPORT_MSG_LEVEL_WARNING, "r_win_width %d, r_win_height %d, r_win_windowed %d \n", *r_win_width, *r_win_height, *r_win_windowed);
 
 	if (bf)
 	{
@@ -144,7 +144,7 @@ void SXRenderFunc::ComDeviceLost()
 	else
 	{
 		GData::InitAllMatrix();
-		*resize = RENDER_RESIZE_NONE;
+		*r_resize = RENDER_RESIZE_NONE;
 		SGCore_OnResetDevice();
 		SML_OnResetDevice();
 		SGeom_OnResetDevice();
@@ -407,12 +407,12 @@ void SXRenderFunc::SaveWorkTex()
 
 void SXRenderFunc::InitModeWindow()
 {
-	static const bool *winr_windowed = GET_PCVAR_BOOL("winr_windowed");
+	static const bool *r_win_windowed = GET_PCVAR_BOOL("r_win_windowed");
 
-	if (winr_windowed == NULL)
+	if (r_win_windowed == NULL)
 		return;
 
-	if (!(*winr_windowed))
+	if (!(*r_win_windowed))
 	{
 		SetWindowLong(GData::Handle3D, GWL_STYLE, GetWindowLong(GData::Handle3D, GWL_STYLE) | WS_POPUP);
 		ShowWindow(GData::Handle3D, SW_MAXIMIZE);
@@ -429,32 +429,32 @@ void SXRenderFunc::InitModeWindow()
 
 void SXRenderFunc::ChangeModeWindow()
 {
-	/*static int * winr_width = (int*)GET_PCVAR_INT("winr_width");
-	*winr_width = 1280;
+	/*static int * r_win_width = (int*)GET_PCVAR_INT("r_win_width");
+	*r_win_width = 1280;
 
-	static int * winr_height = (int*)GET_PCVAR_INT("winr_height");
-	*winr_height = 768;
+	static int * r_win_height = (int*)GET_PCVAR_INT("r_win_height");
+	*r_win_height = 768;
 
 	return;*/
 
-	static bool *winr_windowed = (bool*)GET_PCVAR_BOOL("winr_windowed");
+	static bool *r_win_windowed = (bool*)GET_PCVAR_BOOL("r_win_windowed");
 
-	if (winr_windowed == NULL)
+	if (r_win_windowed == NULL)
 		return;
 
-	*winr_windowed = !(*winr_windowed);
+	*r_win_windowed = !(*r_win_windowed);
 
 	SXRenderFunc::InitModeWindow();
 
-	static int *resize = (int*)GET_PCVAR_INT("resize");
-	*resize = RENDER_RESIZE_CHANGE;
+	static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
+	*r_resize = RENDER_RESIZE_CHANGE;
 }
 
 void SXRenderFunc::FullScreenChangeSizeAbs()
 {
-	static bool *winr_windowed = (bool*)GET_PCVAR_BOOL("winr_windowed");
+	static bool *r_win_windowed = (bool*)GET_PCVAR_BOOL("r_win_windowed");
 
-	if (winr_windowed == NULL || (*winr_windowed))
+	if (r_win_windowed == NULL || (*r_win_windowed))
 		return;
 
 	int iCountModes = 0;
@@ -470,33 +470,33 @@ void SXRenderFunc::FullScreenChangeSizeAbs()
 		pModes = 0;
 	}
 
-	static int * winr_width = (int*)GET_PCVAR_INT("winr_width");
-	static int * winr_height = (int*)GET_PCVAR_INT("winr_height");
+	static int * r_win_width = (int*)GET_PCVAR_INT("r_win_width");
+	static int * r_win_height = (int*)GET_PCVAR_INT("r_win_height");
 
-	if (!winr_width || !winr_height)
+	if (!r_win_width || !r_win_height)
 		return;
 
-	static int winr_width_old = *winr_width;
-	static int winr_height_old = *winr_height;
+	static int r_win_width_old = *r_win_width;
+	static int r_win_height_old = *r_win_height;
 
-	if (*winr_width == iFullScreenWidth && *winr_height == iFullScreenHeight)
+	if (*r_win_width == iFullScreenWidth && *r_win_height == iFullScreenHeight)
 	{
-		*winr_width = winr_width_old;
-		*winr_height = winr_height_old;
+		*r_win_width = r_win_width_old;
+		*r_win_height = r_win_height_old;
 	}
 	else
 	{
-		winr_width_old = *winr_width;
-		winr_height_old = *winr_height;
+		r_win_width_old = *r_win_width;
+		r_win_height_old = *r_win_height;
 
-		*winr_width = iFullScreenWidth;
-		*winr_height = iFullScreenHeight;
+		*r_win_width = iFullScreenWidth;
+		*r_win_height = iFullScreenHeight;
 
 		//g_fnReportf(REPORT_MSG_LEVEL_WARNING, "iFullScreenWidth %d, iFullScreenHeight %d \n", iFullScreenWidth, iFullScreenHeight);
 	}
 
-	static int *resize = (int*)GET_PCVAR_INT("resize");
-	*resize = RENDER_RESIZE_CHANGE;
+	static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
+	*r_resize = RENDER_RESIZE_CHANGE;
 }
 
 //##########################################################################
@@ -555,15 +555,15 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char
 
 	++FrameCount;
 	TimeElapsed += ((float)timeDelta) * 0.001f;
-	static const int * rs_stats = GET_PCVAR_INT("rs_stats");
+	static const int * r_stats = GET_PCVAR_INT("r_stats");
 
 	static bool isNulled = false;
 		
-	if (TimeElapsed >= 1.0f && rs_stats)
+	if (TimeElapsed >= 1.0f && r_stats)
 	{
 		FpsValue = (float)FrameCount / TimeElapsed;
 
-		if ((*rs_stats) > 0)
+		if ((*r_stats) > 0)
 			sprintf(debugstr, "FPS %.1f\n", FpsValue);
 
 		if (needGameTime)
@@ -575,7 +575,7 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char
 			sprintf(debugstr + strlen(debugstr), "\nGame time : %d %d %d %d %d %d\n", 1900 + g_tm.tm_year, g_tm.tm_mon, g_tm.tm_mday, g_tm.tm_hour, g_tm.tm_min, g_tm.tm_sec);
 		}
 
-		if ((*rs_stats) == 2)
+		if ((*r_stats) == 2)
 		{
 			sprintf(debugstr + strlen(debugstr), szStr);
 		}
@@ -591,7 +591,7 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char
 	else
 		isNulled = false;
 			
-	if (rs_stats && (*rs_stats) > 0)
+	if (r_stats && (*r_stats) > 0)
 		SGCore_DbgMsg(debugstr);
 
 	return (isNulled ? FrameCount2 : 0);
@@ -601,10 +601,10 @@ int SXRenderFunc::OutputDebugInfo(DWORD timeDelta, bool needGameTime, const char
 
 void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 	static float2_t vWinSize;
-	vWinSize = float2(*winr_width, *winr_height);
+	vWinSize = float2(*r_win_width, *r_win_height);
 
 	SGCore_ShaderUnBind();
 
@@ -1008,8 +1008,8 @@ void SXRenderFunc::RenderSky(DWORD timeDelta)
 
 void SXRenderFunc::ComLighting(DWORD timeDelta)
 {
-	static int *winr_width = (int*)GET_PCVAR_INT("winr_width");
-	static int *winr_height = (int*)GET_PCVAR_INT("winr_height");
+	static int *r_win_width = (int*)GET_PCVAR_INT("r_win_width");
+	static int *r_win_height = (int*)GET_PCVAR_INT("r_win_height");
 
 	SGCore_ShaderUnBind();
 
@@ -1131,13 +1131,13 @@ void SXRenderFunc::ComLighting(DWORD timeDelta)
 				SML_LigthsShadowNull();	//очищаем рт генерации теней
 				SML_LigthsShadowGen(i);	//генерируем тень для света
 
-				static const int * shadow_soft = GET_PCVAR_INT("shadow_soft");
+				static const int * r_shadow_soft = GET_PCVAR_INT("r_shadow_soft");
 
-				if (shadow_soft)
+				if (r_shadow_soft)
 				{
-					if ((*shadow_soft) == 1)
+					if ((*r_shadow_soft) == 1)
 						SML_LigthsShadowSoft(false, 2);
-					else if ((*shadow_soft) == 2)
+					else if ((*r_shadow_soft) == 2)
 					{
 						SML_LigthsShadowSoft(false, 2);
 						SML_LigthsShadowSoft(false, 2);
@@ -1172,7 +1172,7 @@ void SXRenderFunc::ComLighting(DWORD timeDelta)
 
 			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "ViewInv", &ViewInv);
 			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "NearFar", &GData::NearFar);
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "ParamProj", &float3_t(*winr_width, *winr_height, GData::ProjFov));
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ResPos, "ParamProj", &float3_t(*r_win_width, *r_win_height, GData::ProjFov));
 
 			float3 tmpPosition;
 			float2 tmpPowerDist;
@@ -1279,8 +1279,8 @@ void SXRenderFunc::ComLighting(DWORD timeDelta)
 
 void SXRenderFunc::UnionLayers()
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	LPDIRECT3DSURFACE9 BackBuf, ComLightSurf;
 	GData::DXDevice->GetRenderTarget(0, &BackBuf);
@@ -1311,7 +1311,7 @@ void SXRenderFunc::UnionLayers()
 
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, GData::IDsShaders::VS::ScreenOut);
 		SGCore_ShaderBind(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha);
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha, "WinSize", &float4_t(*winr_width, *winr_height, 1.f / float(*winr_width), 1.f / float(*winr_height)));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, GData::IDsShaders::PS::UnionAlpha, "WinSize", &float4_t(*r_win_width, *r_win_height, 1.f / float(*r_win_width), 1.f / float(*r_win_height)));
 
 		SGCore_ScreenQuadDraw();
 
@@ -1410,8 +1410,8 @@ void SXRenderFunc::ApplyToneMapping()
 void SXRenderFunc::ComToneMapping(DWORD timeDelta)
 {
 	//обработка tone mapping
-	static const float * hdr_adapted_coef = GET_PCVAR_FLOAT("hdr_adapted_coef");
-	SML_LigthsToneMappingCom(timeDelta, (hdr_adapted_coef ? (*hdr_adapted_coef) : 0.03f));
+	static const float * r_hdr_adapted_coef = GET_PCVAR_FLOAT("r_hdr_adapted_coef");
+	SML_LigthsToneMappingCom(timeDelta, (r_hdr_adapted_coef ? (*r_hdr_adapted_coef) : 0.03f));
 }
 
 
@@ -1439,10 +1439,10 @@ void SXRenderFunc::RenderParticles(DWORD timeDelta)
 
 void SXRenderFunc::RenderPostProcess(DWORD timeDelta)
 {
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 	static float2_t vWinSize;
-	vWinSize = float2(*winr_width, *winr_height);
+	vWinSize = float2(*r_win_width, *r_win_height);
 
 	SPP_RTNull();
 
diff --git a/source/skyxengine.cpp b/source/skyxengine.cpp
index 878616bcafff7b7f76d9a7f58ecdfaa5caf0b948..5f9f40ccb6b0a4ba17222704ef0258862a461861 100644
--- a/source/skyxengine.cpp
+++ b/source/skyxengine.cpp
@@ -111,14 +111,14 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 
 	SkyXEngine_CreateLoadCVar();
 
-	static int *winr_width = (int*)GET_PCVAR_INT("winr_width");
-	static int *winr_height = (int*)GET_PCVAR_INT("winr_height");
-	static const bool *winr_windowed = GET_PCVAR_BOOL("winr_windowed");
+	static int *r_win_width = (int*)GET_PCVAR_INT("r_win_width");
+	static int *r_win_height = (int*)GET_PCVAR_INT("r_win_height");
+	static const bool *r_win_windowed = GET_PCVAR_BOOL("r_win_windowed");
 
 	HWND hWnd3DCurr = 0;
 
 	if (hWnd3D == 0)
-		hWnd3DCurr = SkyXEngine_CreateWindow("SkyXEngine", "SkyXEngine", *winr_width, *winr_height);
+		hWnd3DCurr = SkyXEngine_CreateWindow("SkyXEngine", "SkyXEngine", *r_win_width, *r_win_height);
 	else
 	{
 		hWnd3DCurr = hWnd3D;
@@ -126,8 +126,8 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 		RECT rect;
 		GetClientRect(hWnd3DCurr, &rect);
 
-		*winr_width = rect.right;
-		*winr_height = rect.bottom;
+		*r_win_width = rect.right;
+		*r_win_height = rect.bottom;
 	}
 	
 	SSInput_0Create("sxinput", hWnd3DCurr, false);
@@ -155,7 +155,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 
 
 
-	SGCore_0Create("sxgcore", hWnd3DCurr, *winr_width, *winr_height, *winr_windowed, 0, false);
+	SGCore_0Create("sxgcore", hWnd3DCurr, *r_win_width, *r_win_height, *r_win_windowed, 0, false);
 	SGCore_Dbg_Set(SkyXEngine_PrintfLog);
 
 	SGCore_SetFunc_MtlSet(SkyXEngine_RFuncMtlSet);
@@ -259,7 +259,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 #endif
 
 #if defined(SX_GAME)
-	if (*winr_windowed)
+	if (*r_win_windowed)
 		ShowWindow(hWnd3DCurr, SW_SHOW);
 	else
 		ShowWindow(hWnd3DCurr, SW_MAXIMIZE);
@@ -329,16 +329,35 @@ void SkyXEngine_InitPaths()
 
 void SkyXEngine_CreateLoadCVar()
 {
-	Core_0RegisterCVarInt("winr_width", 800, 0);
-	Core_0RegisterCVarInt("winr_height", 600, 0);
-	Core_0RegisterCVarBool("winr_windowed", true, 0);
-	Core_0RegisterCVarFloat("r_default_fov", 45.0f, "Default FOV value");
-	Core_0RegisterCVarFloat("p_near", 0.025f, 0);
-	Core_0RegisterCVarFloat("p_far", 400, 0);
+	Core_0RegisterCVarInt("r_win_width", 800, "Размер окна по горизонтали (в пикселях)");
+	Core_0RegisterCVarInt("r_win_height", 600, "Размер окна по вертикали (в пикселях)");
+	Core_0RegisterCVarBool("r_win_windowed", true, "Режим рендера true - оконный, false - полноэкранный");
+	Core_0RegisterCVarFloat("r_default_fov", SM_PI * 0.25f, "Дефолтный fov в радианах");
+	Core_0RegisterCVarFloat("r_near", 0.025f, "Ближняя плоскость отсчечения");
+	Core_0RegisterCVarFloat("r_far", 400, "Дальняя плоскость отсечения (дальность видимости)");
 
-	Core_0RegisterCVarInt("final_image", DS_RT_SCENELIGHT, "Тип финального (выводимого в окно рендера) изображения из перечисления DS_RT");
+	Core_0RegisterCVarInt("r_final_image", DS_RT_SCENELIGHT, "Тип финального (выводимого в окно рендера) изображения из перечисления DS_RT");
+
+	Core_0RegisterCVarInt("r_resize", RENDER_RESIZE_NONE, "Тип изменения размеров окан рендера из перечисления RENDER_RESIZE");
+
+
+	Core_0RegisterCVarBool("r_pssm_4or3", true, "Для глобальных теней использовать 4 (true) или 3 (false) сплита?");
+	Core_0RegisterCVarBool("r_pssm_shadowed", true, "Глобальный источник отбрасывает тени?");
+	Core_0RegisterCVarFloat("r_pssm_quality", 1, "Коэфициент размера карты глубины глобального источника света относительно размеров окна рендера [0.5,4] (низкое, высокое)");
+	Core_0RegisterCVarFloat("r_lsm_quality", 1, "Коэфициент размера карты глубины для локальных источников света относительно размеров окна рендера [0.5,4] (низкое, высокое)");
+	Core_0RegisterCVarInt("r_shadow_soft", 1, "Дополнительнео размытие теней, 0 - нет, 1 - 1 проход, 2 - 2 прохода");
+	Core_0RegisterCVarFloat("r_hdr_adapted_coef", 0.03f, "Коэфициент привыкания к освещению (0,1] (медлено, быстро)");
+
+	Core_0RegisterCVarInt("r_grass_freq", 100, "Плотность отрисовки травы [1,100]");
+	Core_0RegisterCVarFloat("r_green_lod0", 50, "Дистанция отрисовки для первого лода (он же лод травы) растительности, начиная с нуля от камеры");
+	Core_0RegisterCVarFloat("r_green_lod1", 100, "Дистанция отрисовки второго лода растительности (кусты/деревья), старт с дистанции первого лода");
+	Core_0RegisterCVarFloat("r_green_less", 20, "Дистанция? после которой трава будет уменьшаться (0,r_green_lod0)");
+
+	Core_0RegisterCVarInt("r_texfilter_type", 2, "Тип фильтрации текстур, 0 - точечная, 1 - линейная, 2 - анизотропная");
+	Core_0RegisterCVarInt("r_texfilter_max_anisotropy", 16, "Максимальное значение анизотропной фильтрации (если включена) [1,16]");
+	Core_0RegisterCVarInt("r_texfilter_max_miplevel", 0, "Какой mip уровень текстур использовать? 0 - самый высокий, 1 - ниже на один уровень и т.д.");
+	Core_0RegisterCVarInt("r_stats", 1, "Показывать ли статистику? 0 - нет, 1 - fps и игровое время, 2 - показать полностью");
 
-	Core_0RegisterCVarInt("resize", RENDER_RESIZE_NONE, "Тип изменения размеров окан рендера из перечисления RENDER_RESIZE");
 
 	Core_0RegisterCVarFloat("cl_mousesense", 0.001f, "Mouse sense value");
 
@@ -349,40 +368,21 @@ void SkyXEngine_CreateLoadCVar()
 	Core_0RegisterCVarBool("pp_dlaa", true, "Рисовать ли эффект dlaa?");
 	Core_0RegisterCVarBool("pp_nfaa", false, "Рисовать ли эффект nfaa?");
 
+	static float3_t fog_color(0.5, 0.5, 0.5);
+	Core_0RegisterCVarPointer("pp_fog_color", ((UINT_PTR)&fog_color));
 	Core_0RegisterCVarFloat("pp_fog_density", 0.5, "Плотность тумана");
 
 	Core_0RegisterCVarBool("pp_motionblur", true, "Рисовать ли эффект motion blur?");
 	Core_0RegisterCVarFloat("pp_motionblur_coef", 0.1, "Коэфициент для эффекта motion blur [0,1]");
-	Core_0RegisterCVarBool("pssm_4or3", true, "Для глобальных теней использовать 4 (true) или 3 (false) сплита?");
-
-	Core_0RegisterCVarBool("pssm_shadowed", true, "Глобальный источник отбрасывает тени?");
-	Core_0RegisterCVarFloat("pssm_q", 1, "Коэфициент размера карты глубины глобального источника света относительно размеров окна рендера [0.5,4] (низкое, высокое)");
-	Core_0RegisterCVarFloat("lsm_q", 1, "Коэфициент размера карты глубины для локальных источников света относительно размеров окна рендера [0.5,4] (низкое, высокое)");
-	Core_0RegisterCVarInt("shadow_soft", 1, "Дополнительнео размытие теней, 0 - нет, 1 - 1 проход, 2 - 2 прохода");
-
-	Core_0RegisterCVarInt("grass_frec", 100, "Плотность отрисовки травы [1,100]");
-	Core_0RegisterCVarFloat("green_lod0", 50, "Дистанция отрисовки для первого лода (он же лод травы) растительности, начиная с нуля от камеры");
-	Core_0RegisterCVarFloat("green_lod1", 100, "Дистанция отрисовки второго лода растительности (кусты/деревья), старт с дистанции первого лода");
-	Core_0RegisterCVarFloat("green_less", 20, "Дистанция? после которой трава будет уменьшаться (0,green_lod0)");
 	
-	Core_0RegisterCVarFloat("hdr_adapted_coef", 0.03f, "Коэфициент привыкания к освещению (0,1] (медлено, быстро)");
-
-	Core_0RegisterCVarInt("r_s_filter", 2, "Тип фильтрации текстур, 0 - точечная, 1 - линейная, 2 - анизотропная");
-	Core_0RegisterCVarInt("r_s_max_anisotropy", 16, "Максимальное значение анизотропной фильтрации (если включена) [1,16]");
-	Core_0RegisterCVarInt("r_s_max_miplevel", 0, "Какой mip уровень текстур использовать? 0 - самый высокий, 1 - ниже на один уровень и т.д.");
-	Core_0RegisterCVarInt("rs_stats", 1, "Показывать ли статистику? 0 - нет, 1 - fps и игровое время, 2 - показать полностью");
-
 	Core_0RegisterCVarBool("g_time_run", true, "Запущено ли игрвоое время?");
 	Core_0RegisterCVarFloat("g_time_speed", 1.f, "Скорость/соотношение течения игрового времени");
 	
-	Core_0RegisterCVarFloat("main_rain_density", 1.f, "Коэфициент плотности дождя (0,1]");
-	Core_0RegisterCVarBool("main_thunderbolt", true, "Могут ли воспроизводится эффекты молнии?");
+	Core_0RegisterCVarFloat("env_default_rain_density", 1.f, "Коэфициент плотности дождя (0,1]");
+	Core_0RegisterCVarBool("env_default_thunderbolt", true, "Могут ли воспроизводится эффекты молнии?");
 
-	Core_0RegisterCVarFloat("weather_snd_volume", 1.f, "Громкость звуков погоды [0,1]");
-	Core_0RegisterCVarFloat("ambient_snd_volume", 1.f, "Громкость фоновых звуков на уровне [0,1]");
-
-	static float3_t fog_color(0.5, 0.5, 0.5);
-	Core_0RegisterCVarPointer("pp_fog_color", ((UINT_PTR)&fog_color));
+	Core_0RegisterCVarFloat("env_weather_snd_volume", 1.f, "Громкость звуков погоды [0,1]");
+	Core_0RegisterCVarFloat("env_ambient_snd_volume", 1.f, "Громкость фоновых звуков на уровне [0,1]");
 
 	Core_0RegisterConcmd("screenshot", SRender_SaveScreenShot);
 	Core_0RegisterConcmd("save_worktex", SRender_SaveWorkTex);
@@ -474,8 +474,8 @@ void SkyXEngine_Frame(DWORD timeDelta)
 	static float3 vCamPos, vCamDir;
 	static float4x4 mView, mProjLight;
 
-	static const int *final_image = GET_PCVAR_INT("final_image");
-	static const int *resize = GET_PCVAR_INT("resize");
+	static const int *r_final_image = GET_PCVAR_INT("r_final_image");
+	static const int *r_resize = GET_PCVAR_INT("r_resize");
 	static bool isSimulationRender = false;
 
 	static uint64_t DelayGeomSortGroup = 0;
@@ -512,7 +512,7 @@ void SkyXEngine_Frame(DWORD timeDelta)
 
 	int64_t ttime;
 	//потеряно ли устройство или произошло изменение размеров?
-	if (pDXDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET || *resize)
+	if (pDXDevice->TestCooperativeLevel() == D3DERR_DEVICENOTRESET || *r_resize)
 	{
 		//если не свернуто окно
 		if (!IsIconic(SRender_GetHandleWin3D()) && ((SRender_GetParentHandleWin3D() != 0 && !IsIconic(SRender_GetParentHandleWin3D())) || SRender_GetParentHandleWin3D() == 0))
@@ -592,7 +592,7 @@ void SkyXEngine_Frame(DWORD timeDelta)
 	SRender_UpdateReflection(timeDelta, isSimulationRender);
 	DelayComReflection += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime;
 
-	if (*final_image == DS_RT_AMBIENTDIFF || *final_image == DS_RT_SPECULAR || *final_image == DS_RT_SCENELIGHT)
+	if (*r_final_image == DS_RT_AMBIENTDIFF || *r_final_image == DS_RT_SPECULAR || *r_final_image == DS_RT_SCENELIGHT)
 	{
 		//рендерим глубину от света
 		ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER));
@@ -605,7 +605,7 @@ void SkyXEngine_Frame(DWORD timeDelta)
 	SRender_BuildMRT(timeDelta, isSimulationRender);
 	DelayRenderMRT += TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER)) - ttime;
 
-	if (*final_image == DS_RT_AMBIENTDIFF || *final_image == DS_RT_SPECULAR || *final_image == DS_RT_SCENELIGHT)
+	if (*r_final_image == DS_RT_AMBIENTDIFF || *r_final_image == DS_RT_SPECULAR || *r_final_image == DS_RT_SCENELIGHT)
 	{
 		//освещаем сцену
 		ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER));
@@ -634,7 +634,7 @@ void SkyXEngine_Frame(DWORD timeDelta)
 	pDXDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
 
 #if !defined(SX_GAME)
-	pDXDevice->SetTexture(0, SML_DSGetRT((DS_RT)*final_image));
+	pDXDevice->SetTexture(0, SML_DSGetRT((DS_RT)*r_final_image));
 #else
 	pDXDevice->SetTexture(0, SGCore_RTGetTexture(SPP_RTGetCurrSend()));
 #endif
@@ -651,10 +651,10 @@ void SkyXEngine_Frame(DWORD timeDelta)
 	SRender_RenderEditorMain();
 
 
-#if /*defined(_DEBUG) &&*/ defined(SX_LEVEL_EDITOR)
-	static const float * p_far = GET_PCVAR_FLOAT("p_far");
-	SAIG_RenderQuads(SRender_GetCamera()->ObjFrustum, &vCamPos, *p_far);
-#endif
+/*#if defined(_DEBUG)
+	static const float * r_far = GET_PCVAR_FLOAT("r_far");
+	SAIG_RenderQuads(SRender_GetCamera()->ObjFrustum, &vCamPos, *r_far);
+#endif*/
 
 #if defined(SX_GAME)
 	SXGame_RenderHUD();
@@ -770,160 +770,160 @@ void SkyXEngine_Frame(DWORD timeDelta)
 void SkyXEngind_UpdateDataCVar()
 {
 	ID GlobalLight = SML_LigthsGetGlobal();
-	static const bool * pssm_4or3 = GET_PCVAR_BOOL("pssm_4or3");
-	static bool pssm_4or3_old = true;
+	static const bool * r_pssm_4or3 = GET_PCVAR_BOOL("r_pssm_4or3");
+	static bool r_pssm_4or3_old = true;
 
 	//проверяем не изменилось ли значение квара, если изменилось то меняем и количество сплитов
-	if (pssm_4or3 && pssm_4or3_old != (*pssm_4or3) && GlobalLight >= 0)
+	if (r_pssm_4or3 && r_pssm_4or3_old != (*r_pssm_4or3) && GlobalLight >= 0)
 	{
-		pssm_4or3_old = (*pssm_4or3);
-		SML_LigthsSet4Or3SplitsG(GlobalLight, pssm_4or3_old);
+		r_pssm_4or3_old = (*r_pssm_4or3);
+		SML_LigthsSet4Or3SplitsG(GlobalLight, r_pssm_4or3_old);
 	}
 
-	static const bool * pssm_shadowed = GET_PCVAR_BOOL("pssm_shadowed");
-	static bool pssm_shadowed_old = true;
+	static const bool * r_pssm_shadowed = GET_PCVAR_BOOL("r_pssm_shadowed");
+	static bool r_pssm_shadowed_old = true;
 
-	if (pssm_shadowed && pssm_shadowed_old != (*pssm_shadowed) && GlobalLight >= 0)
+	if (r_pssm_shadowed && r_pssm_shadowed_old != (*r_pssm_shadowed) && GlobalLight >= 0)
 	{
-		pssm_shadowed_old = (*pssm_shadowed);
-		SML_LigthsSetTypeShadowed(GlobalLight, (pssm_shadowed_old ? LTYPE_SHADOW_DYNAMIC : LTYPE_SHADOW_NONE));
+		r_pssm_shadowed_old = (*r_pssm_shadowed);
+		SML_LigthsSetTypeShadowed(GlobalLight, (r_pssm_shadowed_old ? LTYPE_SHADOW_DYNAMIC : LTYPE_SHADOW_NONE));
 	}
 
-	static const float * pssm_q = GET_PCVAR_FLOAT("pssm_q");
-	static float pssm_q_old = 1;
+	static const float * r_pssm_quality = GET_PCVAR_FLOAT("r_pssm_quality");
+	static float r_pssm_quality_old = 1;
 
-	if (pssm_q && pssm_q_old != (*pssm_q))
+	if (r_pssm_quality && r_pssm_quality_old != (*r_pssm_quality))
 	{
-		pssm_q_old = (*pssm_q);
-		if (pssm_q_old < 0.5f)
+		r_pssm_quality_old = (*r_pssm_quality);
+		if (r_pssm_quality_old < 0.5f)
 		{
-			pssm_q_old = 0.5f;
-			Core_0SetCVarFloat("pssm_q", pssm_q_old);
+			r_pssm_quality_old = 0.5f;
+			Core_0SetCVarFloat("r_pssm_quality", r_pssm_quality_old);
 		}
-		else if (pssm_q_old > 4.f)
+		else if (r_pssm_quality_old > 4.f)
 		{
-			pssm_q_old = 4.f;
-			Core_0SetCVarFloat("pssm_q", pssm_q_old);
+			r_pssm_quality_old = 4.f;
+			Core_0SetCVarFloat("r_pssm_quality", r_pssm_quality_old);
 		}
-		SML_LigthsSettGCoefSizeDepth(pssm_q_old);
+		SML_LigthsSettGCoefSizeDepth(r_pssm_quality_old);
 	}
 
-	static const float * lsm_q = GET_PCVAR_FLOAT("lsm_q");
-	static float lsm_q_old = 1;
+	static const float * r_lsm_quality = GET_PCVAR_FLOAT("r_lsm_quality");
+	static float r_lsm_quality_old = 1;
 
-	if (lsm_q && lsm_q_old != (*lsm_q))
+	if (r_lsm_quality && r_lsm_quality_old != (*r_lsm_quality))
 	{
-		lsm_q_old = (*lsm_q);
-		if (lsm_q_old < 0.5f)
+		r_lsm_quality_old = (*r_lsm_quality);
+		if (r_lsm_quality_old < 0.5f)
 		{
-			lsm_q_old = 0.5f;
-			Core_0SetCVarFloat("lsm_q", lsm_q_old);
+			r_lsm_quality_old = 0.5f;
+			Core_0SetCVarFloat("r_lsm_quality", r_lsm_quality_old);
 		}
-		else if (lsm_q_old > 4.f)
+		else if (r_lsm_quality_old > 4.f)
 		{
-			lsm_q_old = 4.f;
-			Core_0SetCVarFloat("lsm_q", lsm_q_old);
+			r_lsm_quality_old = 4.f;
+			Core_0SetCVarFloat("r_lsm_quality", r_lsm_quality_old);
 		}
-		SML_LigthsSettLCoefSizeDepth(lsm_q_old);
+		SML_LigthsSettLCoefSizeDepth(r_lsm_quality_old);
 	}
 
-	static const int * grass_frec = GET_PCVAR_INT("grass_frec");
-	static int grass_frec_old = 1;
+	static const int * r_grass_freq = GET_PCVAR_INT("r_grass_freq");
+	static int r_grass_freq_old = 1;
 
-	if (grass_frec && grass_frec_old != (*grass_frec))
+	if (r_grass_freq && r_grass_freq_old != (*r_grass_freq))
 	{
-		grass_frec_old = (*grass_frec);
-		if (grass_frec_old <= 0)
+		r_grass_freq_old = (*r_grass_freq);
+		if (r_grass_freq_old <= 0)
 		{
-			grass_frec_old = 1;
-			Core_0SetCVarInt("grass_frec", grass_frec_old);
+			r_grass_freq_old = 1;
+			Core_0SetCVarInt("r_grass_freq", r_grass_freq_old);
 		}
-		else if (grass_frec_old > 100)
+		else if (r_grass_freq_old > 100)
 		{
-			grass_frec_old = 100;
-			Core_0SetCVarInt("grass_frec", grass_frec_old);
+			r_grass_freq_old = 100;
+			Core_0SetCVarInt("r_grass_freq", r_grass_freq_old);
 		}
-		SGeom_0SettGreenSetFreqGrass(grass_frec_old);
+		SGeom_0SettGreenSetFreqGrass(r_grass_freq_old);
 	}
 
-	static const float * green_lod0 = GET_PCVAR_FLOAT("green_lod0");
-	static float green_lod0_old = 50;
+	static const float * r_green_lod0 = GET_PCVAR_FLOAT("r_green_lod0");
+	static float r_green_lod0_old = 50;
 
-	if (green_lod0 && green_lod0_old != (*green_lod0))
+	if (r_green_lod0 && r_green_lod0_old != (*r_green_lod0))
 	{
-		green_lod0_old = (*green_lod0);
-		if (green_lod0_old <= 20)
+		r_green_lod0_old = (*r_green_lod0);
+		if (r_green_lod0_old <= 20)
 		{
-			green_lod0_old = 20;
-			Core_0SetCVarFloat("green_lod0", green_lod0_old);
+			r_green_lod0_old = 20;
+			Core_0SetCVarFloat("r_green_lod0", r_green_lod0_old);
 		}
-		else if (green_lod0_old > 100)
+		else if (r_green_lod0_old > 100)
 		{
-			green_lod0_old = 100;
-			Core_0SetCVarFloat("green_lod0", green_lod0_old);
+			r_green_lod0_old = 100;
+			Core_0SetCVarFloat("r_green_lod0", r_green_lod0_old);
 		}
-		SGeom_0SettGreenSetDistLods1(green_lod0_old);
+		SGeom_0SettGreenSetDistLods1(r_green_lod0_old);
 	}
 
-	static const float * green_lod1 = GET_PCVAR_FLOAT("green_lod1");
-	static float green_lod1_old = 50;
+	static const float * r_green_lod1 = GET_PCVAR_FLOAT("r_green_lod1");
+	static float r_green_lod1_old = 50;
 
-	if (green_lod1 && green_lod1_old != (*green_lod1))
+	if (r_green_lod1 && r_green_lod1_old != (*r_green_lod1))
 	{
-		green_lod1_old = (*green_lod1);
-		if (green_lod1_old <= 50)
+		r_green_lod1_old = (*r_green_lod1);
+		if (r_green_lod1_old <= 50)
 		{
-			green_lod1_old = 50;
-			Core_0SetCVarFloat("green_lod1", green_lod1_old);
+			r_green_lod1_old = 50;
+			Core_0SetCVarFloat("r_green_lod1", r_green_lod1_old);
 		}
-		else if (green_lod1_old > 150)
+		else if (r_green_lod1_old > 150)
 		{
-			green_lod1_old = 150;
-			Core_0SetCVarFloat("green_lod1", green_lod1_old);
+			r_green_lod1_old = 150;
+			Core_0SetCVarFloat("r_green_lod1", r_green_lod1_old);
 		}
-		SGeom_0SettGreenSetDistLods2(green_lod1_old);
+		SGeom_0SettGreenSetDistLods2(r_green_lod1_old);
 	}
 
-	static const float * green_less = GET_PCVAR_FLOAT("green_less");
-	static float green_less_old = 10;
+	static const float * r_green_less = GET_PCVAR_FLOAT("r_green_less");
+	static float r_green_less_old = 10;
 
-	if (green_less && green_less_old != (*green_less))
+	if (r_green_less && r_green_less_old != (*r_green_less))
 	{
-		green_less_old = (*green_less);
-		if (green_less_old <= 10)
+		r_green_less_old = (*r_green_less);
+		if (r_green_less_old <= 10)
 		{
-			green_less_old = 10;
-			Core_0SetCVarFloat("green_less", green_less_old);
+			r_green_less_old = 10;
+			Core_0SetCVarFloat("r_green_less", r_green_less_old);
 		}
-		else if (green_less_old > 90)
+		else if (r_green_less_old > 90)
 		{
-			green_less_old = 90;
-			Core_0SetCVarFloat("green_less", green_less_old);
+			r_green_less_old = 90;
+			Core_0SetCVarFloat("r_green_less", r_green_less_old);
 		}
-		SGeom_0SettGreenSetBeginEndLessening(green_less_old);
+		SGeom_0SettGreenSetBeginEndLessening(r_green_less_old);
 	}
 
 
-	static int * winr_width = (int*)GET_PCVAR_INT("winr_width");
-	static int * winr_height = (int*)GET_PCVAR_INT("winr_height");
+	static int * r_win_width = (int*)GET_PCVAR_INT("r_win_width");
+	static int * r_win_height = (int*)GET_PCVAR_INT("r_win_height");
 
 
-	if (winr_width && winr_height)
+	if (r_win_width && r_win_height)
 	{
 
 #ifdef SX_GAME
-		static int winr_width_old = *winr_width;
-		static int winr_height_old = *winr_height;
+		static int r_win_width_old = *r_win_width;
+		static int r_win_height_old = *r_win_height;
 
 		static int iCountModes = 0;
 		static const DEVMODE *aModes = SGCore_GetModes(&iCountModes);
 
-		if (winr_width && winr_width_old != (*winr_width) && winr_height && winr_height_old != (*winr_height))
+		if (r_win_width && r_win_width_old != (*r_win_width) && r_win_height && r_win_height_old != (*r_win_height))
 		{
 			bool isValid = false;
 			for (int i = 0; i < iCountModes; ++i)
 			{
-				if (aModes[i].dmPelsWidth == (*winr_width) && aModes[i].dmPelsHeight == (*winr_height))
+				if (aModes[i].dmPelsWidth == (*r_win_width) && aModes[i].dmPelsHeight == (*r_win_height))
 				{
 					isValid = true;
 					break;
@@ -932,11 +932,11 @@ void SkyXEngind_UpdateDataCVar()
 
 			if (isValid)
 			{
-				winr_width_old = (*winr_width);
-				winr_height_old = (*winr_height);
+				r_win_width_old = (*r_win_width);
+				r_win_height_old = (*r_win_height);
 
 
-				RECT rc = { 0, 0, winr_width_old, winr_height_old };
+				RECT rc = { 0, 0, r_win_width_old, r_win_height_old };
 				AdjustWindowRect(&rc, WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX, false);
 
 				int iWidth = rc.right - rc.left;
@@ -946,37 +946,33 @@ void SkyXEngind_UpdateDataCVar()
 
 				MoveWindow(SRender_GetHandleWin3D(), rc.left, rc.top, iWidth, iHeight, TRUE);
 
-				static int *resize = (int*)GET_PCVAR_INT("resize");
-				*resize = RENDER_RESIZE_RESIZE;
+				static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
+				*r_resize = RENDER_RESIZE_RESIZE;
 			}
 			else
 			{
-				*winr_width = winr_width_old;
-				*winr_height = winr_height_old;
+				*r_win_width = r_win_width_old;
+				*r_win_height = r_win_height_old;
 			}
 		}
 
-		static const bool *winr_windowed = GET_PCVAR_BOOL("winr_windowed");
+		static const bool *r_win_windowed = GET_PCVAR_BOOL("r_win_windowed");
 
-		if (winr_windowed)
+		if (r_win_windowed)
 		{
-			static bool winr_windowed_old = *winr_windowed;
+			static bool r_win_windowed_old = *r_win_windowed;
 
-			if (winr_windowed_old != (*winr_windowed))
+			if (r_win_windowed_old != (*r_win_windowed))
 			{
-				winr_windowed_old = (*winr_windowed);
-				static int *resize = (int*)GET_PCVAR_INT("resize");
-				*resize = RENDER_RESIZE_CHANGE;
+				r_win_windowed_old = (*r_win_windowed);
+				static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
+				*r_resize = RENDER_RESIZE_CHANGE;
 			}
 		}
 #else
-		static bool *winr_windowed = (bool*)GET_PCVAR_BOOL("winr_windowed");
-		*winr_windowed = true;
+		static bool *r_win_windowed = (bool*)GET_PCVAR_BOOL("r_win_windowed");
+		*r_win_windowed = true;
 #endif
-
-
-		/*Core_RFloatSet(G_RI_FLOAT_WINSIZE_WIDTH, *winr_width);
-		Core_RFloatSet(G_RI_FLOAT_WINSIZE_HEIGHT, *winr_height);*/
 	}
 }
 
diff --git a/source/sxleveleditor/common_callback.cpp b/source/sxleveleditor/common_callback.cpp
index 6bad1e5d439fc38c494610804f5a89c9310297a5..31aa78dcab0a4302d01002cf1c7cfa1e087137d9 100644
--- a/source/sxleveleditor/common_callback.cpp
+++ b/source/sxleveleditor/common_callback.cpp
@@ -147,42 +147,42 @@ LRESULT ComMenuId(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 	//
 	else if (id == ID_FINALIMAGE_COLOR)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_COLOR);
+		Core_0SetCVarInt("r_final_image", DS_RT_COLOR);
 		SXLevelEditor::FinalImageUncheckedMenu();
 		SXLevelEditor::MainMenu->CheckItem(id, !SXLevelEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_NORMALS)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_NORMAL);
+		Core_0SetCVarInt("r_final_image", DS_RT_NORMAL);
 		SXLevelEditor::FinalImageUncheckedMenu();
 		SXLevelEditor::MainMenu->CheckItem(id, !SXLevelEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_PARAMETERS)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_PARAM);
+		Core_0SetCVarInt("r_final_image", DS_RT_PARAM);
 		SXLevelEditor::FinalImageUncheckedMenu();
 		SXLevelEditor::MainMenu->CheckItem(id, !SXLevelEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_AMBIENTDIFFUSE)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_AMBIENTDIFF);
+		Core_0SetCVarInt("r_final_image", DS_RT_AMBIENTDIFF);
 		SXLevelEditor::FinalImageUncheckedMenu();
 		SXLevelEditor::MainMenu->CheckItem(id, !SXLevelEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_SPECULAR)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_SPECULAR);
+		Core_0SetCVarInt("r_final_image", DS_RT_SPECULAR);
 		SXLevelEditor::FinalImageUncheckedMenu();
 		SXLevelEditor::MainMenu->CheckItem(id, !SXLevelEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_LIGHTINGSCENE)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_SCENELIGHT);
+		Core_0SetCVarInt("r_final_image", DS_RT_SCENELIGHT);
 		SXLevelEditor::FinalImageUncheckedMenu();
 		SXLevelEditor::MainMenu->CheckItem(id, !SXLevelEditor::MainMenu->GetCheckedItem(id));
 	}
@@ -247,15 +247,15 @@ LRESULT ComMenuId(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 
 LRESULT MsgEditSize(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-	static int *resize = (int*)GET_PCVAR_INT("resize");
+	static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
 
-	if (!resize)
-		resize = (int*)GET_PCVAR_INT("resize");
+	if (!r_resize)
+		r_resize = (int*)GET_PCVAR_INT("r_resize");
 
-	if (!resize)
+	if (!r_resize)
 		return 0;
 
-	*resize = RENDER_RESIZE_RESIZE;
+	*r_resize = RENDER_RESIZE_RESIZE;
 	return 0;
 }
 
@@ -311,12 +311,15 @@ LRESULT SXLevelEditor_RenderWindow_MouseMove(HWND hwnd, UINT msg, WPARAM wParam,
 	}
 	else if (SXLevelEditor::ActiveGroupType == EDITORS_LEVEL_GROUPTYPE_GREEN && SXLevelEditor::ActiveElement >= 0 && SXLevelEditor::ActiveGreenSplit >= 0 && SXLevelEditor::ActiveGreenObject >= 0)
 	{
-		float3_t pos;
-		SGeom_GreenGetPosObject(SXLevelEditor::ActiveElement, SXLevelEditor::ActiveGreenSplit, SXLevelEditor::ActiveGreenObject, &pos);
-		float3 helperpos = SXLevelEditor::ObjAxesHelper->GetPosition();
-		if (pos.x != helperpos.x || pos.y != helperpos.y || pos.z != helperpos.z)
+		if (SXLevelEditor::ComboBoxGreenSel->GetSel() == 0)
 		{
-			SGeom_GreenSetPosObject(SXLevelEditor::ActiveElement, &SXLevelEditor::ActiveGreenSplit, &SXLevelEditor::ActiveGreenObject, &(float3_t)helperpos);
+			float3_t pos;
+			SGeom_GreenGetPosObject(SXLevelEditor::ActiveElement, SXLevelEditor::ActiveGreenSplit, SXLevelEditor::ActiveGreenObject, &pos);
+			float3 helperpos = SXLevelEditor::ObjAxesHelper->GetPosition();
+			if (pos.x != helperpos.x || pos.y != helperpos.y || pos.z != helperpos.z)
+			{
+				SGeom_GreenSetPosObject(SXLevelEditor::ActiveElement, &SXLevelEditor::ActiveGreenSplit, &SXLevelEditor::ActiveGreenObject, &(float3_t)helperpos);
+			}
 		}
 	}
 	else if (SXLevelEditor::ActiveGroupType == EDITORS_LEVEL_GROUPTYPE_GAME && SXLevelEditor::ActiveElement >= 0)
@@ -374,12 +377,12 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 	GetCursorPos(&pt);
 	ScreenToClient(SRender_GetHandleWin3D(), &pt);
 
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	float3 pos = float3(
-		(2.0f * (float)pt.x / float(*winr_width) - 1.0f) / mCamProj._11,
-		-(2.0f * (float)pt.y / float(*winr_height) - 1.0f) / mCamProj._22,
+		(2.0f * (float)pt.x / float(*r_win_width) - 1.0f) / mCamProj._11,
+		-(2.0f * (float)pt.y / float(*r_win_height) - 1.0f) / mCamProj._22,
 		1.0f
 		) * mat;
 	camDir = pos - vCamPos;
@@ -406,7 +409,7 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 
 		if (SXLevelEditor::ComboBoxGreenSel->GetSel() == 0)
 		{
-			if (pt.x <= *winr_width && pt.y <= *winr_height && SGeom_GreenTraceBeam(&vCamPos, &camDir, &_res, &idgreen, &idsplit, &idobj, &idmtl))
+			if (pt.x <= *r_win_width && pt.y <= *r_win_height && SGeom_GreenTraceBeam(&vCamPos, &camDir, &_res, &idgreen, &idsplit, &idobj, &idmtl))
 			{
 				SXLevelEditor::ActiveGreenSplit = idsplit;
 				SXLevelEditor::ActiveGreenObject = idobj;
@@ -429,9 +432,9 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 		}
 		else if (SXLevelEditor::ComboBoxGreenSel->GetSel() == 1)
 		{
-			if (pt.x <= *winr_width && pt.y <= *winr_height && SGeom_ModelsTraceBeam(&vCamPos, &camDir, &_res, &idmodel, &idmtl))
+			if (pt.x <= *r_win_width && pt.y <= *r_win_height && SGeom_ModelsTraceBeam(&vCamPos, &camDir, &_res, &idmodel, &idmtl))
 			{
-				idobj = SGeom_GreenAddObject(0, &_res, &idsplit);
+				idobj = SGeom_GreenAddObject(SXLevelEditor::ActiveElement, &_res, &idsplit);
 				SXLevelEditor::ActiveGreenSplit = idsplit;
 				SXLevelEditor::ActiveGreenObject = idobj;
 
@@ -453,7 +456,7 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 
 		else if (SXLevelEditor::ComboBoxGreenSel->GetSel() == 2)
 		{
-			if (pt.x <= *winr_width && pt.y <= *winr_height && SGeom_ModelsTraceBeam(&vCamPos, &camDir, &_res, &idmodel, &idmtl))
+			if (pt.x <= *r_win_width && pt.y <= *r_win_height && SGeom_ModelsTraceBeam(&vCamPos, &camDir, &_res, &idmodel, &idmtl))
 			{
 				SXLevelEditor::GreenBoxPos = _res;
 				int density = SXLevelEditor::TrackBarGreenDensity->GetPos();
@@ -479,9 +482,9 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 
 		else if (SXLevelEditor::ComboBoxGreenSel->GetSel() == 3)
 		{
-			static const int *winr_width = GET_PCVAR_INT("winr_width");
-			static const int *winr_height = GET_PCVAR_INT("winr_height");
-			if (pt.x <= *winr_width && pt.y <= *winr_height && SGeom_GreenTraceBeam(&vCamPos, &camDir, &_res, &idgreen, &idsplit, &idobj, &idmtl))
+			static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+			static const int *r_win_height = GET_PCVAR_INT("r_win_height");
+			if (pt.x <= *r_win_width && pt.y <= *r_win_height && SGeom_GreenTraceBeam(&vCamPos, &camDir, &_res, &idgreen, &idsplit, &idobj, &idmtl))
 			{
 				SXLevelEditor::ActiveGreenSplit = -1;
 				SXLevelEditor::ActiveGreenObject = -1;
@@ -564,12 +567,12 @@ LRESULT SXLevelEditor_RenderWindow_RClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 	GetCursorPos(&pt);
 	ScreenToClient(SRender_GetHandleWin3D(), &pt);
 
-	static const int *winr_width = GET_PCVAR_INT("winr_width");
-	static const int *winr_height = GET_PCVAR_INT("winr_height");
+	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
+	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
 
 	float3 pos = float3(
-		(2.0f * (float)pt.x / float(*winr_width) - 1.0f) / mCamProj._11,
-		-(2.0f * (float)pt.y / float(*winr_height) - 1.0f) / mCamProj._22,
+		(2.0f * (float)pt.x / float(*r_win_width) - 1.0f) / mCamProj._11,
+		-(2.0f * (float)pt.y / float(*r_win_height) - 1.0f) / mCamProj._22,
 		1.0f
 		) * mat;
 	camDir = pos - vCamPos;
@@ -587,7 +590,7 @@ LRESULT SXLevelEditor_RenderWindow_RClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 
 		if (SXLevelEditor::ComboBoxGreenSel->GetSel() == 2)
 		{
-			if (pt.x <= *winr_width && pt.y <= *winr_height && SGeom_ModelsTraceBeam(&vCamPos, &camDir, &_res, &idmodel, &idmtl))
+			if (pt.x <= *r_win_width && pt.y <= *r_win_height && SGeom_ModelsTraceBeam(&vCamPos, &camDir, &_res, &idmodel, &idmtl))
 				SXLevelEditor::GreenBoxPos = _res;
 		}
 	}
@@ -858,6 +861,10 @@ LRESULT SXLevelEditor_GroupBox_Notify(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 	{
 		SXLevelEditor_ListViewGameClass_Click();
 	}
+	else if (((NMHDR*)lParam)->hwndFrom == SXLevelEditor::ListViewGameConnections->GetHWND() && ((NMHDR*)lParam)->code == NM_CLICK)
+	{
+		SXLevelEditor_ListViewGameConnections_Click();
+	}
 	return 0;
 }
 
@@ -951,42 +958,42 @@ LRESULT SXLevelEditor_ToolBar1_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 			SXLevelEditor::FinalImageUncheckedMenu();
 			SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_COLOR, true);
 			SXLevelEditor::CheckBoxTBRColor->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_COLOR);
+			Core_0SetCVarInt("r_final_image", DS_RT_COLOR);
 		}
 		else if (SXLevelEditor::CheckBoxTBRNormal->GetHWND() == handle_elem)
 		{
 			SXLevelEditor::FinalImageUncheckedMenu();
 			SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_NORMALS, true);
 			SXLevelEditor::CheckBoxTBRNormal->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_NORMAL);
+			Core_0SetCVarInt("r_final_image", DS_RT_NORMAL);
 		}
 		else if (SXLevelEditor::CheckBoxTBRParam->GetHWND() == handle_elem)
 		{
 			SXLevelEditor::FinalImageUncheckedMenu();
 			SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_PARAMETERS, true);
 			SXLevelEditor::CheckBoxTBRParam->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_PARAM);
+			Core_0SetCVarInt("r_final_image", DS_RT_PARAM);
 		}
 		else if (SXLevelEditor::CheckBoxTBRAmDiff->GetHWND() == handle_elem)
 		{
 			SXLevelEditor::FinalImageUncheckedMenu();
 			SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_AMBIENTDIFFUSE, true);
 			SXLevelEditor::CheckBoxTBRAmDiff->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_AMBIENTDIFF);
+			Core_0SetCVarInt("r_final_image", DS_RT_AMBIENTDIFF);
 		}
 		else if (SXLevelEditor::CheckBoxTBRSpecular->GetHWND() == handle_elem)
 		{
 			SXLevelEditor::FinalImageUncheckedMenu();
 			SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_SPECULAR, true);
 			SXLevelEditor::CheckBoxTBRSpecular->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_SPECULAR);
+			Core_0SetCVarInt("r_final_image", DS_RT_SPECULAR);
 		}
 		else if (SXLevelEditor::CheckBoxTBRLighting->GetHWND() == handle_elem)
 		{
 			SXLevelEditor::FinalImageUncheckedMenu();
 			SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_LIGHTINGSCENE, true);
 			SXLevelEditor::CheckBoxTBRLighting->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_SCENELIGHT);
+			Core_0SetCVarInt("r_final_image", DS_RT_SCENELIGHT);
 		}
 
 		else if (SXLevelEditor::CheckBoxTBSelS->GetHWND() == handle_elem)
@@ -1058,9 +1065,8 @@ LRESULT SXLevelEditor_ToolBar1_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 				SML_LigthsSetEnable(gid, SXLevelEditor::CheckBoxTBGLightEnable->GetCheck());
 			else
 				SXLevelEditor::CheckBoxTBGLightEnable->SetCheck(false);
-
-			//Core_0SetCVarBool("pssm_shadowed", true);
 		}
+		
 	}
 
 	return 0;
@@ -1076,6 +1082,34 @@ LRESULT SXLevelEditor_GroupBox_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 	{
 		if (handle_elem == SXLevelEditor::CheckBoxAIGridMarkedSplits->GetHWND())
 			SAIG_GridSetMarkSplits(SXLevelEditor::CheckBoxAIGridMarkedSplits->GetCheck());
+		else
+		{
+			ID seldata = SXLevelEditor::ListBoxList->GetItemData(SXLevelEditor::ListBoxList->GetSel());
+			SXbaseEntity* bEnt = SXGame_EntGet(seldata);
+			int str = SXLevelEditor::ListViewGameClass->GetSelString();
+
+			if (seldata < 0 || str < 0)
+				return 0;
+			char txtval[256];
+			SXLevelEditor::ListViewGameClass->GetTextItem(txtval, 1, str, 256);
+			UINT uiFlags;
+			sscanf(txtval, "%d", &uiFlags);
+
+			for (int i = 0; i < 16; ++i)
+			{
+				if (SXLevelEditor::CheckBoxGameFlags[i]->GetHWND() == handle_elem)
+				{
+					if (SXLevelEditor::CheckBoxGameFlags[i]->GetCheck())
+						uiFlags |= (1 << (i + 16));
+					else
+						uiFlags ^= (1 << (i + 16));
+				}
+			}
+
+			sprintf(txtval, "%d", uiFlags);
+			SXLevelEditor::ListViewGameClass->SetTextItem(txtval, 1, str);
+			bEnt->SetKV("flags", txtval);
+		}
 	}
 	else if (Notification == CBN_SELCHANGE)
 	{
@@ -1222,6 +1256,35 @@ LRESULT SXLevelEditor_GroupBox_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 
 			
 		}
+
+		else if (SXLevelEditor::ComboBoxGameConnectionsEvent->GetHWND() == handle_elem)
+		{
+			ID idSelListBoxList = SXLevelEditor::ListBoxList->GetSel();
+			ID idSelStrTable = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+			if (idSelListBoxList < 0 || idSelStrTable < 0)
+				return 0;
+
+			char szBuffer256[256];
+			szBuffer256[0] = 0;
+			SXLevelEditor::ComboBoxGameConnectionsEvent->GetItemText(256, szBuffer256);
+			SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 0, idSelStrTable);
+			return SXLevelEditor_EditGameConnections_Enter(hwnd, msg, wParam, lParam);
+		}
+		else if (SXLevelEditor::ComboBoxGameConnectionsAction->GetHWND() == handle_elem)
+		{
+			ID idSelListBoxList = SXLevelEditor::ListBoxList->GetSel();
+			ID idSelStrTable = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+			if (idSelListBoxList < 0 || idSelStrTable < 0)
+				return 0;
+
+			char szBuffer256[256];
+			szBuffer256[0] = 0;
+			SXLevelEditor::ComboBoxGameConnectionsAction->GetItemText(SXLevelEditor::ComboBoxGameConnectionsAction->GetSel(), szBuffer256);
+			SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 2, idSelStrTable);
+			return SXLevelEditor_EditGameConnections_Enter(hwnd, msg, wParam, lParam);
+		}
 	}
 	/*else if (Notification == EN_CHANGE)
 	{
diff --git a/source/sxleveleditor/game_callback.cpp b/source/sxleveleditor/game_callback.cpp
index 89eb05edc4e691a78658bc0905b0865bb7a01ad5..1e4bbdafe0b09bb1c0ec03fac36ef5aa4934b73e 100644
--- a/source/sxleveleditor/game_callback.cpp
+++ b/source/sxleveleditor/game_callback.cpp
@@ -22,12 +22,22 @@ void SXLevelEditor::GameActivateAll(bool bf)
 	SXLevelEditor::MemoGameHelp->Visible(bf);
 	SXLevelEditor::ButtonGameCreate->Visible(bf);
 
+	for (int i = 0; i < 16; ++i)
+	{
+		SXLevelEditor::CheckBoxGameFlags[i]->Visible(false);
+	}
+
 	if (!bf)
 		SXLevelEditor::GameVisibleConnections(false);
 }
 
 void SXLevelEditor::GameSel(int sel)
 {
+	for (int i = 0; i < 16; ++i)
+	{
+		SXLevelEditor::CheckBoxGameFlags[i]->Visible(false);
+	}
+
 	SXLevelEditor::ComboBoxGameValue->Visible(false);
 	SXLevelEditor::ComboBoxGameValue->Clear();
 	SXLevelEditor::EditGameValue->Visible(false);
@@ -63,6 +73,9 @@ void SXLevelEditor::GameSel(int sel)
 		ptparent = ptparent->pBaseProptable;
 	}
 
+	
+	memset(SXLevelEditor::aGameObjectFlags, 0, sizeof(const char*)* 16);
+
 	for (int k = 0; k < tmparr.size(); ++k)
 	{
 		ptparent = tmparr[(tmparr.size() - 1) - k];
@@ -78,6 +91,12 @@ void SXLevelEditor::GameSel(int sel)
 				//propdata_t* pd2 = (propdata_t*)SXLevelEditor::ListViewGameClass->GetDataItem(str);
 				SXLevelEditor::ListViewGameClass->SetTextItem(txtval, 1, str);
 			}
+
+			if (pd->szEdName && pd->type == PDF_FLAG)
+			{
+				int index = log2(pd->flags) - 16;
+				SXLevelEditor::aGameObjectFlags[index] = pd->szEdName;
+			}
 		}
 	}
 
@@ -95,8 +114,79 @@ void SXLevelEditor::GameSel(int sel)
 			//propdata_t* pd2 = (propdata_t*)SXLevelEditor::ListViewGameClass->GetDataItem(str);
 			SXLevelEditor::ListViewGameClass->SetTextItem(txtval, 1, str);
 		}
+
+		if (pd->szEdName && pd->type == PDF_FLAG)
+		{
+			int index = log2(pd->flags) - 16;
+			SXLevelEditor::aGameObjectFlags[index] = pd->szEdName;
+		}
 	}
 
+	//���������� ������� � ComboBoxGameConnectionsEvent
+	SXLevelEditor::ComboBoxGameConnectionsEvent->Clear();
+	SXLevelEditor::ComboBoxGameConnectionsAction->Clear();
+	SXLevelEditor::ListViewGameConnections->ClearStrings();
+	SXLevelEditor::EditGameConnectionsName->SetText("");
+	SXLevelEditor::EditGameConnectionsDelay->SetText("");
+	SXLevelEditor::EditGameConnectionsParameter->SetText("");
+
+	char szBuffer4096[4096];
+
+	//���������� �� ���� ������� ������� ������ �������
+	for (int i = 0; i < pt->numFields; ++i)
+	{
+		pd = &pt->pData[i];
+		
+		//���� ���� ������ �� ��� ��� ����
+		if (pd->flags & PDFF_OUTPUT)
+		{
+			//�������� ������ � ������������� �������
+			bEnt->GetKV(pd->szKey, szBuffer4096, 4096);
+
+			//������ ������
+			int iConns = parse_str(szBuffer4096, NULL, 0, ',');
+			char ** parts = (char**)alloca(sizeof(char*)*iConns);
+			iConns = parse_str(szBuffer4096, parts, iConns, ',');
+
+			for (int k = 0; k < iConns; ++k)
+			{
+				int iConns2 = parse_str(parts[k], NULL, 0, ':');
+				char ** parts2 = (char**)alloca(sizeof(char*)*iConns2);
+				iConns2 = parse_str(parts[k], parts2, iConns2, ':');
+
+				if (iConns2 > 0)
+				{
+					int iNumStr = SXLevelEditor::ListViewGameConnections->AddString((long)pd);
+					sprintf(txtkey, "%s", pd->szEdName);
+					SXLevelEditor::ListViewGameConnections->SetTextItem(txtkey, 0, iNumStr);
+
+					for (int j = 0; j < iConns2; ++j)
+						SXLevelEditor::ListViewGameConnections->SetTextItem(parts2[j], j + 1, iNumStr);
+
+					SXbaseEntity *pEnt2 = SXGame_EntGetByName(parts2[0], 0);
+					if (pEnt2)
+					{
+						proptable_t *pPropTable2 = SXGame_EntGetProptable(pEnt2->GetClassName());
+						propdata_t *pPropData2 = 0;
+						for (int j = 0; j < pPropTable2->numFields; ++j)
+						{
+							pPropData2 = &pPropTable2->pData[j];
+							if (pPropData2->flags & PDFF_INPUT && strcmp(pPropData2->szKey, parts2[1])==0)
+							{
+								sprintf(txtkey, "%s", pPropData2->szEdName);
+								SXLevelEditor::ListViewGameConnections->SetTextItem(txtkey, 2, iNumStr);
+							}
+						}
+					}
+				}
+			}
+
+			SXLevelEditor::ComboBoxGameConnectionsEvent->AddItem(pd->szEdName);
+			SXLevelEditor::ComboBoxGameConnectionsEvent->SetItemData(SXLevelEditor::ComboBoxGameConnectionsEvent->GetCount()-1, (LPARAM)(pd->szKey));
+		}
+	}
+	//-------
+	
 	SXLevelEditor::ObjAxesHelper->SetPosition(bEnt->GetPos());
 	SXLevelEditor::ObjAxesHelper->SetRotation(bEnt->GetOrient());
 	SXLevelEditor::ObjAxesHelper->SetScale(float3(1, 1, 1));
@@ -144,11 +234,19 @@ LRESULT SXLevelEditor_ListViewGameClass_Click()
 
 	char txtval[256];
 
+	for (int i = 0; i < 16; ++i)
+	{
+		SXLevelEditor::CheckBoxGameFlags[i]->Visible(false);
+	}
+
 	if (pd->editor.type == PDE_TEXTFIELD)
 	{
 		SXLevelEditor::EditGameValue->Visible(true);
 		SXLevelEditor::ListViewGameClass->GetTextItem(txtval, 1, str, 256);
 		SXLevelEditor::EditGameValue->SetText(txtval);
+
+		SXLevelEditor::StaticGameHelp->Visible(true);
+		SXLevelEditor::MemoGameHelp->Visible(true);
 	}
 	else if (pd->editor.type == PDE_FILEFIELD)
 	{
@@ -156,9 +254,15 @@ LRESULT SXLevelEditor_ListViewGameClass_Click()
 		SXLevelEditor::ButtonGameValue->Visible(true);
 		SXLevelEditor::ListViewGameClass->GetTextItem(txtval, 1, str, 256);
 		SXLevelEditor::EditGameValue->SetText(txtval);
+
+		SXLevelEditor::StaticGameHelp->Visible(true);
+		SXLevelEditor::MemoGameHelp->Visible(true);
 	}
 	else if (pd->editor.type == PDE_COMBOBOX)
 	{
+		SXLevelEditor::StaticGameHelp->Visible(true);
+		SXLevelEditor::MemoGameHelp->Visible(true);
+
 		SXLevelEditor::ComboBoxGameValue->Clear();
 		SXLevelEditor::ComboBoxGameValue->Visible(true);
 		editor_kv* ekv = (editor_kv*)pd->editor.pData;
@@ -217,6 +321,27 @@ LRESULT SXLevelEditor_ListViewGameClass_Click()
 			SXLevelEditor::ComboBoxGameValue->SetSel(SXLevelEditor::ComboBoxGameValue->GetCount()-1);
 		}
 	}
+	else if (pd->editor.type == PDE_FLAGS)
+	{
+		SXLevelEditor::StaticGameHelp->Visible(false);
+		SXLevelEditor::MemoGameHelp->Visible(false);
+		char txtval[256];
+		SXLevelEditor::ListViewGameClass->GetTextItem(txtval, 1, str, 256);
+		UINT uiFlags;
+		sscanf(txtval, "%d", &uiFlags);
+		for (int i = 0; i < 16; ++i)
+		{
+			if (SXLevelEditor::aGameObjectFlags[i])
+			{
+				SXLevelEditor::CheckBoxGameFlags[i]->SetText(SXLevelEditor::aGameObjectFlags[i]);
+				SXLevelEditor::CheckBoxGameFlags[i]->Visible(true);
+				if (uiFlags & ((1 << i + 16)))
+					SXLevelEditor::CheckBoxGameFlags[i]->SetCheck(true);
+				else
+					SXLevelEditor::CheckBoxGameFlags[i]->SetCheck(false);
+			}
+		}
+	}
 	return 0;
 }
 
@@ -380,8 +505,6 @@ LRESULT SXLevelEditor_EditGameConnectionsName_IN(HWND hwnd, UINT msg, WPARAM wPa
 					PostMessage(SXLevelEditor::EditGameConnectionsName->GetHWND(), EM_SETSEL, strlen(edit_text), strlen(lower_name));
 					return 0;
 				}
-				//int qwerty = 0;
-				//return 0;
 			}
 		}
 	}
@@ -400,6 +523,11 @@ void SXLevelEditor::GameVisibleProperties(bool bf)
 	SXLevelEditor::StaticGameHelp->Visible(bf);
 	SXLevelEditor::MemoGameHelp->Visible(bf);
 	SXLevelEditor::ButtonGameCreate->Visible(bf);
+
+	for (int i = 0; i < 16; ++i)
+	{
+		SXLevelEditor::CheckBoxGameFlags[i]->Visible(false);
+	}
 }
 
 void SXLevelEditor::GameVisibleConnections(bool bf)
@@ -415,6 +543,8 @@ void SXLevelEditor::GameVisibleConnections(bool bf)
 	SXLevelEditor::EditGameConnectionsDelay->Visible(bf);
 	SXLevelEditor::StaticGameConnectionsParameter->Visible(bf);
 	SXLevelEditor::EditGameConnectionsParameter->Visible(bf);
+	SXLevelEditor::ButtonGameConnectionsCreate->Visible(bf);
+	SXLevelEditor::ButtonGameConnectionsDelete->Visible(false);
 }
 
 LRESULT SXLevelEditor_ButtonGameTab_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
@@ -437,3 +567,378 @@ LRESULT SXLevelEditor_ButtonGameTab_Click(HWND hwnd, UINT msg, WPARAM wParam, LP
 	return 0;
 }
 
+//##########################################################################
+
+LRESULT SXLevelEditor_ListViewGameConnections_Click()
+{
+	int iNumStr = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+	//������� ����������
+	//SXLevelEditor::ComboBoxGameConnectionsEvent->Clear();
+	SXLevelEditor::ComboBoxGameConnectionsAction->Clear();
+
+	//���� ��� ����������� ����� ��������
+	if (iNumStr < 0)
+	{
+		SXLevelEditor::ComboBoxGameConnectionsEvent->SetSel(0);
+		SXLevelEditor::EditGameConnectionsName->SetText("");
+		SXLevelEditor::ComboBoxGameConnectionsAction->SetSel(0);
+		SXLevelEditor::EditGameConnectionsDelay->SetText("");
+		SXLevelEditor::EditGameConnectionsParameter->SetText("");
+		return 0;
+	}
+
+	char szStr[256];
+	char szStr2[256];
+
+	//�������� ������������ event � ComboBoxGameConnectionsEvent
+	SXLevelEditor::ListViewGameConnections->GetTextItem(szStr, 0, iNumStr, 256);
+
+	for (int i = 0; i < SXLevelEditor::ComboBoxGameConnectionsEvent->GetCount(); ++i)
+	{
+		SXLevelEditor::ComboBoxGameConnectionsEvent->GetItemText(i, szStr2);
+		if (strcmp(szStr, szStr2) == 0)
+		{
+			SXLevelEditor::ComboBoxGameConnectionsEvent->SetSel(i);
+			break;
+		}
+	}
+	//-------
+
+	//������������� ��� ������������� �������� ������� � EditGameConnectionsName
+	SXLevelEditor::ListViewGameConnections->GetTextItem(szStr, 1, iNumStr, 256);
+	SXLevelEditor::EditGameConnectionsName->SetText(szStr);
+	//-------
+
+	//������������� ������ � ComboBoxGameConnectionsAction � �������� ������������
+	SXbaseEntity *pEnt2 = 0;
+
+	//�������� �� ���� ������� ��������
+	for (int i = 0; i < SXGame_EntGetCount(); ++i)
+	{
+		pEnt2 = SXGame_EntGet(i);
+
+		//���� ��� �������� ������� ��������� �������������
+		if (pEnt2 && strcmp(pEnt2->GetName(), szStr) == 0)
+		{
+			proptable_t *pPropTable = SXGame_EntGetProptable(pEnt2->GetClassName());
+			propdata_t *pPropData = 0;
+
+			//���������� �� ���� ����� ������
+			for (int k = 0; k < pPropTable->numFields; ++k)
+			{
+				pPropData = &pPropTable->pData[k];
+				if (pPropData->flags & PDFF_INPUT)
+				{
+					SXLevelEditor::ComboBoxGameConnectionsAction->AddItem(pPropData->szEdName);
+					SXLevelEditor::ComboBoxGameConnectionsAction->SetItemData(SXLevelEditor::ComboBoxGameConnectionsAction->GetCount() - 1, (LPARAM)(pPropData->szKey));
+				}
+			}
+		}
+	}
+
+	SXLevelEditor::ListViewGameConnections->GetTextItem(szStr, 2, iNumStr, 256);
+	for (int i = 0; i < SXLevelEditor::ComboBoxGameConnectionsAction->GetCount(); ++i)
+	{
+		SXLevelEditor::ComboBoxGameConnectionsAction->GetItemText(i, szStr2);
+		if (strcmp(szStr, szStr2) == 0)
+		{
+			SXLevelEditor::ComboBoxGameConnectionsAction->SetSel(i);
+			break;
+		}
+	}
+	//-------
+
+	//������������� �������� � �������� � EditGameConnectionsDelay
+	SXLevelEditor::ListViewGameConnections->GetTextItem(szStr, 3, iNumStr, 256);
+	SXLevelEditor::EditGameConnectionsDelay->SetText(szStr);
+	//-------
+
+	//������������� �������� � EditGameConnectionsParameter
+	SXLevelEditor::ListViewGameConnections->GetTextItem(szStr, 4, iNumStr, 256);
+	SXLevelEditor::EditGameConnectionsParameter->SetText(szStr);
+	//-------
+
+	SXLevelEditor::ButtonGameConnectionsDelete->Visible(true);
+	SXLevelEditor::ButtonGameConnectionsCreate->SetText("Create");
+	SXLevelEditor::isAddGameConections = false;
+
+	return 0;
+}
+
+LRESULT SXLevelEditor_EditGameConnectionsName_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	ID idSelListBoxList = SXLevelEditor::ListBoxList->GetSel();
+	ID idSelStrTable = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+	if (idSelListBoxList < 0)
+		return 0;
+
+	SXbaseEntity *pEnt = SXGame_EntGet(idSelListBoxList);
+
+	char szBuffer256[256];
+	szBuffer256[0] = 0;
+
+	SXLevelEditor::EditGameConnectionsName->GetText(szBuffer256, 256);
+
+	SXbaseEntity *pEnt2 = SXGame_EntGetByName(szBuffer256, 0);
+
+	//���������� � szBuffer256 ������� ��� action
+	szBuffer256[0] = 0;
+	SXLevelEditor::ComboBoxGameConnectionsAction->GetItemText(SXLevelEditor::ComboBoxGameConnectionsAction->GetSel(), szBuffer256);
+
+	// ���� ������ � ��������� ������ ����������
+	if (pEnt2)
+	{
+		proptable_t *pPropTable2 = SXGame_EntGetProptable(pEnt2->GetClassName());
+		propdata_t *pPropData2 = 0;
+		SXLevelEditor::ComboBoxGameConnectionsAction->Clear();
+
+		//���������� �� ���� ������ ������� �������
+		for (int j = 0; j < pPropTable2->numFields; ++j)
+		{
+			pPropData2 = &pPropTable2->pData[j];
+
+			//���� �������� input
+			if (pPropData2->flags & PDFF_INPUT)
+			{
+				//��������� � ��������� action
+				SXLevelEditor::ComboBoxGameConnectionsAction->AddItem(pPropData2->szEdName);
+				SXLevelEditor::ComboBoxGameConnectionsAction->SetItemData(SXLevelEditor::ComboBoxGameConnectionsEvent->GetCount() - 1, (LPARAM)(pPropData2->szKey));
+
+				//���� ���������� ��� action ����� ���������� ������������
+				if (strcmp(pPropData2->szEdName, szBuffer256) == 0)
+				{
+					//���������� ��� ������ � ����������
+					SXLevelEditor::ComboBoxGameConnectionsAction->SetSel(SXLevelEditor::ComboBoxGameConnectionsAction->GetCount() - 1);
+				}
+			}
+		}
+	}
+	// ���� ������ ������ �� ����������
+	else
+	{
+		//���������� �� ��� ������ � �������
+
+		if (idSelStrTable < 0)
+			return 0;
+
+		szBuffer256[0] = 0;
+		SXLevelEditor::ListViewGameConnections->GetTextItem(szBuffer256, 1, idSelStrTable, 256);
+		SXLevelEditor::EditGameConnectionsName->SetText(szBuffer256);
+	}
+
+	return SXLevelEditor_EditGameConnections_Enter(hwnd, msg, wParam, lParam);
+}
+
+LRESULT SXLevelEditor_EditGameConnections_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	if (SXLevelEditor::isAddGameConections)
+		return 0;
+
+	ID idSelListBoxList = SXLevelEditor::ListBoxList->GetSel();
+	ID idSelStrTable = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+	if (idSelListBoxList < 0 || idSelStrTable < 0)
+		return 0;
+
+	ID idSelEnt = SXLevelEditor::ListBoxList->GetItemData(idSelListBoxList);
+	SXbaseEntity *pEnt = SXGame_EntGet(idSelEnt);
+	proptable_t *pPropTable = SXGame_EntGetProptable(pEnt->GetClassName());
+	propdata_t *pPropData = (propdata_t*)(SXLevelEditor::ListViewGameConnections->GetDataItem(idSelStrTable));
+
+	//�������� �������� � ������ ������ ������
+	char szBuffer4096[4096];
+	szBuffer4096[0] = 0;
+	SXLevelEditor_VeldStringGameConnections(pPropTable, pPropData, -1, szBuffer4096, 4096);
+
+
+	//������������� � ���������� � ������� ������ ������ �� ����������
+	char szBuffer256[256];
+	szBuffer256[0] = 0;
+
+	SXLevelEditor::ComboBoxGameConnectionsEvent->GetItemText(SXLevelEditor::ComboBoxGameConnectionsEvent->GetSel(), szBuffer256);
+	SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 0, idSelStrTable);
+	
+	szBuffer256[0] = 0;
+	SXLevelEditor::EditGameConnectionsName->GetText(szBuffer256, 256);
+	SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 1, idSelStrTable);
+
+	szBuffer256[0] = 0;
+	SXLevelEditor::ComboBoxGameConnectionsAction->GetItemText(SXLevelEditor::ComboBoxGameConnectionsAction->GetSel(), szBuffer256);
+	SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 2, idSelStrTable);
+
+	szBuffer256[0] = 0;
+	SXLevelEditor::EditGameConnectionsDelay->GetText(szBuffer256, 256);
+	SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 3, idSelStrTable);
+
+	szBuffer256[0] = 0;
+	SXLevelEditor::EditGameConnectionsParameter->GetText(szBuffer256, 256);
+	SXLevelEditor::ListViewGameConnections->SetTextItem(szBuffer256, 4, idSelStrTable);
+
+	pEnt->SetKV(pPropData->szKey, szBuffer4096);
+
+	return 0;
+}
+
+void SXLevelEditor_VeldStringGameConnections(proptable_t *pPropTable, propdata_t *pPropData, int iNumExclude, char* szStrOut, int iSize)
+{
+	char szBuffer256[256];
+	szBuffer256[0] = 0;
+
+	//���������� �� ���� ������� �������
+	for (int i = 0, il = SXLevelEditor::ListViewGameConnections->GetCountString(); i < il; ++i)
+	{
+		//���� ������ � ���� ������� ���� ���������
+		if (iNumExclude == i)
+			continue;
+
+		propdata_t *pPropData2 = (propdata_t*)SXLevelEditor::ListViewGameConnections->GetDataItem(i);
+
+		//���� �������� �� ��� ��� ����
+		if (pPropData == pPropData2)
+		{
+			if (strlen(szStrOut) > 0)
+				sprintf(szStrOut + strlen(szStrOut), ",");
+
+			szBuffer256[0] = 0;
+			SXLevelEditor::ListViewGameConnections->GetTextItem(szBuffer256, 1, i, 256);
+			sprintf(szStrOut + strlen(szStrOut), "%s:", szBuffer256);
+
+			//���� ������ � ������� ����� ����������
+			SXbaseEntity *pEnt2 = SXGame_EntGetByName(szBuffer256);
+			proptable_t *pPropTable2 = 0;
+
+			if (pEnt2)
+				pPropTable2 = SXGame_EntGetProptable(pEnt2->GetClassName());
+
+			szBuffer256[0] = 0;
+			SXLevelEditor::ListViewGameConnections->GetTextItem(szBuffer256, 2, i, 256);
+
+			//���� ������ ��� ���������� ����������
+			if (pEnt2)
+			{
+				//���������� �� ���� ����� ������� ������
+				for (int k = 0; k < pPropTable2->numFields; ++k)
+				{
+					propdata_t *pPropData3 = &pPropTable2->pData[k];
+
+					//���� ���� ������ �� ��� ��� ����
+					if (pPropData3->flags & PDFF_INPUT && strcmp(pPropData3->szEdName, szBuffer256) == 0)
+					{
+						sprintf(szStrOut + strlen(szStrOut), "%s:", pPropData3->szKey);
+						break;
+					}
+				}
+			}
+			//���� ������ ��� ���������� ���
+			else
+			{
+				sprintf(szStrOut + strlen(szStrOut), ":");
+			}
+
+			szBuffer256[0] = 0;
+			SXLevelEditor::ListViewGameConnections->GetTextItem(szBuffer256, 3, i, 256);
+			sprintf(szStrOut + strlen(szStrOut), "%s:", szBuffer256);
+
+			szBuffer256[0] = 0;
+			SXLevelEditor::ListViewGameConnections->GetTextItem(szBuffer256, 4, i, 256);
+			sprintf(szStrOut + strlen(szStrOut), "%s", szBuffer256);
+		}
+	}
+}
+
+LRESULT SXLevelEditor_ButtonGameConnectionsCreate_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	ID idSelListBoxList = SXLevelEditor::ListBoxList->GetSel();
+	ID idSelStrTable = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+	if (idSelListBoxList < 0)
+		return 0;
+
+	ID idSelEnt = SXLevelEditor::ListBoxList->GetItemData(idSelListBoxList);
+	SXbaseEntity *pEnt = SXGame_EntGet(idSelEnt);
+	proptable_t *pPropTable = SXGame_EntGetProptable(pEnt->GetClassName());
+
+	if (!pEnt)
+		return 0;
+
+	//���� ���������� ������ ����������
+	if (SXLevelEditor::isAddGameConections)
+	{
+		if (idSelStrTable < 0)
+			return 0;
+
+		propdata_t *pPropData = (propdata_t*)(SXLevelEditor::ListViewGameConnections->GetDataItem(idSelStrTable));
+
+		SXLevelEditor::ButtonGameConnectionsDelete->Visible(true);
+		SXLevelEditor::ButtonGameConnectionsCreate->SetText("Create");
+		SXLevelEditor::isAddGameConections = false;
+
+		char szBuffer4096[4096];
+		szBuffer4096[0] = 0;
+
+		SXLevelEditor_VeldStringGameConnections(pPropTable, pPropData, -1, szBuffer4096, 4096);
+
+		if (strlen(szBuffer4096) > 0)
+			sprintf(szBuffer4096 + strlen(szBuffer4096), ",");
+
+		char szBuffer256[256];
+		szBuffer256[0] = 0;
+
+		SXLevelEditor::EditGameConnectionsName->GetText(szBuffer256, 256);
+		sprintf(szBuffer4096 + strlen(szBuffer4096), "%s:", szBuffer256);
+
+		szBuffer256[0] = 0;
+		long lItemData = SXLevelEditor::ComboBoxGameConnectionsAction->GetItemData(SXLevelEditor::ComboBoxGameConnectionsAction->GetSel());
+		sprintf(szBuffer4096 + strlen(szBuffer4096), "%s:", (char*)lItemData);
+
+		szBuffer256[0] = 0;
+		SXLevelEditor::EditGameConnectionsDelay->GetText(szBuffer256, 256);
+		sprintf(szBuffer4096 + strlen(szBuffer4096), "%s:", szBuffer256);
+
+		szBuffer256[0] = 0;
+		SXLevelEditor::EditGameConnectionsParameter->GetText(szBuffer256, 256);
+		sprintf(szBuffer4096 + strlen(szBuffer4096), "%s", szBuffer256);
+
+		pEnt->SetKV(pPropData->szKey, szBuffer4096);
+
+		SXLevelEditor::GameSel(idSelListBoxList);
+	}
+	//����� �������� ������ ����������
+	else
+	{
+		SXLevelEditor::ButtonGameConnectionsDelete->Visible(false);
+		SXLevelEditor::ButtonGameConnectionsCreate->SetText("Add");
+		SXLevelEditor::isAddGameConections = true;
+	}
+	return 0;
+}
+
+LRESULT SXLevelEditor_ButtonGameConnectionsDelete_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	ID idSelListBoxList = SXLevelEditor::ListBoxList->GetSel();
+	ID idSelStrTable = SXLevelEditor::ListViewGameConnections->GetSelString();
+
+	if (idSelListBoxList < 0 || idSelStrTable < 0)
+		return 0;
+
+	ID idSelEnt = SXLevelEditor::ListBoxList->GetItemData(idSelListBoxList);
+	SXbaseEntity *pEnt = SXGame_EntGet(idSelEnt);
+	proptable_t *pPropTable = SXGame_EntGetProptable(pEnt->GetClassName());
+	propdata_t *pPropData = (propdata_t*)(SXLevelEditor::ListViewGameConnections->GetDataItem(idSelStrTable));
+
+	if (!pEnt)
+		return 0;
+
+	char szBuffer4096[4096];
+	szBuffer4096[0] = 0;
+
+	SXLevelEditor_VeldStringGameConnections(pPropTable, pPropData, idSelStrTable, szBuffer4096, 4096);
+
+	pEnt->SetKV(pPropData->szKey, szBuffer4096);
+	SXLevelEditor::GameSel(idSelListBoxList);
+
+	return 0;
+}
+
diff --git a/source/sxleveleditor/game_callback.h b/source/sxleveleditor/game_callback.h
index 6388da21ebd9d7b3426abb95705f7597e778a678..11cf729973046c8c83bffe7e0ebee7f26e83d25b 100644
--- a/source/sxleveleditor/game_callback.h
+++ b/source/sxleveleditor/game_callback.h
@@ -4,17 +4,52 @@
 
 #include "level_editor.h"
 
+//! ������������� ����� ���������� � ������������ �������� ������� 
+LRESULT SXLevelEditor_ButtonGameTab_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+//**************************************************************************
+
+//! ���� �� ListViewGameClass
 LRESULT SXLevelEditor_ListViewGameClass_Click();
 
+//! ���������� ���������� �������� ��� ��������� �������� �������
 LRESULT SXLevelEditor_EditGameValue_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
+//! ����� ������� ������ ��� ����� ��������� �������� �������
 LRESULT SXLevelEditor_ButtonGameValue_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
+//! ������� ������� ������
 LRESULT SXLevelEditor_ButtonGameCreate_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
+//**************************************************************************
+
+//! ������� �������� �� ������� ��������
+void SXLevelEditor_VeldStringGameConnections(
+	proptable_t *pPropTable,	//!< ������� ������ ������� �������� pPropData (�������� ���� ������)
+	propdata_t *pPropData,		//!< ����� ����� �� ������� ������ ���� � �������� �������� ���
+	int iNumExclude,			//!< ��������� ������ ������� � ���� �������
+	char *szStrOut,				//!< ������ � ������� ������������� ��� �������� ������
+	int iSize					//!< ������ szStrOut	(�������� ���� ������)
+	);
+
+//! ���� �� ������� ����������
+LRESULT SXLevelEditor_ListViewGameConnections_Click();
+
+//! ��������� ��������� ����� � EditGameConnectionsName ����� ���� ���������������
 LRESULT SXLevelEditor_EditGameConnectionsName_IN(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
+//! ���������� �������� ���������� � EditGameConnectionsName
+LRESULT SXLevelEditor_EditGameConnectionsName_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+//! ���������� ���� ���������� � ���������� � ����������� ����������
+LRESULT SXLevelEditor_EditGameConnections_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+//! �������� ������ ����������
+LRESULT SXLevelEditor_ButtonGameConnectionsCreate_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+//! �������� ����������� ����������
+LRESULT SXLevelEditor_ButtonGameConnectionsDelete_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
 
-LRESULT SXLevelEditor_ButtonGameTab_Click(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
 #endif
\ No newline at end of file
diff --git a/source/sxleveleditor/level_editor.cpp b/source/sxleveleditor/level_editor.cpp
index 675fa20a7ec9e5cd2fdb7446e4487101e7e0d914..29b45fd39e834e0621b885b1fadad926ae18e38e 100644
--- a/source/sxleveleditor/level_editor.cpp
+++ b/source/sxleveleditor/level_editor.cpp
@@ -147,6 +147,9 @@ namespace SXLevelEditor
 	ISXGUIMemo* MemoGameHelp;
 	ISXGUIButton* ButtonGameCreate;
 
+	ISXGUICheckBox* CheckBoxGameFlags[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+	const char* aGameObjectFlags[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+
 	ISXGUIListView* ListViewGameConnections;
 	ISXGUIStatic* StaticGameConnectionsEvent;
 	ISXGUIComboBox* ComboBoxGameConnectionsEvent;
@@ -158,6 +161,8 @@ namespace SXLevelEditor
 	ISXGUIEdit* EditGameConnectionsDelay;
 	ISXGUIStatic* StaticGameConnectionsParameter;
 	ISXGUIEdit* EditGameConnectionsParameter;
+	ISXGUIButton* ButtonGameConnectionsCreate;
+	ISXGUIButton* ButtonGameConnectionsDelete;
 	//}
 
 	//aigrid
@@ -263,6 +268,8 @@ namespace SXLevelEditor
 	float3 HelperRot;
 	float3 HelperScale;
 
+	bool isAddGameConections = false;
+
 	ID IdMtl = -1;
 	ID MenuWeatherCurrID = -1;
 	int MenuWeatherCount = 0;
@@ -1283,13 +1290,39 @@ void SXLevelEditor::InitAllElements()
 	SXLevelEditor::MemoGameHelp->GAlign.top = true;
 	SXLevelEditor::MemoGameHelp->Visible(false);
 
-	SXLevelEditor::ButtonGameCreate = SXGUICrButton("Create", 695, 160, 100, 20, 0, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0);
+	SXLevelEditor::ButtonGameCreate = SXGUICrButton("Create", 695, 165, 100, 20, 0, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0);
 	SXLevelEditor::ButtonGameCreate->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXLevelEditor::ButtonGameCreate->GAlign.left = true;
 	SXLevelEditor::ButtonGameCreate->GAlign.top = true;
 	SXLevelEditor::ButtonGameCreate->Visible(false);
 	SXLevelEditor::ButtonGameCreate->AddHandler(SXLevelEditor_ButtonGameCreate_Click, WM_LBUTTONUP);
 
+	for (int i = 0; i < 8; ++i)
+	{
+		SXLevelEditor::CheckBoxGameFlags[i] = SXGUICrCheckBox("", 415, 45 + (15*i), 180, 15, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0, false);
+		SXLevelEditor::CheckBoxGameFlags[i]->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+		SXLevelEditor::CheckBoxGameFlags[i]->SetColorText(0, 0, 0);
+		SXLevelEditor::CheckBoxGameFlags[i]->SetColorTextBk(255, 255, 255);
+		SXLevelEditor::CheckBoxGameFlags[i]->SetTransparentTextBk(true);
+		SXLevelEditor::CheckBoxGameFlags[i]->SetColorBrush(220, 220, 220);
+		SXLevelEditor::CheckBoxGameFlags[i]->GAlign.left = true;
+		SXLevelEditor::CheckBoxGameFlags[i]->GAlign.top = true;
+		SXLevelEditor::CheckBoxGameFlags[i]->Visible(false);
+	}
+
+	for (int i = 0; i < 8; ++i)
+	{
+		SXLevelEditor::CheckBoxGameFlags[i + 8] = SXGUICrCheckBox("", 600, 45 + (15 * i), 180, 15, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0, false);
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->SetColorText(0, 0, 0);
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->SetColorTextBk(255, 255, 255);
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->SetTransparentTextBk(true);
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->SetColorBrush(220, 220, 220);
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->GAlign.left = true;
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->GAlign.top = true;
+		SXLevelEditor::CheckBoxGameFlags[i + 8]->Visible(false);
+	}
+
 
 	SXLevelEditor::ListViewGameConnections = SXGUICrListView("", 5, 5, 550, 180, SXLevelEditor::GroupBoxData->GetHWND(), WndProcAllDefault, 0);
 	SXLevelEditor::ListViewGameConnections->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
@@ -1346,8 +1379,8 @@ void SXLevelEditor::InitAllElements()
 	SXLevelEditor::EditGameConnectionsName->GAlign.top = true;
 	SXLevelEditor::EditGameConnectionsName->Visible(false);
 	SXLevelEditor::EditGameConnectionsName->AddHandler(SXLevelEditor_EditGameConnectionsName_IN, WM_KEYUP);
-	//SXLevelEditor::EditGameValue->AddHandler(SXLevelEditor_EditGameValue_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
-	//SXLevelEditor::EditGameValue->AddHandler(SXLevelEditor_EditGameValue_Enter, WM_KILLFOCUS);
+	SXLevelEditor::EditGameConnectionsName->AddHandler(SXLevelEditor_EditGameConnectionsName_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
+	SXLevelEditor::EditGameConnectionsName->AddHandler(SXLevelEditor_EditGameConnectionsName_Enter, WM_KILLFOCUS);
 
 	SXLevelEditor::StaticGameConnectionsAction = SXGUICrStatic("Action:", 560, 95, 50, 15, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0);
 	SXLevelEditor::StaticGameConnectionsAction->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
@@ -1388,6 +1421,8 @@ void SXLevelEditor::InitAllElements()
 	SXLevelEditor::EditGameConnectionsDelay->GAlign.left = true;
 	SXLevelEditor::EditGameConnectionsDelay->GAlign.top = true;
 	SXLevelEditor::EditGameConnectionsDelay->Visible(false);
+	SXLevelEditor::EditGameConnectionsDelay->AddHandler(SXLevelEditor_EditGameConnections_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
+	SXLevelEditor::EditGameConnectionsDelay->AddHandler(SXLevelEditor_EditGameConnections_Enter, WM_KILLFOCUS);
 
 	SXLevelEditor::StaticGameConnectionsParameter = SXGUICrStatic("Parameter:", 560, 140, 50, 15, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0);
 	SXLevelEditor::StaticGameConnectionsParameter->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
@@ -1408,7 +1443,25 @@ void SXLevelEditor::InitAllElements()
 	SXLevelEditor::EditGameConnectionsParameter->GAlign.left = true;
 	SXLevelEditor::EditGameConnectionsParameter->GAlign.top = true;
 	SXLevelEditor::EditGameConnectionsParameter->Visible(false);
+	SXLevelEditor::EditGameConnectionsParameter->AddHandler(SXLevelEditor_EditGameConnections_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
+	SXLevelEditor::EditGameConnectionsParameter->AddHandler(SXLevelEditor_EditGameConnections_Enter, WM_KILLFOCUS);
+
 	
+	SXLevelEditor::ButtonGameConnectionsCreate = SXGUICrButton("Create", 565, 160, 100, 20, 0, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0);
+	SXLevelEditor::ButtonGameConnectionsCreate->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXLevelEditor::ButtonGameConnectionsCreate->GAlign.left = true;
+	SXLevelEditor::ButtonGameConnectionsCreate->GAlign.top = true;
+	SXLevelEditor::ButtonGameConnectionsCreate->Visible(false);
+	SXLevelEditor::ButtonGameConnectionsCreate->AddHandler(SXLevelEditor_ButtonGameConnectionsCreate_Click, WM_LBUTTONUP);
+	SXLevelEditor::isAddGameConections = false;
+
+	SXLevelEditor::ButtonGameConnectionsDelete = SXGUICrButton("Delete", 690, 160, 100, 20, 0, SXLevelEditor::GroupBoxData->GetHWND(), 0, 0);
+	SXLevelEditor::ButtonGameConnectionsDelete->SetFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXLevelEditor::ButtonGameConnectionsDelete->GAlign.left = true;
+	SXLevelEditor::ButtonGameConnectionsDelete->GAlign.top = true;
+	SXLevelEditor::ButtonGameConnectionsDelete->Visible(false);
+	SXLevelEditor::ButtonGameConnectionsDelete->AddHandler(SXLevelEditor_ButtonGameConnectionsDelete_Click, WM_LBUTTONUP);
+
 	//}
 
 	//aigrid
@@ -1937,7 +1990,7 @@ void SXLevelEditor::LevelEditorUpdate(DWORD timeDelta)
 	static float3 vCamPos;
 	Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vCamPos);
 
-	static const float * p_far = GET_PCVAR_FLOAT("p_far");
+	static const float * r_far = GET_PCVAR_FLOAT("r_far");
 
 	long count_poly_green = 0;
 	for (int i = 0; i < SGeom_GreenGetCount(); ++i)
@@ -2059,10 +2112,10 @@ void SXLevelEditor::LevelEditorUpdate(DWORD timeDelta)
 	SGCore_GetDXDevice()->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
 
 	if (SXLevelEditor::AIGQuad)
-		SAIG_RenderQuads(SRender_GetCamera()->ObjFrustum, &vCamPos, *p_far);
+		SAIG_RenderQuads(SRender_GetCamera()->ObjFrustum, &vCamPos, *r_far);
 
 	if (SXLevelEditor::AIGGraphPoint)
-		SAIG_RenderGraphPoints(&vCamPos, *p_far);
+		SAIG_RenderGraphPoints(&vCamPos, *r_far);
 
 	if (SXLevelEditor::AIGBound)
 	{
diff --git a/source/sxleveleditor/level_editor.h b/source/sxleveleditor/level_editor.h
index c78cd4ea904c818360b5d78522ff9909f1c6bdf1..43d27775075ad1485149ace9ff782164cc54914c 100644
--- a/source/sxleveleditor/level_editor.h
+++ b/source/sxleveleditor/level_editor.h
@@ -165,6 +165,7 @@ namespace SXLevelEditor
 	extern ISXGUIComboBox* ComboBoxGameClass;
 	extern ISXGUIButton* ButtonGameTab;
 
+	//! ������� �������� ������ ������� ��������, 0 - ���������, 1 - ����������
 	extern int GameTabVal;
 
 	extern ISXGUIListView* ListViewGameClass;
@@ -175,6 +176,9 @@ namespace SXLevelEditor
 	extern ISXGUIMemo* MemoGameHelp;
 	extern ISXGUIButton* ButtonGameCreate;
 
+	extern ISXGUICheckBox* CheckBoxGameFlags[16];
+	extern const char* aGameObjectFlags[16];
+
 	extern ISXGUIListView* ListViewGameConnections;
 	extern ISXGUIStatic* StaticGameConnectionsEvent;
 	extern ISXGUIComboBox* ComboBoxGameConnectionsEvent;
@@ -186,6 +190,8 @@ namespace SXLevelEditor
 	extern ISXGUIEdit* EditGameConnectionsDelay;
 	extern ISXGUIStatic* StaticGameConnectionsParameter;
 	extern ISXGUIEdit* EditGameConnectionsParameter;
+	extern ISXGUIButton* ButtonGameConnectionsCreate;
+	extern ISXGUIButton* ButtonGameConnectionsDelete;
 	//}
 
 	//aigrid
@@ -229,6 +235,8 @@ namespace SXLevelEditor
 
 	extern ISXGUIStatusBar* StatusBar1;
 
+	//**********************************************************************
+
 	void InitAllElements();
 
 	void DeleteAllElements();
@@ -255,9 +263,14 @@ namespace SXLevelEditor
 	void GameActivateAll(bool bf);
 	void GameSel(int sel);
 	void GameUpdatePosRot();
+
+	//! ��������� ��������� ������� �������
 	void GameVisibleProperties(bool bf);
+
+	//! ��������� ��������� ������� ����������
 	void GameVisibleConnections(bool bf);
 
+
 	void AIGridActivateAll(bool bf);
 	void AIGridEnableBB(bool bf);
 
@@ -296,6 +309,11 @@ namespace SXLevelEditor
 	extern float3 HelperRot;
 	extern float3 HelperScale;
 
+	/*! ���������� (true) ���� �������� ������ (false) ���������� ��� �������� ������� 
+	 \note ��� ���������� ��� ������ � ���������� ������������ � ����� ���������, ��� �������� ��������� ������������ �� ������� � �� ����� �������� ��������
+	*/
+	extern bool isAddGameConections;
+
 	extern ID IdMtl;
 	extern ID MenuWeatherCurrID;
 	extern int MenuWeatherCount;
diff --git a/source/sxleveleditor/sxleveleditor.cpp b/source/sxleveleditor/sxleveleditor.cpp
index e75a6f09e1b83674b74a70e18420ab2dfab6ea3d..a9d6d0f372a054b07a4da09770c32887fa258757 100644
--- a/source/sxleveleditor/sxleveleditor.cpp
+++ b/source/sxleveleditor/sxleveleditor.cpp
@@ -1,9 +1,200 @@
 
 /******************************************************
-Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017
 See the license in LICENSE
 ******************************************************/
 
+/*!
+\file
+Главный файл редактора уровней SXLevelEditor
+*/
+
+/*!
+\page level_editor Редактор уровней SXLevelEditor
+\tableofcontents
+\section level_editor_main Общее
+\b SXLevelEditor – редактор уровней движка SkyXEngine.\n
+Редактор работает с файлом в текстовом формате .lvl который содержит всю информацию об уровне. 
+Данный файл должен находится по относительному пути (относительно программы) /gamesource/level/name_level/name_level.lvl
+при этом имя директории и имя файла .lvl должны быть идентичными\n
+
+\image html level_editor/level_editor.png "Скриншот программы SXLevelEditor"
+
+\section level_editor_window Структура окна
+<b>Окно состоит из структурных элементов (сверху вниз):</b>
+ - Заголовок окна, содержащий имя редактора и имя уровня.
+ - Меню программы:
+  - File:
+   - New – очистить сцену и создать новый уроень
+   - Open – открыть файл уровня
+   - Save – сохранить уровень
+   - Save as ... – сохранить уровень как
+   - Exit – выход из программы
+ - View (редакторные настройки вида):
+  - Grid – сетка разметки (оси xz)
+  - Axes – линии по направлению осей
+ - Final image (выводимое изображение в окно рендера):
+  - Color – цвет
+  - Normals – нормали
+  - Parameters – параметры освещения
+  - Ambient - фоновое и диффузное освещение
+  - Specular – отраженный свет
+  - Lighting scene – освещенная сцена
+ - Selection settings (настройки выделения)
+  - Selection - надо ли выделять объект
+  - Z Test - использовать ли z test при рендере выделения
+  - Mesh - показывать сетку или модель целиком при выделении
+  - Cull backfaces - показывать задние грани выделения
+ - Weather (погода)
+  - none - без погоды
+  - ниже следует список доступных конфигов погоды
+ - Панель инструментов, где расположены основные управляющие кнопки:
+  - \image html level_editor/toolbar/new.bmp – очистить сцену и создать новый уроень
+  - \image html level_editor/toolbar/open.bmp – открыть файл уровня
+  - \image html level_editor/toolbar/save.bmp – сохранить уровень
+  - \image html level_editor/toolbar/save_as.bmp – сохранить уровень как
+  - \image html level_editor/toolbar/arrow.bmp - выделение/отметка объектов
+  - \image html level_editor/toolbar/pos.bmp - перемещение объекты
+  - \image html level_editor/toolbar/rot.bmp - вращение объектов
+  - \image html level_editor/toolbar/scale.bmp - масштабирование объектов
+  - \image html level_editor/toolbar/grid.bmp - показывать сетку 
+  - \image html level_editor/toolbar/axes.bmp - показывать статичные оси в центре системы координат
+  - \image html level_editor/toolbar/r_c.bmp - цвет (выводимое изображение в окно рендера)
+  - \image html level_editor/toolbar/r_n.bmp - нормали (выводимое изображение в окно рендера)
+  - \image html level_editor/toolbar/r_p.bmp - параметры освещения (выводимое изображение в окно рендера)
+  - \image html level_editor/toolbar/r_ad.bmp - фоновое и диффузное освещение (выводимое изображение в окно рендера)
+  - \image html level_editor/toolbar/r_s.bmp - отраженный свет (выводимое изображение в окно рендера)
+  - \image html level_editor/toolbar/r_l.bmp - освещенная сцена (выводимое изображение в окно рендера)
+  - \image html level_editor/toolbar/sel_s.bmp - надо ли выделять объект
+  - \image html level_editor/toolbar/sel_z.bmp - использовать ли z test при рендере выделения
+  - \image html level_editor/toolbar/sel_m.bmp - показывать сетку или модель целиком при выделении
+  - \image html level_editor/toolbar/sel_cb.bmp - показывать задние грани выделения
+  - \image html level_editor/toolbar/aigrid_bound.bmp - показывать ли ограничивающий объем ai сетки
+  - \image html level_editor/toolbar/aigrid_quad.bmp - показывать ли квадраты ai сетки
+  - \image html level_editor/toolbar/aigrid_graphpoint.bmp - показывать ил графпоинты ai сетки
+  - \image html level_editor/toolbar/lvl_out.bmp - открытый (out) или закрытый (in) уровень
+  - \image html level_editor/toolbar/sun.bmp - включить глобальный источник света
+
+ - Содержимое окна – рабочая область по настройке уровня
+ - Раздел объектов уровня
+  - \image html level_editor/toolbar/list_level_objects.png - список объектов уровня в зависимости от типа выбора
+  - \image html level_editor/toolbar/buttons_type_object.png - кнопки выбора типа объектов уровня
+ - Строка состояния:
+  - \image html level_editor/status_level_poly.png – общее количество полигонов на уровне
+  - \image html level_editor/statusbar_geom_poly.png – количество полигонов геометрии
+  - \image html level_editor/statusbar_green_poly.png – количество полигонов растительности
+  - \image html level_editor/statusbar_count_game_object.png – количество игровых объектов
+
+
+\section level_editor_camera Управление камерой
+CTRL + w – движение вперед \n
+CTRL + s – движение назад \n
+CTRL + a – движение влево \n
+CTRL + d – движение вправо \n
+SHIFT - ускорение \n
+CTRL + ПКМ – движение вверх/вниз \n
+CTRL + ЛКМ – вращение \n
+
+
+\subsection level_editor_gui_geom Static geometry – статическая геометрия
+\image html level_editor/staticgeom_pre.png интерфейс статической геометрии до добавления модели
+\n
+\image html level_editor/staticgeom_post.png интерфейс статической геометрии после добавления модели
+\n
+
+ - \b Name - имя объекта
+ - \b Model - путь до статической модели (относительно директории со статическими моделями)
+ - \b Lod1 - путь до лода статической модели (относительно директории со статическими моделями)
+ - \b Position - позиция объекта, при отметке одного из переключателей + RShift + ЛКМ будет трансформация по выбранной оси
+ - \b Rotation - вращение объекта, при отметке одного из переключателей + RShift + ЛКМ будет трансформация по выбранной оси
+ - \b Scale (не рекомендуется) - масштабирование объекта, при отметке одного из переключателей + RShift + ЛКМ будет трансформация по выбранной оси
+
+
+\subsection level_editor_gui_green Green - растительность
+\image html level_editor/green_pre.png интерфейс растительности до добавления растительности
+\n
+\image html level_editor/green_post.png интерфейс растительности после добавления растительности
+\n
+
+\note Если указать модель только для Model объект будет травой, иначе (должны быть заполнены все лоды) объект будет кустаник/дерево
+\todo Про плотность надо расписать более подробно
+
+ - \b Name - имя объекта
+ - \b Model - путь до статической модели (относительно директории со статическими моделями)
+ - \b Lod1 - путь до первого лода статической модели (относительно директории со статическими моделями)
+ - \b Lod2 - путь до первого лода статической модели (относительно директории со статическими моделями)
+ - \b Mask texture - имя текстуры маски, по которой будет сгенерирована растительность (маска покрывает весь уровень), необязательно в случае ручной расстановки
+ - \b NavMesh - если растительность должна иметь физические параметры (к примеру для деревьев) то путь до статической модели (относительно директории со статическими моделями)
+ - \b Density - плотность растительности
+
+После добавления и выделения объекта растительности станвятся доступны новые элементы:
+\image html level_editor/green_post_add.png интерфейс растительности после добавления растительности
+ - новый элемент ComboBox содержит:
+  - \b single select - выделение единицы объекта растительности по ЛКМ
+  - \b single create - создание единицы объекта растительности по ЛКМ
+  - \b multiple create - множественное создание единиц объекта растительности, ПКМ постановка бокса, ЛКМ постановка бокса и генерация в нем единицы объекта растительности
+  - \b single delete - удаление единицы объекта растительности  по ЛКМ
+ - \b PosX/PoxY/PosZ - установка значения позиции выделенной единицы объекта растительности, если multiple create то установка размеров бокса в котором будет сгенерирована растительность, при вкюченном переключатели на однйо из осей + нажатии LShift + ЛКМ (вверх/вниз) перемещение по выбранной оси (если multiple create то изменение размеров бокса по выбранной оси)
+
+
+\subsection level_editor_gui_aigrid AI grid - ai сетка
+\image html level_editor/aigrid_pre.png интерфейс ai сетки определения границ
+\n
+\image html level_editor/aigrid_post.png интерфейс ai сетки после определения границ
+\n
+
+Для создания ai сетки, необходимо определить ее границы:
+ - \b Bound box dimensions - 
+ - \b Bound box position - 
+ - \b Create bound box - 
+
+\note Для генерации AI сетки необходимо чтобы хотя бы один квадрат был создан, квадрат должен быть незамкнут уровнем.
+\todo Уточнить про валидность сетки
+
+После создания границ доступны следующие возможности:
+ - \b AI quad add - добавить квадрат по ЛКМ
+ - \b AI quad multi select - мультивыделение квадратов по ЛКМ, и единичное выделение по ПКМ
+ - \b AI quads select->delete - удаление при выделении ЛКМ
+ - \b AI quads delete selected - удалить выделенные
+ - \b AI grid generation - сгенерировать сетку
+ - \b AI grid clear - очистка сетки (удаление всех квадратов)
+ - \b Graph point add - добавить графпоинт по ЛКМ
+ - \b Graph point delete - удалить графпоинт по ЛКМ
+ - \b Graph points generate - сгенерировать графпоинты
+ - \b Graph points clear - очистить список графпоинтов
+ - \b AI grid validation - проверить сетку на валидность
+ - \b Marked splits - отмитить куски сетки разными цветами
+ - \b Count quads - количество квадратов сетки
+ - \b Count graph points - количество графпоинтов
+ - \b Count splits - количество кусков сетки
+ - \b Clear all - очистить все
+
+Если есть хотя бы один выделенный квадрат, LCTRL + ЛКМ (вверх/вниз) будет перемещать квадрат/квадраты
+
+
+\subsection level_editor_gui_gameobject Game object - игровой объект
+\image html level_editor/gameobject_properties.png интерфейс свойств игрового объекта
+\n
+
+Таблица слева содержит все доступные свойства игрвоого объекта.
+ - \b Class - класс объекта
+ - \b Help - подсказка
+ - \b Create - создание нового объекта
+ - \b Connections - переход к соединениям объекта
+
+\image html level_editor/gameobject_connections.png интерфейс соединений игрового объекта
+\n
+Таблица слева содержит все соединения игрового объекта
+ - \b Event - событие (выход)
+ - \b Name - имя игрового объекта с которым происходит связь
+ - \b Action - действие (вход)
+ - \b Delay - задержка в секундах (float)
+ - \b Parameter - дополнительный параметр
+ - \b Create - создание нового соединения
+ - \b Properties - переход к свойствам объекта
+
+*/
+
 #define _CRT_SECURE_NO_WARNINGS
 
 //#include <vld.h> 
@@ -36,7 +227,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLin
 
 	SXLevelEditor::CheckBoxTBRColor->SetCheck(true);
 	SXLevelEditor::MainMenu->CheckItem(ID_FINALIMAGE_COLOR, true);
-	Core_0SetCVarInt("final_image", DS_RT_COLOR);
+	Core_0SetCVarInt("r_final_image", DS_RT_COLOR);
 
 	SXLevelEditor::CheckBoxTBSelS->SetCheck(true);
 	SXLevelEditor::SelSelection = true;
diff --git a/source/sxmaterialeditor/common_callback.cpp b/source/sxmaterialeditor/common_callback.cpp
index a232db4182e11c9ec6d1ca1464263d54b1dda9bc..f40d5bfd5586e4d22d8bf6953a169fc90f5ffd08 100644
--- a/source/sxmaterialeditor/common_callback.cpp
+++ b/source/sxmaterialeditor/common_callback.cpp
@@ -58,42 +58,42 @@ LRESULT ComMenuId(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 	//
 	else if (id == ID_FINALIMAGE_COLOR)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_COLOR);
+		Core_0SetCVarInt("r_final_image", DS_RT_COLOR);
 		SXMaterialEditor::FinalImageUncheckedMenu();
 		SXMaterialEditor::MainMenu->CheckItem(id, !SXMaterialEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_NORMALS)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_NORMAL);
+		Core_0SetCVarInt("r_final_image", DS_RT_NORMAL);
 		SXMaterialEditor::FinalImageUncheckedMenu();
 		SXMaterialEditor::MainMenu->CheckItem(id, !SXMaterialEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_PARAMETERS)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_PARAM);
+		Core_0SetCVarInt("r_final_image", DS_RT_PARAM);
 		SXMaterialEditor::FinalImageUncheckedMenu();
 		SXMaterialEditor::MainMenu->CheckItem(id, !SXMaterialEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_AMBIENTDIFFUSE)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_AMBIENTDIFF);
+		Core_0SetCVarInt("r_final_image", DS_RT_AMBIENTDIFF);
 		SXMaterialEditor::FinalImageUncheckedMenu();
 		SXMaterialEditor::MainMenu->CheckItem(id, !SXMaterialEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_SPECULAR)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_SPECULAR);
+		Core_0SetCVarInt("r_final_image", DS_RT_SPECULAR);
 		SXMaterialEditor::FinalImageUncheckedMenu();
 		SXMaterialEditor::MainMenu->CheckItem(id, !SXMaterialEditor::MainMenu->GetCheckedItem(id));
 	}
 	//
 	else if (id == ID_FINALIMAGE_LIGHTINGSCENE)
 	{
-		Core_0SetCVarInt("final_image", DS_RT_SCENELIGHT);
+		Core_0SetCVarInt("r_final_image", DS_RT_SCENELIGHT);
 		SXMaterialEditor::FinalImageUncheckedMenu();
 		SXMaterialEditor::MainMenu->CheckItem(id, !SXMaterialEditor::MainMenu->GetCheckedItem(id));
 	}
@@ -132,42 +132,42 @@ LRESULT SXMaterialEditor_ToolBar_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPara
 			SXMaterialEditor::FinalImageUncheckedMenu();
 			SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_COLOR, true);
 			SXMaterialEditor::CheckBoxTBRColor->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_COLOR);
+			Core_0SetCVarInt("r_final_image", DS_RT_COLOR);
 		}
 		else if (SXMaterialEditor::CheckBoxTBRNormal->GetHWND() == handle_elem)
 		{
 			SXMaterialEditor::FinalImageUncheckedMenu();
 			SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_NORMALS, true);
 			SXMaterialEditor::CheckBoxTBRNormal->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_NORMAL);
+			Core_0SetCVarInt("r_final_image", DS_RT_NORMAL);
 		}
 		else if (SXMaterialEditor::CheckBoxTBRParam->GetHWND() == handle_elem)
 		{
 			SXMaterialEditor::FinalImageUncheckedMenu();
 			SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_PARAMETERS, true);
 			SXMaterialEditor::CheckBoxTBRParam->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_PARAM);
+			Core_0SetCVarInt("r_final_image", DS_RT_PARAM);
 		}
 		else if (SXMaterialEditor::CheckBoxTBRAmDiff->GetHWND() == handle_elem)
 		{
 			SXMaterialEditor::FinalImageUncheckedMenu();
 			SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_AMBIENTDIFFUSE, true);
 			SXMaterialEditor::CheckBoxTBRAmDiff->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_AMBIENTDIFF);
+			Core_0SetCVarInt("r_final_image", DS_RT_AMBIENTDIFF);
 		}
 		else if (SXMaterialEditor::CheckBoxTBRSpecular->GetHWND() == handle_elem)
 		{
 			SXMaterialEditor::FinalImageUncheckedMenu();
 			SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_SPECULAR, true);
 			SXMaterialEditor::CheckBoxTBRSpecular->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_SPECULAR);
+			Core_0SetCVarInt("r_final_image", DS_RT_SPECULAR);
 		}
 		else if (SXMaterialEditor::CheckBoxTBRLighting->GetHWND() == handle_elem)
 		{
 			SXMaterialEditor::FinalImageUncheckedMenu();
 			SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_LIGHTINGSCENE, true);
 			SXMaterialEditor::CheckBoxTBRLighting->SetCheck(true);
-			Core_0SetCVarInt("final_image", DS_RT_SCENELIGHT);
+			Core_0SetCVarInt("r_final_image", DS_RT_SCENELIGHT);
 		}
 	}
 
@@ -176,8 +176,8 @@ LRESULT SXMaterialEditor_ToolBar_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPara
 
 LRESULT MsgEditSize(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-	static int *resize = (int*)GET_PCVAR_INT("resize");
-	*resize = RENDER_RESIZE_RESIZE;
+	static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
+	*r_resize = RENDER_RESIZE_RESIZE;
 	return 0;
 }
 
diff --git a/source/sxmaterialeditor/sxmaterialeditor.cpp b/source/sxmaterialeditor/sxmaterialeditor.cpp
index 8dc5b935669ec87dc122d2e9a2fd4891d8dbad97..8dd53bd838b2eabe8f352975255dd47ece6a51e3 100644
--- a/source/sxmaterialeditor/sxmaterialeditor.cpp
+++ b/source/sxmaterialeditor/sxmaterialeditor.cpp
@@ -430,7 +430,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLin
 	
 
 	SkyXEngine_Init(SXMaterialEditor::WindowRender->GetHWND(), SXMaterialEditor::JobWindow->GetHWND());
-	Core_0SetCVarInt("final_image", DS_RT_SCENELIGHT);
+	Core_0SetCVarInt("r_final_image", DS_RT_SCENELIGHT);
 
 	SXMaterialEditor::MainMenu->CheckItem(ID_FINALIMAGE_LIGHTINGSCENE, true);
 	SXMaterialEditor::CheckBoxTBRLighting->SetCheck(true);
diff --git a/source/sxparticleseditor/callback_common.cpp b/source/sxparticleseditor/callback_common.cpp
index 6452995cfedccd291ea89e45f8683560b29f0455..38c29fbd68dd80973af24165aa8e9252e44e2e90 100644
--- a/source/sxparticleseditor/callback_common.cpp
+++ b/source/sxparticleseditor/callback_common.cpp
@@ -153,15 +153,15 @@ LRESULT SXParticlesEditor_ButtonTBSave_Click(HWND hwnd, UINT msg, WPARAM wParam,
 
 LRESULT MsgEditSize(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
-	static int *resize = (int*)GET_PCVAR_INT("resize");
+	static int *r_resize = (int*)GET_PCVAR_INT("r_resize");
 
-	if (!resize)
-		resize = (int*)GET_PCVAR_INT("resize");
+	if (!r_resize)
+		r_resize = (int*)GET_PCVAR_INT("r_resize");
 
-	if (!resize)
+	if (!r_resize)
 		return 0;
 
-	*resize = RENDER_RESIZE_RESIZE;
+	*r_resize = RENDER_RESIZE_RESIZE;
 	return 0;
 }
 
diff --git a/source/sxparticleseditor/sxparticleseditor.cpp b/source/sxparticleseditor/sxparticleseditor.cpp
index d6d3b284191aa70ad2ad89a89a05807dfa81f54d..8c71d40c09d7f0d3adb6c4aab43ff8190c93c7d0 100644
--- a/source/sxparticleseditor/sxparticleseditor.cpp
+++ b/source/sxparticleseditor/sxparticleseditor.cpp
@@ -21,7 +21,7 @@ See the license in LICENSE
 
 \section particles_editor_window Структура окна
 <b>Окно состоит из структурных элементов (сверху вниз):</b>
- - Заголовок окна, содержащий имя редактор.
+ - Заголовок окна, содержащий имя редактора.
  - Меню программы:
   - File:
    - ReOpen – переоткрыть файл эффектов eff.eff
@@ -254,7 +254,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLin
 	GData::WinSize.y = winrndrect.bottom;*/
 
 	SkyXEngine_Init(SXParticlesEditor::WindowRender->GetHWND(), SXParticlesEditor::JobWindow->GetHWND());
-	Core_0SetCVarInt("final_image",DS_RT_COLOR);
+	Core_0SetCVarInt("r_final_image",DS_RT_COLOR);
 	SRender_GetCamera()->SetPosition(&float3(0, 0.5, -2));
 	SXParticlesEditor::MainMenu->CheckItem(ID_VIEW_GRID, true);
 	SXParticlesEditor::MainMenu->CheckItem(ID_VIEW_AXES, true);