From 081f7cd002959c540008f97571a685890a482019 Mon Sep 17 00:00:00 2001
From: Byurrer <byurrer@mail.ru>
Date: Mon, 23 Jul 2018 22:58:15 +0400
Subject: [PATCH] =?UTF-8?q?=D0=BF=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?=
 =?UTF-8?q?=D0=BB=20=D0=B3=D0=B0=D0=BC=D0=BC=D1=83=20albedo,=20=D1=80?=
 =?UTF-8?q?=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80=D0=B8=D0=BB=20=D0=BB?=
 =?UTF-8?q?=D0=B8=D0=B1=D1=83=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0?=
 =?UTF-8?q?=D0=BB=D0=BE=D0=B2,=20=D0=B4=D0=BE=D0=B0=D0=B1=D0=B2=D0=B8?=
 =?UTF-8?q?=D0=BB=20=D0=B2=20=D1=80=D0=B5=D0=B4=D0=B0=D0=BA=D1=82=D0=BE?=
 =?UTF-8?q?=D1=80=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0=D0=BB=D0=BE?=
 =?UTF-8?q?=D0=B2=20=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=BF=D0=BE=D0=BB?=
 =?UTF-8?q?=D1=8F,=20=D1=87=D0=B0=D1=81=D1=82=D0=B8=D1=87=D0=BD=D0=BE=20?=
 =?UTF-8?q?=D0=BF=D0=BE=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE=D1=80?=
 =?UTF-8?q?=D0=B8=D0=BB=20=D1=81=D0=B2=D0=B5=D1=82=20=D0=B8=20=D0=BF=D0=B0?=
 =?UTF-8?q?=D1=80=D1=82=D0=B8=D0=BA=D0=BB=D1=8B,=20=D0=B2=D0=B2=D0=B5?=
 =?UTF-8?q?=D0=BB=20=D0=B2=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0?=
 =?UTF-8?q?=D0=BB=D1=8B=20=D1=84=D0=B5=D0=B9=D0=BA=D0=BE=D0=B2=D1=8B=D0=B9?=
 =?UTF-8?q?=20occlusion,=20=D0=BD=D0=B0=D0=B2=D0=B5=D0=BB=20=D0=BF=D0=BE?=
 =?UTF-8?q?=D1=80=D1=8F=D0=B4=D0=BE=D0=BA=20=D0=B2=20=D1=84=D0=B0=D0=B9?=
 =?UTF-8?q?=D0=BB=D0=B0=D1=85=20=D0=BC=D0=B0=D1=82=D0=B5=D1=80=D0=B8=D0=B0?=
 =?UTF-8?q?=D0=BB=D0=BE=D0=B2,=20=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE=D0=B3?=
 =?UTF-8?q?=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20g=D0=B1?=
 =?UTF-8?q?=D1=83=D1=84=D0=B5=D1=80,=20=D0=B4=D0=BE=D0=B0=D0=B1=D0=B2?=
 =?UTF-8?q?=D0=B8=D0=BB=20=D0=BA=D0=B2=D0=B0=D1=80=20=D1=80=D0=B5=D0=B3?=
 =?UTF-8?q?=D1=83=D0=BB=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?=
 =?UTF-8?q?=D0=BE=D0=B1=D1=89=D0=B5=D0=B9=20=D0=B3=D1=80=D0=BE=D0=BC=D0=BA?=
 =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8,=20=D0=BF=D0=BE=D0=BF=D1=80=D0=B0?=
 =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D1=88=D0=B5=D0=B9=D0=B4=D0=B5=D1=80=20?=
 =?UTF-8?q?=D1=81=D1=81=D0=B0=D0=BE,=20=D0=BD=D0=B5=D0=BC=D0=BD=D0=BE?=
 =?UTF-8?q?=D0=B3=D0=BE=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD=D0=B8=D0=BB=20?=
 =?UTF-8?q?=D0=BE=D1=81=D0=B2=D0=B5=D1=89=D0=B5=D0=BD=D0=B8=D0=B5,=20?=
 =?UTF-8?q?=D0=BD=D0=BE=20=D0=BD=D0=B0=D0=B4=D0=BE=20=D0=B4=D0=BE=D1=80?=
 =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D1=82=D1=8C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 build/config_game.cfg                         |    1 +
 build/gamesource/shaders/gdefines.h           |   26 +-
 .../shaders/lighting/lighting_blend.ps        |   18 +-
 .../shaders/lighting/lighting_com.ps          |   23 +-
 build/gamesource/shaders/mtrl.h               |   27 +
 .../shaders/mtrlgeom/mtrlgeom_base.ps         |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_det1.ps         |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_land_det2.ps    |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_land_det3.ps    |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_land_det4.ps    |    6 +-
 .../mtrlgeom/mtrlgeom_land_mr2_det2.ps        |    8 +-
 .../mtrlgeom/mtrlgeom_land_mr3_det3.ps        |    8 +-
 .../mtrlgeom/mtrlgeom_land_mr4_det4.ps        |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_mrbase.ps       |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps  |    6 +-
 .../mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps      |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_reflect_cube.ps |    6 +-
 .../mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps  |    6 +-
 .../shaders/mtrlgeom/mtrlgeom_water.ps        |    6 +-
 .../mtrlgeom/mtrlgeom_water_reflect.ps        |    6 +-
 .../shaders/mtrlgreen/mtrlgreen_base.ps       |    5 +-
 .../shaders/mtrlgreen/mtrlgreen_mrbase.ps     |    5 +-
 .../shaders/mtrlskin/mtrlskin_base.ps         |    5 +-
 .../shaders/mtrlskin/mtrlskin_mrbase.ps       |    5 +-
 build/gamesource/shaders/pp/pp_union_alpha.ps |   23 +-
 build/gamesource/shaders/ppe/ppe_ssao.ps      |   24 +-
 build/gamesource/shaders/ppe/ppe_ssao_blur.ps |    2 +-
 source/aigrid/aigrid.h                        |    2 +-
 source/common                                 |    2 +-
 source/editors_utils/axes_helper.cpp          |  660 ++--
 source/editors_utils/axes_helper.h            |   75 +-
 source/game/BaseAmmo.cpp                      |    2 +-
 source/geom/static_geom.cpp                   |   14 +-
 source/mtllight/light.cpp                     |  253 +-
 source/mtllight/light.h                       |    2 +-
 ...0\272\320\276\320\277\320\270\321\217.cpp" | 2179 +++++++++++++
 ...320\272\320\276\320\277\320\270\321\217.h" |  431 +++
 source/mtllight/material.cpp                  | 2890 ++++++++---------
 source/mtllight/material.h                    |  509 +--
 source/mtllight/ml_data.cpp                   |   23 +-
 source/mtllight/shadow.cpp                    |  264 +-
 source/mtllight/shadow.h                      |  156 +-
 ...0\272\320\276\320\277\320\270\321\217.cpp" | 1170 +++++++
 ...320\272\320\276\320\277\320\270\321\217.h" | 1362 ++++++++
 source/mtllight/sxmtllight.cpp                |  494 ++-
 source/mtllight/sxmtllight.h                  |  842 +++--
 source/particles/effect.cpp                   |  330 +-
 source/particles/effect.h                     |   64 +-
 source/particles/emitter.cpp                  |  100 +-
 source/particles/emitter.h                    |   66 +-
 source/particles/sxparticles.cpp              |   62 +-
 source/pp/sxpp.cpp                            |   10 +
 source/render/render_func.cpp                 |   49 +-
 source/score/sound.cpp                        |    5 +
 source/score/sound.h                          |    2 +
 source/score/sxscore.cpp                      |    7 +
 source/score/sxscore.h                        |    5 +-
 source/skyxengine.cpp                         |   22 +-
 source/sxgenpreview/sxgenpreview.cpp          |    2 +-
 source/sxleveleditor/common_callback.cpp      |   48 +-
 source/sxleveleditor/game_callback.cpp        |    6 +-
 source/sxleveleditor/green_callback.cpp       |    4 +-
 source/sxleveleditor/level_editor.cpp         |    6 +-
 source/sxleveleditor/level_editor.h           |    2 +-
 source/sxleveleditor/model_callback.cpp       |   14 +-
 source/sxmaterialeditor/common_callback.cpp   |  132 +-
 source/sxmaterialeditor/edits_callback.cpp    |   61 +-
 source/sxmaterialeditor/edits_callback.h      |    6 +-
 source/sxmaterialeditor/material_editor.cpp   |  211 +-
 source/sxmaterialeditor/material_editor.h     |   11 +-
 .../sxmaterialeditor/trackbars_callback.cpp   |   24 +-
 source/sxmaterialeditor/trackbars_callback.h  |    2 +-
 72 files changed, 9240 insertions(+), 3599 deletions(-)
 create mode 100644 "source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp"
 create mode 100644 "source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h"
 create mode 100644 "source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp"
 create mode 100644 "source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h"

diff --git a/build/config_game.cfg b/build/config_game.cfg
index 0e67865f0..d070e368b 100644
--- a/build/config_game.cfg
+++ b/build/config_game.cfg
@@ -21,6 +21,7 @@ r_stats 1
 r_win_width 800
 r_win_height 600
 
+snd_main_volume 1.0
 
 r_physdebug 0
 r_stats 1
diff --git a/build/gamesource/shaders/gdefines.h b/build/gamesource/shaders/gdefines.h
index 7d5fa00ee..b5bceb03e 100644
--- a/build/gamesource/shaders/gdefines.h
+++ b/build/gamesource/shaders/gdefines.h
@@ -23,22 +23,24 @@ const half2 TexUV_Center = half2(0.5f,0.5f);
 
 #define PI 3.141592654f
 
-//свойства поверхности (освещаемая ли, прозрачная ли)
-//{
-	
-//неосвещаемая и не прозрачная
-#define SURFACE_NOTLIGHTING_NOTTRANSPARENCY 0.0
+/*! \name Возможные слои
+@{*/
 
-//освещаемая и непрозрачная
-#define SURFACE_LIGHTING_NOTTRANSPARENCY 	0.333333
+//! непрозрачные неосвещаемые
+#define MTLTYPE_LAYER_OPAQUE_UNLIT		0.0
 
-//неосвещаемая и прозрачная
-#define SURFACE_NOTLIGHTING_TRANSPARENCY 	0.666667
+//! прозрачные неосвещаемые
+#define MTLTYPE_LAYER_TRANSPARENT_UNLIT	0.666667
 
-//освещаемая и прозрачная
-#define SURFACE_LIGHTING_TRANSPARENCY 		1.0
+//! непрозрачные освещаемые
+#define MTLTYPE_LAYER_OPAQUE_LIGHT		0.333333
 
-//}
+//! прозрачные освещаемые
+#define MTLTYPE_LAYER_TRANSPARENT_LIGHT	1.0
+
+#define EQUAL_LAYER(layer1, layer2) (abs(layer1 - layer2) < 0.1)
+
+//!@}
 
 //парметры для tone mapping
 //{
diff --git a/build/gamesource/shaders/lighting/lighting_blend.ps b/build/gamesource/shaders/lighting/lighting_blend.ps
index 8c39041c8..fbbba4db9 100644
--- a/build/gamesource/shaders/lighting/lighting_blend.ps
+++ b/build/gamesource/shaders/lighting/lighting_blend.ps
@@ -15,23 +15,27 @@ sampler2D ParamSampler:register(s5);
 
 half4 main(vs_out_pp IN):COLOR0
 {
-	half isunlit = tex2D(NormalSampler,IN.TexUV).a;
-	half layer = tex2D(ParamSampler,IN.TexUV).w;
-	half4 color = tex2D(ColorSampler,IN.TexUV);
+	half4 normal = tex2D(NormalSampler,IN.TexUV);
+	half sort = normal.w;
+	half layer = normal.z;
+	half4 color = pow(tex2D(ColorSampler,IN.TexUV),2.2);
+	half4 param = tex2D(ParamSampler,IN.TexUV);
 
 	half4 ambient = tex2D(AmbientSampler,IN.TexUV);
+	half3 ambient_color = lerp((ambient.x + ambient.y + ambient.z)/3.0, ambient.xyz, ambient.w*2);
+	ambient_color = lerp(ambient_color.xyz, 1.0, clamp(param.y, 0.25, param.y));
 	//return float4(ambient.w,ambient.w,ambient.w,1);;
 	half spec = tex2D(SpecDiffSampler,IN.TexUV).r;
 	half fAdaptedLum = tex2D(AdaptedLumSampler, half2(0.5f, 0.5f));
 
-	if(isunlit != SURFACE_NOTLIGHTING_NOTTRANSPARENCY && isunlit != SURFACE_NOTLIGHTING_TRANSPARENCY)
-		color.xyz = (((ambient.xyz * sqrt(ambient.w))*color.xyz)) + spec*(ambient.xyz);
+	if(!(EQUAL_LAYER(sort, MTLTYPE_LAYER_OPAQUE_UNLIT) || EQUAL_LAYER(sort, MTLTYPE_LAYER_TRANSPARENT_UNLIT)))
+		color.xyz = (((ambient_color * (ambient.w))*color.xyz)) + spec*0.5*(ambient.xyz);
 		
-	if(int(layer * 255.f) == 1)
+	if(int(layer * 256.f) == 1)
 		color.a = 1.f;
 
 	color.rgb *= TONE_MAPPING_DENOMENATOR/(fAdaptedLum + TONE_MAPPING_ADAPT_ADD_BIAS);
 	color.rgb /= (fAdaptedLum + color.rgb);
 	
-	return /*half4(ambient.xyz, 1.f);//*/color;
+	return /*half4(ambient.xyz, 1.f);//*/pow(color, 1/2.2);
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/lighting/lighting_com.ps b/build/gamesource/shaders/lighting/lighting_com.ps
index 7902d20e9..0b2508c17 100644
--- a/build/gamesource/shaders/lighting/lighting_com.ps
+++ b/build/gamesource/shaders/lighting/lighting_com.ps
@@ -38,7 +38,7 @@ half D_Get(half roughness, half NdotH)
 
 half F_Get(half f0, half HdotV)
 {
-    return (f0 + (1.0f - f0) * pow((1.0f - HdotV), 4.9)) * (f0 > 0.001f ? 1 : 0);
+    return (f0 + (1.0 - f0) * pow((1.0 - HdotV), 5));
 }
 
 half G_Get(half NdotV, half NdotL, half LdotV, half NdotH,half VdotH)
@@ -51,8 +51,8 @@ half GetSpecular(half4 matparam,half NdotH,half NdotV,half NdotL,half VdotL,half
 	matparam.x = lerp(PARAM_LIGHTING_ROUGHNESS_MIN, PARAM_LIGHTING_ROUGHNESS_MAX, matparam.x);
 	half D = D_Get(matparam.x, NdotH);
 	half G = G_Get(NdotV,NdotL,VdotL,NdotH,HdotV);
-	half3 F = F_Get(matparam.y*matparam.y, HdotV);
-	return ((D*G)/(PI*NdotL*NdotV))*F;
+	half3 F = F_Get(matparam.y, HdotV)*saturate(matparam.y*2);
+	return ((D*G*F)/(PI*NdotL*NdotV+0.001));
 }
 
 //#############################################################################
@@ -63,7 +63,7 @@ ps_out_com_lighting main(vs_out_res_pos IN)
 
 	half4 normalds = tex2D(NormalSampler,IN.TexUV);
 	
-	[branch]if(normalds.w == SURFACE_NOTLIGHTING_NOTTRANSPARENCY || normalds.w == SURFACE_NOTLIGHTING_TRANSPARENCY)
+	[branch]if(EQUAL_LAYER(normalds.w, MTLTYPE_LAYER_OPAQUE_UNLIT) || EQUAL_LAYER(normalds.w, MTLTYPE_LAYER_TRANSPARENT_UNLIT))
 	{
 		OUT.Amdient.xyz = 0;
 		OUT.Amdient.w = 0;
@@ -90,12 +90,12 @@ ps_out_com_lighting main(vs_out_res_pos IN)
 	
 	half4 Param = tex2D(ParamSampler,IN.TexUV);
 	
-	normalds.xyz = 2.f * normalds.xyz - 1.f;
+	//normalds.xyz = NormalDecode(normalds.xy);//2.f * normalds.xyz - 1.f;
 	
-	half3 NormalPixel = normalize(normalds.xyz);
+	half3 NormalPixel = normalize(NormalDecode(normalds.xy));
 	half3 Ligth  = normalize(LightPos.xyz - Position.xyz); 
 	half3 VertexToEye = normalize(ViewPos.xyz - Position.xyz);
-	half3 HalfVector = normalize((Ligth.xyz + VertexToEye));
+	half3 HalfVector = normalize(VertexToEye + Ligth.xyz);
 	
 	half NdotH = dot(NormalPixel, HalfVector);
 	half NdotV = dot(NormalPixel, VertexToEye);
@@ -127,11 +127,12 @@ ps_out_com_lighting main(vs_out_res_pos IN)
 	#endif
 	
 	//LightColor.xyz *= max(diffuse,0.2);
-		
-	OUT.Amdient.xyz = LightColor.xyz * LightPowerDist.x * max(diffuse,0.5) * attenuation;//LightColor.xyz * attenuation * max(diffuse,0.5);//lerp(LightPowerDist.x,LightColor.xyz,0.5f) * max(diffuse,0.5) * LightPowerDist.x * attenuation;
-	OUT.Amdient.w = diffuse * LightPowerDist.x * attenuation;
 	
-	OUT.Spec = (specular*absdiffuse * saturate(attenuation * 2) * LightPowerDist.x);
+	//OUT.Amdient.xyz = lerp(LightColor.xyz, 1.0, clamp((1.0 - Param.y - 0.001), 0.25, 1.0));
+	OUT.Amdient.xyz = LightColor.xyz * LightColor.xyz * LightPowerDist.x * attenuation;
+	OUT.Amdient.w = diffuse * Param.w * LightPowerDist.x * attenuation;
+	
+	OUT.Spec = (specular*absdiffuse * attenuation * LightPowerDist.x);
 	
 	return OUT;
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/mtrl.h b/build/gamesource/shaders/mtrl.h
index e627492b2..09f62264b 100644
--- a/build/gamesource/shaders/mtrl.h
+++ b/build/gamesource/shaders/mtrl.h
@@ -54,3 +54,30 @@ half GetTexLod4Ref(half roughness)
 {
 	return depth;//(NearFar.x / (NearFar.y + NearFar.x - depth * (NearFar.y - NearFar.x)));
 }*/
+
+half3 NormalEncode(half3 n)
+{
+    /*half p = sqrt(n.z*8+8);
+    return half4(n.xy/p + 0.5,0,0);*/
+	
+	half2 enc = normalize(n.xy) * (sqrt(-n.z*0.5+0.5));
+    enc = enc*0.5+0.5;
+    return half3(enc, 0);
+}
+
+half3 NormalDecode(half2 enc)
+{
+   /* half2 fenc = enc*4-2;
+    half f = dot(fenc,fenc);
+    half g = sqrt(1-f/4);
+    half3 n;
+    n.xy = fenc*g;
+    n.z = 1-f/2;
+    return n;*/
+	
+	half4 nn = half4(enc, enc)*half4(2,2,0,0) + half4(-1,-1,1,-1);
+    half l = dot(nn.xyz,-nn.xyw);
+    nn.z = l;
+    nn.xy *= sqrt(l);
+    return nn.xyz * 2 + half3(0,0,-1);
+}
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps
index 2fd63a041..1f2518911 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_base.ps
@@ -19,11 +19,13 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	ps_out_ds_mrt OUT; 
 	OUT.Color = tex2D(BaseTex,IN.TexUV);
 	
-	OUT.Normal.xyz = 0.5f * normalize(IN.Normal) + 0.5f;
+	IN.Normal = normalize(IN.Normal);
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = OUT.Param.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps
index fba2eee47..b80ec0157 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_det1.ps
@@ -23,11 +23,13 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half4 detcolor1 = tex2D(DetTex0, (IN.TexUV) * Param.x * MTRL_TEXUV_SCALE);
 	OUT.Color.rgb *= detcolor1.rgb;
 
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	IN.Normal = normalize(IN.Normal);
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps
index eadc51c6e..36ab54868 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det2.ps
@@ -27,6 +27,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
 	half lod = 9.f+log2(max(length(dx), length(dy)));
 
+	IN.Normal = normalize(IN.Normal);
 	half4 basecolor = tex2D(BaseTex, IN.TexUV);
 	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
 		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
@@ -42,11 +43,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 		}
 	
 
-	OUT.Normal.xyz = 0.5f * IN.Normal + 0.5f;
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	OUT.Color = basecolor;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps
index 91ff88a0a..29dc0be8d 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det3.ps
@@ -28,6 +28,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
 	half lod = 9.f+log2(max(length(dx), length(dy)));
 
+	IN.Normal = normalize(IN.Normal);
 	half4 basecolor = tex2D(BaseTex, IN.TexUV);
 	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
 		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
@@ -43,11 +44,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
 		}	
 
-	OUT.Normal.xyz = 0.5f * IN.Normal + 0.5f;
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	OUT.Color = basecolor;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps
index 988073f89..2afaaeddd 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_det4.ps
@@ -29,6 +29,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
 	half lod = 9.f+log2(max(length(dx), length(dy)));
 
+	IN.Normal = normalize(IN.Normal);
 	half4 basecolor = tex2D(BaseTex, IN.TexUV);
 	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
 		[branch]if(IN.Pos.z < MTRL_LAND_DIST)
@@ -45,11 +46,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
 		}	
 
-	OUT.Normal.xyz = 0.5f * IN.Normal + 0.5f;
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	OUT.Color = basecolor;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps
index a2c93c58d..421fb4043 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr2_det2.ps
@@ -30,6 +30,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
 	half lod = 9.f+log2(max(length(dx), length(dy)));
 
+	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel;
 	half4 basecolor = tex2D(BaseText, IN.TexUV);
 	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
@@ -51,7 +52,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			
 			half lerpfactor = IN.Pos.z/MTRL_LAND_DIST;
 			lerpfactor = saturate(lerpfactor*lerpfactor);
-			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f),IN.Normal,lerpfactor);
+			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f), IN.Normal, lerpfactor);
 			
 			half4 blend = basecolor * detcolor * (2.f - detcolor);
 			basecolor.rgb = lerp(blend,basecolor,lerpfactor).rgb;
@@ -60,11 +61,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			NormalPixel = IN.Normal;
 	
 
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	OUT.Color = basecolor;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps
index 591dd09db..60413f942 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr3_det3.ps
@@ -32,6 +32,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
 	half lod = 9.f+log2(max(length(dx), length(dy)));
 
+	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel;
 	half4 basecolor = tex2D(BaseText, IN.TexUV);
 	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
@@ -55,7 +56,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			
 			half lerpfactor = IN.Pos.z/MTRL_LAND_DIST;
 			lerpfactor = saturate(lerpfactor*lerpfactor);
-			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f),IN.Normal,lerpfactor);
+			NormalPixel = lerp(normalize((IN.Normal+half3(mdetcolor.xy,IN.Normal.z)) * 0.5f), IN.Normal,lerpfactor);
 			
 			half4 blend = basecolor * detcolor * (3.f - detcolor);
 			basecolor.rgb = lerp(basecolor * detcolor * (3.f - detcolor),basecolor,lerpfactor).rgb;
@@ -64,11 +65,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			NormalPixel = IN.Normal;
 	
 
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	OUT.Color = basecolor;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps
index 62dc8b60f..b10d310e0 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_land_mr4_det4.ps
@@ -34,6 +34,7 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	half2 dy = ddy((IN.TexUV) * Param.x * MTRL_LAND_TEXUV_SCALE);
 	half lod = 9.f+log2(max(length(dx), length(dy)));
 
+	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel;
 	half4 basecolor = tex2D(BaseTex, IN.TexUV);
 	half4 detmaskcolor = tex2D(MaskTex, IN.TexUV);
@@ -68,11 +69,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 			NormalPixel = IN.Normal;
 	
 
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	OUT.Color = basecolor;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps
index 65ed5463e..b12e5e56c 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase.ps
@@ -26,11 +26,13 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	/*OUT.Normal.z = OUT.Param.w;
+	OUT.Param.w = NearFarIsUnlit.w;*/
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps
index 858b2f394..0ecf7fdea 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_det1.ps
@@ -26,13 +26,15 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 
 	half3 NormalMicro = ((2.f * (tex2D(MRTex, IN.TexUV).rgb)) - 1.f);
 	NormalMicro *= Param.z;
+	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps
index fdf7232a3..0a3f7e427 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_mrbase_mr1_det1.ps
@@ -29,13 +29,15 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	NormalMicro *= Param.z;
 	half3 mrcolor1 = (2.f * (tex2D(MRTex1, (IN.TexUV) * Param.x * MTRL_TEXUV_SCALE).rgb)) - 1.f;
 	mrcolor1 *= Param.z;
+	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel = normalize((IN.Normal+half3((NormalMicro.xy+mrcolor1.xy),IN.Normal.z)) * 0.5f);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps
index 2a3318c78..9230e3852 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube.ps
@@ -20,11 +20,13 @@ ps_out_ds_mrt main(vs_out_refcube IN)
 	ps_out_ds_mrt OUT; 
 	OUT.Color = tex2D(BaseTex,IN.TexUV);
 	
-	OUT.Normal.xyz = 0.5f * IN.Normal + 0.5f;
+	IN.Normal = normalize(IN.Normal);
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	half MipmapIndex = GetTexLod4Ref(saturate(OUT.Param.r));
 	half4 reflection = texCUBElod(ReflectTex, half4(IN.CubePPos,MipmapIndex));
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps
index 07ff82c1e..f09890587 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_reflect_cube_mrbase.ps
@@ -23,13 +23,15 @@ ps_out_ds_mrt main(vs_out_refcube IN)
 	
 	half3 NormalMicro = ((2.f * (tex2D(MRTex0, IN.TexUV).rgb)) - 1.f);
 	NormalMicro *= Param.z;
+	IN.Normal = normalize(IN.Normal);
 	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	half MipmapIndex = GetTexLod4Ref(saturate(OUT.Param.r - 0.1f));
 	half4 reflection = texCUBElod(ReflectTex, half4(IN.CubePPos,MipmapIndex));
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps
index caf84f133..3b3ef866c 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water.ps
@@ -27,6 +27,7 @@ ps_out_ds_mrt main(vs_out_water IN)
 	ClipFar(IN.Pos.z,NearFarIsUnlit.y);
 	
 	ps_out_ds_mrt OUT;
+	IN.Normal = normalize(IN.Normal);
 	half Depth = IN.Pos.z;
 	half3 normal1 = 2.0f * tex2D(NormalTex, IN.Tex2.xy) - 1.0f;
 	half3 normal2 = 2.0f * tex2D(NormalTex, IN.Tex3.xy*0.5) - 1.0f;
@@ -45,11 +46,12 @@ ps_out_ds_mrt main(vs_out_water IN)
 	OUT.Color = colorbase;
 	OUT.Color.a = intens;
 	
-	OUT.Normal.xyz = 0.5f * normal + 0.5;
+	OUT.Normal.xy = NormalEncode(normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps
index 7ca2250e3..fd55f7a01 100644
--- a/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps
+++ b/build/gamesource/shaders/mtrlgeom/mtrlgeom_water_reflect.ps
@@ -29,6 +29,7 @@ ps_out_ds_mrt main(vs_out_water IN)
 	
 	ps_out_ds_mrt OUT;
 	
+	IN.Normal = normalize(IN.Normal);
 	half3 normal1 = 2.0f * tex2D(NormalTex, IN.Tex2.xy) - 1.0f;
 	half3 normal2 = 2.0f * tex2D(NormalTex, IN.Tex3.xy*0.5) - 1.0f;
 	normal1.z = IN.Normal.z;
@@ -37,8 +38,9 @@ ps_out_ds_mrt main(vs_out_water IN)
 	normal2 *= Param.z;
 	half3 normal = normalize((normal1+normal2+IN.Normal));
 	
-	OUT.Normal.xyz = 0.5f * normal + 0.5;
+	OUT.Normal.xy = NormalEncode(normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	half3 tc_offset = 2.0f * tex2D(DUDVTex,IN.Tex2.xy) - 1.0f;
 	half3 tc_offset2= 2.0f * tex2D(DUDVTex,IN.Tex3.xy*0.5) - 1.0f;
@@ -56,7 +58,7 @@ ps_out_ds_mrt main(vs_out_water IN)
 	half4 colorbase = tex2D(BaseTex, IN.TexUV);
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	half MipmapIndex = lerp(0.f, MTRL_REF_LOD_COUNT, saturate(OUT.Param.r - 0.1f));
 	half4 TexUVReflectProj = mul(tpos,MatrixReflection);
diff --git a/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps b/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps
index 5726e2f88..0f580b0dd 100644
--- a/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps
+++ b/build/gamesource/shaders/mtrlgreen/mtrlgreen_base.ps
@@ -20,11 +20,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	clip(OUT.Color.a - GREEN_ALPHATEST_VALUE);
 	OUT.Color.a = 1.f;
 
-	OUT.Normal.xyz = 0.5f * IN.Normal + 0.5f;
+	OUT.Normal.xy = NormalEncode(IN.Normal);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps b/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps
index 5c47ae69d..84a700d0a 100644
--- a/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps
+++ b/build/gamesource/shaders/mtrlgreen/mtrlgreen_mrbase.ps
@@ -26,11 +26,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	NormalMicro *= Param.z;
 	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xy = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps b/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps
index e1646d432..4d3c6d20d 100644
--- a/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps
+++ b/build/gamesource/shaders/mtrlskin/mtrlskin_base.ps
@@ -20,11 +20,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	
 	half3 NormalPixel = normalize(IN.Normal);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xyz = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps b/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps
index e283542a7..da6692902 100644
--- a/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps
+++ b/build/gamesource/shaders/mtrlskin/mtrlskin_mrbase.ps
@@ -25,11 +25,12 @@ ps_out_ds_mrt main(vs_out_gcommon IN)
 	NormalMicro *= Param.z;
 	half3 NormalPixel = normalize((IN.Normal+half3(NormalMicro.xy,IN.Normal.z)) * 0.5f);
 	
-	OUT.Normal.xyz = 0.5f * NormalPixel + 0.5f;
+	OUT.Normal.xyz = NormalEncode(NormalPixel);
 	OUT.Normal.w = NearFarIsUnlit.z;
+	OUT.Normal.z = NearFarIsUnlit.w;
 	
 	OUT.Param = tex2D(ParamTex,IN.TexUV);
-	OUT.Param.w = NearFarIsUnlit.w;
+	//OUT.Param.w = NearFarIsUnlit.w;
 	
 	OUT.Depth = GetDepthW(IN.Pos,NearFarIsUnlit.xy);
 	
diff --git a/build/gamesource/shaders/pp/pp_union_alpha.ps b/build/gamesource/shaders/pp/pp_union_alpha.ps
index d83d7fd86..c3703b9a9 100644
--- a/build/gamesource/shaders/pp/pp_union_alpha.ps
+++ b/build/gamesource/shaders/pp/pp_union_alpha.ps
@@ -53,15 +53,20 @@ ps_out_alpha_union main(vs_out_pp IN):COLOR0
 	ArrDepth[2] = tex2Dlod(Depth, ArrTexUV[2]).r;
 	ArrDepth[3] = tex2Dlod(Depth, ArrTexUV[3]).r;
 	
-	ArrIDs[0] = int(tex2Dlod(Param, ArrTexUV[0]).w * 256.f);
-	ArrIDs[1] = int(tex2Dlod(Param, ArrTexUV[1]).w * 256.f);
-	ArrIDs[2] = int(tex2Dlod(Param, ArrTexUV[2]).w * 256.f);
-	ArrIDs[3] = int(tex2Dlod(Param, ArrTexUV[3]).w * 256.f);
-	
-	ArrIsTransparency[0] = tex2Dlod(Normal, ArrTexUV[0]).w >= SURFACE_NOTLIGHTING_TRANSPARENCY ? 1 : 0;
-	ArrIsTransparency[1] = tex2Dlod(Normal, ArrTexUV[1]).w >= SURFACE_NOTLIGHTING_TRANSPARENCY ? 1 : 0;
-	ArrIsTransparency[2] = tex2Dlod(Normal, ArrTexUV[2]).w >= SURFACE_NOTLIGHTING_TRANSPARENCY ? 1 : 0;
-	ArrIsTransparency[3] = tex2Dlod(Normal, ArrTexUV[3]).w >= SURFACE_NOTLIGHTING_TRANSPARENCY ? 1 : 0;
+	half4 normal1 = tex2Dlod(Normal, ArrTexUV[0]);
+	half4 normal2 = tex2Dlod(Normal, ArrTexUV[1]);
+	half4 normal3 = tex2Dlod(Normal, ArrTexUV[2]);
+	half4 normal4 = tex2Dlod(Normal, ArrTexUV[3]);
+	
+	ArrIDs[0] = int(normal1.z * 256.f);
+	ArrIDs[1] = int(normal2.z * 256.f);
+	ArrIDs[2] = int(normal3.z * 256.f);
+	ArrIDs[3] = int(normal4.z * 256.f);
+	
+	ArrIsTransparency[0] = normal1.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	ArrIsTransparency[1] = normal2.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	ArrIsTransparency[2] = normal3.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
+	ArrIsTransparency[3] = normal4.w >= MTLTYPE_LAYER_TRANSPARENT_UNLIT ? 1 : 0;
 	
 	//в случае если у нас нет ппрозрачных слоев то возвращаем текущий цвет
 	[branch] if((ArrIsTransparency[0] == 0 && ArrIsTransparency[1] == 0 && ArrIsTransparency[2] == 0 && ArrIsTransparency[3] == 0))
diff --git a/build/gamesource/shaders/ppe/ppe_ssao.ps b/build/gamesource/shaders/ppe/ppe_ssao.ps
index 30cf1d733..178a98953 100644
--- a/build/gamesource/shaders/ppe/ppe_ssao.ps
+++ b/build/gamesource/shaders/ppe/ppe_ssao.ps
@@ -35,15 +35,16 @@ static int NumSam = 8;
 half4 main(vs_out_res_pos IN):COLOR0
 {
 	half depth = tex2D(DepthSampler, IN.TexUV).r;
+	half3 random = normalize(2.f * tex2D(RndSampler, IN.TexUV*Ratio*96.f).rgb - 1.f);
 	
 	[branch]if(depth >= 1.f)
-		return 1.f;
-	
-	half3 position = half3(ViewPos + (IN.WorldRay) * (depth));
-	half3 normal = normalize(2.f * tex2D(NormalSampler, IN.TexUV).rgb - 1.f);
-	half3 random = normalize(2.f * tex2D(RndSampler, IN.TexUV*Ratio*96.f).rgb - 1.f);
-
-	half occlusion = 0.f;
+		return half4(1,1,1,1);
+	else
+	{
+		half3 position = half3(ViewPos + (IN.WorldRay) * (depth));
+		half3 normal = normalize(NormalDecode(tex2Dlod(NormalSampler, half4(IN.TexUV, 0, 0)).xy));
+		
+		half occlusion = 0.f;
 		for(int i=0; i < NumSam; i++)
 		{
 			half3 ray = (reflect(ArrRndVecSSAO[i],random));
@@ -55,7 +56,7 @@ half4 main(vs_out_res_pos IN):COLOR0
 			newpos.x = newpos.x * 0.5f + 0.5f;
 			newpos.y = newpos.y * (-0.5f) + 0.5f;
 
-			half newdepth = tex2D(DepthSampler, (newpos.xy)).r;
+			half newdepth = tex2Dlod(DepthSampler, half4(newpos.xy, 0, 0)).r;
 				[branch]if(newdepth >= 1.f)
 					occlusion += 1.f;
 			half difference = (newdepth - depth)*NearFar.y;
@@ -66,8 +67,9 @@ half4 main(vs_out_res_pos IN):COLOR0
 			else
 				occlusion += 1-step(difference, Params.w)*distanceCheck;
 		}
-	occlusion = clamp(saturate(occlusion/NumSam)*1.2f,0.3f,1.f);
-	occlusion *= occlusion;
+		occlusion = clamp(saturate(occlusion/NumSam)*1.2f,0.3f,1.f);
+		occlusion *= occlusion;
 	
-	return half4(occlusion,occlusion,occlusion,1.f);
+		return half4(occlusion,occlusion,occlusion,1.f);
+	}
 }
\ No newline at end of file
diff --git a/build/gamesource/shaders/ppe/ppe_ssao_blur.ps b/build/gamesource/shaders/ppe/ppe_ssao_blur.ps
index 0730474e4..d2b1f20ad 100644
--- a/build/gamesource/shaders/ppe/ppe_ssao_blur.ps
+++ b/build/gamesource/shaders/ppe/ppe_ssao_blur.ps
@@ -43,7 +43,7 @@ half4 main(vs_out_pp IN) : COLOR0
 		}
 
 	Color /= SumWeight;
-	
+	//return tex2D(BlurMap,IN.TexUV);//saturate(Color);
 	#if defined(_BLEND_COLOR_)
 	half4 ScreenColor = tex2D(ScreenMap,IN.TexUV);
 	return ScreenColor*saturate(Color);
diff --git a/source/aigrid/aigrid.h b/source/aigrid/aigrid.h
index ba4dda39e..700908ff9 100644
--- a/source/aigrid/aigrid.h
+++ b/source/aigrid/aigrid.h
@@ -510,7 +510,7 @@ protected:
 	//! закрытый список (по id квада)
 	Array<bool> m_aCloseIDs;			
 
-	//! закрытый список, ArrIDsInOpen[id квада]
+	//! открытый список, ArrIDsInOpen[id квада]
 	Array<ID> m_aOpenIDs;
 
 	//! значение квада в открытом списке, по id квада
diff --git a/source/common b/source/common
index 586727e02..fd323b7e2 160000
--- a/source/common
+++ b/source/common
@@ -1 +1 @@
-Subproject commit 586727e022d85f3ab1552b93e69b1f7e3ff297cd
+Subproject commit fd323b7e230bd0c32c984f50eeb1cd0b87937330
diff --git a/source/editors_utils/axes_helper.cpp b/source/editors_utils/axes_helper.cpp
index 30b3f1069..0d2158854 100644
--- a/source/editors_utils/axes_helper.cpp
+++ b/source/editors_utils/axes_helper.cpp
@@ -6,78 +6,78 @@ See the license in LICENSE
 
 #include "axes_helper.h"
 
-AxesHelper::AxesHelper()
+CAxesHelper::CAxesHelper()
 {
 	m_bIsDragging = m_bIsDraggingStart = m_bIsDraggingStop = false;
-	Scale = float3(1, 1, 1);
-	m_htype = HT_NONE;
+	m_vScale = float3(1, 1, 1);
+	m_htype = HANDLER_TYPE_NONE;
 }
 
-AxesHelper::~AxesHelper()
+CAxesHelper::~CAxesHelper()
 {
 
 }
 
-void AxesHelper::SetType(AxesHelper::HANDLER_TYPE type)
+void CAxesHelper::setType(CAxesHelper::HANDLER_TYPE type)
 {
 	m_htype = type;
 }
 
-AxesHelper::HANDLER_TYPE AxesHelper::GetType()
+CAxesHelper::HANDLER_TYPE CAxesHelper::getType()
 {
 	return m_htype;
 }
 
-void AxesHelper::SetPosition(const float3 & pos)
+void CAxesHelper::setPosition(const float3 & pos)
 {
-	Position = pos;
-	m_mHelperMat = SMMatrixScaling(Scale) * QRotation.GetMatrix() * SMMatrixTranslation(Position);
+	m_vPosition = pos;
+	m_mHelperMat = SMMatrixScaling(m_vScale) * m_qRotation.GetMatrix() * SMMatrixTranslation(m_vPosition);
 }
 
-void AxesHelper::SetRotation(const SMQuaternion & rot)
+void CAxesHelper::setRotation(const SMQuaternion & rot)
 {
-	QRotation = rot;
-	Rotation = SMMatrixToEuler(rot.GetMatrix());
-	m_mHelperMat = SMMatrixScaling(Scale) * QRotation.GetMatrix() * SMMatrixTranslation(Position);
+	m_qRotation = rot;
+	m_vRotation = SMMatrixToEuler(rot.GetMatrix());
+	m_mHelperMat = SMMatrixScaling(m_vScale) * m_qRotation.GetMatrix() * SMMatrixTranslation(m_vPosition);
 }
 
-void AxesHelper::SetRotation(const float3 & rot)
+void CAxesHelper::setRotation(const float3 & rot)
 {
-	Rotation = rot;
-	QRotation = SMQuaternion(rot.x, 'x') * SMQuaternion(rot.y, 'y') * SMQuaternion(rot.z, 'z');
-	m_mHelperMat = SMMatrixScaling(Scale) * QRotation.GetMatrix() * SMMatrixTranslation(Position);
+	m_vRotation = rot;
+	m_qRotation = SMQuaternion(rot.x, 'x') * SMQuaternion(rot.y, 'y') * SMQuaternion(rot.z, 'z');
+	m_mHelperMat = SMMatrixScaling(m_vScale) * m_qRotation.GetMatrix() * SMMatrixTranslation(m_vPosition);
 }
 
-void AxesHelper::SetScale(const float3 & scale)
+void CAxesHelper::setScale(const float3 & scale)
 {
-	Scale = scale;
-	m_mHelperMat = SMMatrixScaling(Scale) * QRotation.GetMatrix() * SMMatrixTranslation(Position);
+	m_vScale = scale;
+	m_mHelperMat = SMMatrixScaling(m_vScale) * m_qRotation.GetMatrix() * SMMatrixTranslation(m_vPosition);
 }
 
 
-const float3 & AxesHelper::GetPosition()
+const float3 & CAxesHelper::getPosition()
 {
-	return Position;
+	return m_vPosition;
 }
 
-const float3 & AxesHelper::GetRotation()
+const float3 & CAxesHelper::getRotation()
 {
-	return Rotation;
+	return m_vRotation;
 }
 
-const float3 & AxesHelper::getScale()
+const float3 & CAxesHelper::getScale()
 {
-	return Scale;
+	return m_vScale;
 }
 
-const SMQuaternion & AxesHelper::GetRotationQ()
+const SMQuaternion & CAxesHelper::getRotationQ()
 {
-	return(QRotation);
+	return(m_qRotation);
 }
 
-void AxesHelper::Render()
+void CAxesHelper::render()
 {
-	if (m_htype == HT_NONE)
+	if (m_htype == HANDLER_TYPE_NONE)
 		return;
 
 	static float3 vCamPos;
@@ -87,22 +87,22 @@ void AxesHelper::Render()
 
 	if(!m_bIsDragging)
 	{
-		dist = SMVector3Distance(Position, vCamPos) * 0.20f;
-		dist = (dist > 0.25f ? dist : 0.25f);
-		m_mHelperMatScale2 = SMMatrixScaling(dist, dist, dist);
+		float fDist = SMVector3Distance(m_vPosition, vCamPos) * 0.20f;
+		fDist = (fDist > 0.25f ? fDist : 0.25f);
+		m_mHelperMatScale2 = SMMatrixScaling(fDist, fDist, fDist);
 	}
 
-	if (m_htype == HT_MOVE)
-		DrawMove();
-	else if (m_htype == HT_ROTATE)
-		DrawRotate();
-	else if (m_htype == HT_SCALE)
-		DrawScale();
+	if (m_htype == HANDLER_TYPE_MOVE)
+		drawMove();
+	else if (m_htype == HANDLER_TYPE_ROTATE)
+		drawRotate();
+	else if (m_htype == HANDLER_TYPE_SCALE)
+		drawScale();
 }
 
-void AxesHelper::DrawMove()
+void CAxesHelper::drawMove()
 {
-	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&(m_mHelperMatScale2 * SMMatrixTranslation(Position)));
+	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&(m_mHelperMatScale2 * SMMatrixTranslation(m_vPosition)));
 	SGCore_GetDXDevice()->SetRenderState(D3DRS_LIGHTING, 0);
 	SGCore_GetDXDevice()->SetFVF(D3DFVF_XYZ | D3DFVF_DIFFUSE);
 	SGCore_GetDXDevice()->SetTexture(0, NULL);
@@ -116,27 +116,27 @@ void AxesHelper::DrawMove()
 
 	float len = AXES_HELPER_MOVE_LENGTH;
 	vert l[] = {
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-
-		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0xFFFF0000 },
-		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0x3FFF0000 },
-		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0xFFFF0000 },
-		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0x3FFF0000 },
-
-		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0x3F00FF00 },
-		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0xFF00FF00 },
-		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0x3F00FF00 },
-
-		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0xFF0000FF },
-		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0x3F0000FF },
-		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0xFF0000FF },
-		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0x3F0000FF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+
+		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0xFFFF0000 },
+		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0x3FFF0000 },
+		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0xFFFF0000 },
+		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0x3FFF0000 },
+
+		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0x3F00FF00 },
+		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0xFF00FF00 },
+		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0x3F00FF00 },
+
+		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0xFF0000FF },
+		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0x3F0000FF },
+		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0xFF0000FF },
+		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0x3F0000FF },
 	};
 	SGCore_GetDXDevice()->DrawPrimitiveUP(D3DPT_LINELIST, sizeof(l) / sizeof(vert) / 2, l, sizeof(vert));
 
@@ -146,117 +146,117 @@ void AxesHelper::DrawMove()
 
 	vert l2[] = {
 		//arrow X
-		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
 
 		//arrow Y
-		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-
-		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+
+		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
 
 		//arrow Z
-		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-
-		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+
+		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
 
 
 		//plane XY
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFFFF00 },
-		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len * 0.5f, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFFFF00 },
+		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
 
 		//plane XZ
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
-		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(len * 0.5f, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
+		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(len * 0.5f, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF00FF },
 
 		//plane YZ
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
-		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, 0, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
+		{ float3_t(0, len * 0.5f, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, len * 0.5f, len * 0.5f), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FFFF },
 	};
 	SGCore_GetDXDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, sizeof(l2) / sizeof(vert) / 3, l2, sizeof(vert));
 
 	SGCore_GetDXDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE, 0);
 }
 
-void AxesHelper::DrawCylinder(float3_t lwh, DWORD color)
+void CAxesHelper::drawCylinder(float3_t lwh, DWORD color)
 {
 	const int segs = 16;
 
@@ -281,7 +281,7 @@ void AxesHelper::DrawCylinder(float3_t lwh, DWORD color)
 	SGCore_GetDXDevice()->DrawPrimitiveUP(D3DPT_LINELIST, l.size() / 2, &l[0], sizeof(vert));
 }
 
-void AxesHelper::DrawRotate()
+void CAxesHelper::drawRotate()
 {
 	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&(m_mHelperMatScale2 * m_mHelperMat));
 	DWORD color_act = 0xFFFFFF00;
@@ -289,17 +289,17 @@ void AxesHelper::DrawRotate()
 	SMMATRIX mOld;
 	SGCore_GetDXDevice()->GetTransform(D3DTS_WORLD, (D3DMATRIX*)&mOld);
 
-	DrawCylinder(float3_t(AXES_HELPER_ROTATE_LENGTH_WIDTH, AXES_HELPER_ROTATE_HEIGHT, AXES_HELPER_ROTATE_LENGTH_WIDTH), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00);
+	drawCylinder(float3_t(AXES_HELPER_ROTATE_LENGTH_WIDTH, AXES_HELPER_ROTATE_HEIGHT, AXES_HELPER_ROTATE_LENGTH_WIDTH), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00);
 	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&(SMMatrixRotationZ(SM_PIDIV2) * mOld));
-	DrawCylinder(float3_t(AXES_HELPER_ROTATE_LENGTH_WIDTH, AXES_HELPER_ROTATE_HEIGHT, AXES_HELPER_ROTATE_LENGTH_WIDTH), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000);
+	drawCylinder(float3_t(AXES_HELPER_ROTATE_LENGTH_WIDTH, AXES_HELPER_ROTATE_HEIGHT, AXES_HELPER_ROTATE_LENGTH_WIDTH), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000);
 	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&(SMMatrixRotationX(SM_PIDIV2) * mOld));
-	DrawCylinder(float3_t(AXES_HELPER_ROTATE_LENGTH_WIDTH, AXES_HELPER_ROTATE_HEIGHT, AXES_HELPER_ROTATE_LENGTH_WIDTH), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF);
+	drawCylinder(float3_t(AXES_HELPER_ROTATE_LENGTH_WIDTH, AXES_HELPER_ROTATE_HEIGHT, AXES_HELPER_ROTATE_LENGTH_WIDTH), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF);
 
 
 	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&mOld);
 }
 
-void AxesHelper::DrawScale()
+void CAxesHelper::drawScale()
 {
 	SGCore_GetDXDevice()->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&(m_mHelperMatScale2 * m_mHelperMat));
 	SGCore_GetDXDevice()->SetRenderState(D3DRS_LIGHTING, 0);
@@ -317,27 +317,27 @@ void AxesHelper::DrawScale()
 	float len05 = len * 0.5f;
 	float len075 = len * 0.75f;
 	vert l[] = {
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, 0, 0), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0xFFFF0000 },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0xFF00FF00 },
-		{ float3_t(len075, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0xFFFF0000 },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act : 0xFF00FF00 },
-
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0xFFFF0000 },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0xFF0000FF },
-		{ float3_t(len075, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0xFFFF0000 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_XZ) == HA_XZ ? color_act : 0xFF0000FF },
-
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0xFF0000FF },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0xFF00FF00 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0xFF0000FF },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act : 0xFF00FF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, 0, 0), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0xFFFF0000 },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0xFF00FF00 },
+		{ float3_t(len075, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0xFFFF0000 },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act : 0xFF00FF00 },
+
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0xFFFF0000 },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0xFF0000FF },
+		{ float3_t(len075, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0xFFFF0000 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act : 0xFF0000FF },
+
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0xFF0000FF },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0xFF00FF00 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0xFF0000FF },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act : 0xFF00FF00 },
 	};
 	SGCore_GetDXDevice()->DrawPrimitiveUP(D3DPT_LINELIST, sizeof(l) / sizeof(vert) / 2, l, sizeof(vert));
 
@@ -347,127 +347,127 @@ void AxesHelper::DrawScale()
 
 	vert l2[] = {
 		//arrow X
-		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
-		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HA_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * 0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * -0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len, asize * 0.5f, asize * -0.5f), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
+		{ float3_t(len + asize * 2.0f, 0, 0), (m_currentAxe & HANDLER_AXE_X) ? color_act : 0xFFFF0000 },
 
 		//arrow Y
-		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-
-		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
-		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HA_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+
+		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * 0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * 0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(asize * -0.5f, len, asize * -0.5f), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
+		{ float3_t(0, len + asize * 2.0f, 0), (m_currentAxe & HANDLER_AXE_Y) ? color_act : 0xFF00FF00 },
 
 		//arrow Z
-		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-
-		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
-		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HA_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+
+		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * 0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * 0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(asize * -0.5f, asize * -0.5f, len), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
+		{ float3_t(0, 0, len + asize * 2.0f), (m_currentAxe & HANDLER_AXE_Z) ? color_act : 0xFF0000FF },
 
 
 		//plane XY
-		{ float3_t(len075, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
-		{ float3_t(len075, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_XY) == HA_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(len075, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(len075, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY ? color_act2 : 0x1F00FF00 },
 
 		//plane XZ
-		{ float3_t(len075, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(len075, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_XZ) == HA_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(len075, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(len075, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ ? color_act2 : 0x1F0000FF },
 
 		//plane YZ
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, len075, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, len075), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_YZ) == HA_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, len075, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, len075), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ ? color_act2 : 0x1F0000FF },
 
 		//plane XYZ
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_XYZ) == HA_XYZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_XYZ) == HA_XYZ ? color_act2 : 0x1F0000FF },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XYZ) == HA_XYZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, len05, 0), (m_currentAxe & HA_XYZ) == HA_XYZ ? color_act2 : 0x1F00FF00 },
-		{ float3_t(len05, 0, 0), (m_currentAxe & HA_XYZ) == HA_XYZ ? color_act2 : 0x1FFF0000 },
-		{ float3_t(0, 0, len05), (m_currentAxe & HA_XYZ) == HA_XYZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_XYZ) == HANDLER_AXE_XYZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_XYZ) == HANDLER_AXE_XYZ ? color_act2 : 0x1F0000FF },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XYZ) == HANDLER_AXE_XYZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, len05, 0), (m_currentAxe & HANDLER_AXE_XYZ) == HANDLER_AXE_XYZ ? color_act2 : 0x1F00FF00 },
+		{ float3_t(len05, 0, 0), (m_currentAxe & HANDLER_AXE_XYZ) == HANDLER_AXE_XYZ ? color_act2 : 0x1FFF0000 },
+		{ float3_t(0, 0, len05), (m_currentAxe & HANDLER_AXE_XYZ) == HANDLER_AXE_XYZ ? color_act2 : 0x1F0000FF },
 	};
 	SGCore_GetDXDevice()->DrawPrimitiveUP(D3DPT_TRIANGLELIST, sizeof(l2) / sizeof(vert) / 3, l2, sizeof(vert));
 
 	SGCore_GetDXDevice()->SetRenderState(D3DRS_ALPHABLENDENABLE, 0);
 }
 
-void AxesHelper::OnMouseMove(int x, int y)
+void CAxesHelper::onMouseMove(int x, int y)
 {
-	if (m_htype == HT_NONE)
+	if (m_htype == HANDLER_TYPE_NONE)
 		return;
 
 	static float4x4 mCamView, mCamProj;
@@ -476,7 +476,7 @@ void AxesHelper::OnMouseMove(int x, int y)
 
 	float det = 0;
 	SMMATRIX mat = SMMatrixInverse(&det, m_mHelperMatScale2 * (m_bIsDragging && !m_bIsDraggingStart ? m_mOldDragMat : m_mHelperMat) * mCamView * mCamProj);
-	SMMATRIX mat2 = SMMatrixInverse(&det, m_mHelperMatScale2 * (m_bIsDragging && !m_bIsDraggingStart ? m_mOldDragMatPos : SMMatrixTranslation(Position)) * mCamView * mCamProj);
+	SMMATRIX mat2 = SMMatrixInverse(&det, m_mHelperMatScale2 * (m_bIsDragging && !m_bIsDraggingStart ? m_mOldDragMatPos : SMMatrixTranslation(m_vPosition)) * mCamView * mCamProj);
 	D3DVIEWPORT9 vp;
 	SGCore_GetDXDevice()->GetViewport(&vp);
 
@@ -497,21 +497,21 @@ void AxesHelper::OnMouseMove(int x, int y)
 	pos2 /= pos2.w;
 	dir2 /= dir2.w;
 
-	if (m_htype == HT_MOVE)
-		IntersectMove(pos2, dir2);
-	else if (m_htype == HT_ROTATE)
-		IntersectRotate(pos, dir);
-	else if (m_htype == HT_SCALE)
-		IntersectScale(pos, dir);
+	if (m_htype == HANDLER_TYPE_MOVE)
+		intersectMove(pos2, dir2);
+	else if (m_htype == HANDLER_TYPE_ROTATE)
+		intersectRotate(pos, dir);
+	else if (m_htype == HANDLER_TYPE_SCALE)
+		intersectScale(pos, dir);
 
 	if (m_bIsDraggingStart)
 	{
 		m_bIsDraggingStart = false;
 		m_fStartDragPos = pos;
 		m_mOldDragMat = m_mHelperMat;
-		m_mOldDragMatPos = SMMatrixTranslation(Position);
+		m_mOldDragMatPos = SMMatrixTranslation(m_vPosition);
 		m_mOldHelperMat = m_mHelperMat;
-		ScaleOld = Scale;
+		m_vScaleOld = m_vScale;
 	}
 
 	static float3 vCamPos;
@@ -522,33 +522,33 @@ void AxesHelper::OnMouseMove(int x, int y)
 		float3 dv = (pos - m_fStartDragPos) * (1000.f + SMVector3Length(vCamPos - float3(m_mHelperMat._41, m_mHelperMat._42, m_mHelperMat._43)) * AXES_HELPER_MOVE_SPEED);
 		float4x4 m_res;
 
-		if (m_htype == HT_MOVE)
+		if (m_htype == HANDLER_TYPE_MOVE)
 		{
-			m_res = SMMatrixTranslation((m_currentAxe & HA_X) ? dv.x : 0, (m_currentAxe & HA_Y) ? dv.y : 0, (m_currentAxe & HA_Z) ? dv.z : 0);
+			m_res = SMMatrixTranslation((m_currentAxe & HANDLER_AXE_X) ? dv.x : 0, (m_currentAxe & HANDLER_AXE_Y) ? dv.y : 0, (m_currentAxe & HANDLER_AXE_Z) ? dv.z : 0);
 			m_mHelperMat = m_mOldHelperMat * m_res;
-			Position = m_mHelperMat.r[3];
+			m_vPosition = m_mHelperMat.r[3];
 		}
-		else if (m_htype == HT_ROTATE)
+		else if (m_htype == HANDLER_TYPE_ROTATE)
 		{
-			m_res = SMMatrixRotationX((m_currentAxe & HA_X) ? dv.x : 0) * SMMatrixRotationY((m_currentAxe & HA_Y) ? dv.y : 0) * SMMatrixRotationZ((m_currentAxe & HA_Z) ? dv.z : 0);
+			m_res = SMMatrixRotationX((m_currentAxe & HANDLER_AXE_X) ? dv.x : 0) * SMMatrixRotationY((m_currentAxe & HANDLER_AXE_Y) ? dv.y : 0) * SMMatrixRotationZ((m_currentAxe & HANDLER_AXE_Z) ? dv.z : 0);
 			m_mHelperMat = m_res * m_mOldHelperMat;
-			QRotation = SMQuaternion(m_mHelperMat);
-			Rotation = SMMatrixToEuler(QRotation.GetMatrix());
+			m_qRotation = SMQuaternion(m_mHelperMat);
+			m_vRotation = SMMatrixToEuler(m_qRotation.GetMatrix());
 		}
-		else if (m_htype == HT_SCALE)
+		else if (m_htype == HANDLER_TYPE_SCALE)
 		{
 			//dv = (pos - m_fStartDragPos) * (1000.0f + SMVector3Length(GData::ConstCurrCamPos - float3(m_mHelperMat._41, m_mHelperMat._42, m_mHelperMat._43)) * AXES_HELPER_SCALE_SPEED);
 			//dv /= 10.0f;
 			dv += float3(1.0f, 1.0f, 1.0f);
-			if ((m_currentAxe & HA_XY) == HA_XY)
+			if ((m_currentAxe & HANDLER_AXE_XY) == HANDLER_AXE_XY)
 				dv.x = dv.z = dv.y;
-			else if ((m_currentAxe & HA_YZ) == HA_YZ)
+			else if ((m_currentAxe & HANDLER_AXE_YZ) == HANDLER_AXE_YZ)
 				dv.y = dv.z;
-			else if ((m_currentAxe & HA_XZ) == HA_XZ)
+			else if ((m_currentAxe & HANDLER_AXE_XZ) == HANDLER_AXE_XZ)
 				dv.x = dv.z;
 
-			m_mHelperMat = SMMatrixScaling((m_currentAxe & HA_X) ? dv.x : 1, (m_currentAxe & HA_Y) ? dv.y : 1, (m_currentAxe & HA_Z) ? dv.z : 1) * QRotation.GetMatrix() * SMMatrixTranslation(Position);
-			Scale = (SMVECTOR)ScaleOld * float3(SMVector3Length(float3(m_mHelperMat._11, m_mHelperMat._12, m_mHelperMat._13)),
+			m_mHelperMat = SMMatrixScaling((m_currentAxe & HANDLER_AXE_X) ? dv.x : 1, (m_currentAxe & HANDLER_AXE_Y) ? dv.y : 1, (m_currentAxe & HANDLER_AXE_Z) ? dv.z : 1) * m_qRotation.GetMatrix() * SMMatrixTranslation(m_vPosition);
+			m_vScale = (SMVECTOR)m_vScaleOld * float3(SMVector3Length(float3(m_mHelperMat._11, m_mHelperMat._12, m_mHelperMat._13)),
 				SMVector3Length(float3(m_mHelperMat._21, m_mHelperMat._22, m_mHelperMat._23)),
 				SMVector3Length(float3(m_mHelperMat._31, m_mHelperMat._32, m_mHelperMat._33)));
 		}
@@ -556,15 +556,15 @@ void AxesHelper::OnMouseMove(int x, int y)
 	if (m_bIsDraggingStop)
 	{
 		m_bIsDraggingStop = false;
-		if (m_htype == HT_SCALE)
+		if (m_htype == HANDLER_TYPE_SCALE)
 		{
-			Scale = float3(1, 1, 1);
-			m_mHelperMat = SMMatrixScaling(Scale) * QRotation.GetMatrix() * SMMatrixTranslation(Position);
+			m_vScale = float3(1, 1, 1);
+			m_mHelperMat = SMMatrixScaling(m_vScale) * m_qRotation.GetMatrix() * SMMatrixTranslation(m_vPosition);
 		}
 	}
 }
 
-void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
+void CAxesHelper::intersectMove(const float3 & start, const float3 & dir)
 {
 	if (m_bIsDragging)
 		return;
@@ -577,7 +577,7 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 	float asize = 0.1f;
 	float a2size = 0.3f;
 
-	m_currentAxe = HA_NONE;
+	m_currentAxe = HANDLER_AXE_NONE;
 
 	float3 p;
 
@@ -590,7 +590,7 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_XY;
+			m_currentAxe = HANDLER_AXE_XY;
 		}
 	}
 
@@ -601,7 +601,7 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_XZ;
+			m_currentAxe = HANDLER_AXE_XZ;
 		}
 	}
 
@@ -612,7 +612,7 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_YZ;
+			m_currentAxe = HANDLER_AXE_YZ;
 		}
 	}
 
@@ -715,7 +715,7 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_X;
+				m_currentAxe = HANDLER_AXE_X;
 				break;
 			}
 		}
@@ -728,7 +728,7 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_Y;
+				m_currentAxe = HANDLER_AXE_Y;
 				break;
 			}
 		}
@@ -741,14 +741,14 @@ void AxesHelper::IntersectMove(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_Z;
+				m_currentAxe = HANDLER_AXE_Z;
 				break;
 			}
 		}
 	}
 }
 
-void AxesHelper::IntersectRotate(const float3 & start, const float3 & dir)
+void CAxesHelper::intersectRotate(const float3 & start, const float3 & dir)
 {
 	if (m_bIsDragging)
 	{
@@ -763,7 +763,7 @@ void AxesHelper::IntersectRotate(const float3 & start, const float3 & dir)
 	float h = AXES_HELPER_ROTATE_HEIGHT;
 
 
-	m_currentAxe = HA_NONE;
+	m_currentAxe = HANDLER_AXE_NONE;
 
 	float3 p;
 
@@ -802,7 +802,7 @@ void AxesHelper::IntersectRotate(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_Y;
+				m_currentAxe = HANDLER_AXE_Y;
 				break;
 			}
 		}
@@ -827,7 +827,7 @@ void AxesHelper::IntersectRotate(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_X;
+				m_currentAxe = HANDLER_AXE_X;
 				break;
 			}
 		}
@@ -852,14 +852,14 @@ void AxesHelper::IntersectRotate(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_Z;
+				m_currentAxe = HANDLER_AXE_Z;
 				break;
 			}
 		}
 	}
 }
 
-void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
+void CAxesHelper::intersectScale(const float3 & start, const float3 & dir)
 {
 	if (m_bIsDragging)
 		return;
@@ -874,7 +874,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 	float asize = AXES_HELPER_SCALE_ASIZE;
 	float a2size = AXES_HELPER_SCALE_A2SIZE;
 
-	m_currentAxe = HA_NONE;
+	m_currentAxe = HANDLER_AXE_NONE;
 
 	float3 p;
 
@@ -887,7 +887,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_XY;
+			m_currentAxe = HANDLER_AXE_XY;
 		}
 	}
 
@@ -898,7 +898,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_XZ;
+			m_currentAxe = HANDLER_AXE_XZ;
 		}
 	}
 
@@ -909,7 +909,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_YZ;
+			m_currentAxe = HANDLER_AXE_YZ;
 		}
 	}
 
@@ -919,7 +919,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 		if (d < mind)
 		{
 			mind = d;
-			m_currentAxe = HA_XYZ;
+			m_currentAxe = HANDLER_AXE_XYZ;
 		}
 	}
 
@@ -1022,7 +1022,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_X;
+				m_currentAxe = HANDLER_AXE_X;
 				break;
 			}
 		}
@@ -1035,7 +1035,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_Y;
+				m_currentAxe = HANDLER_AXE_Y;
 				break;
 			}
 		}
@@ -1048,7 +1048,7 @@ void AxesHelper::IntersectScale(const float3 & start, const float3 & dir)
 			if (d < mind)
 			{
 				mind = d;
-				m_currentAxe = HA_Z;
+				m_currentAxe = HANDLER_AXE_Z;
 				break;
 			}
 		}
diff --git a/source/editors_utils/axes_helper.h b/source/editors_utils/axes_helper.h
index 561d46735..232655a8e 100644
--- a/source/editors_utils/axes_helper.h
+++ b/source/editors_utils/axes_helper.h
@@ -40,38 +40,38 @@ inline bool line_intersect_triangle(const float3 &t1, const float3 &t2, const fl
 #define AXES_HELPER_SCALE_A2SIZE 0.15f		/*!< */
 #define AXES_HELPER_SCALE_SPEED 1.f			/*!< */
 
-class AxesHelper
+class CAxesHelper
 {
 public:
-	AxesHelper();
-	~AxesHelper();
+	CAxesHelper();
+	~CAxesHelper();
 
 	SX_ALIGNED_OP_MEM
 
 	enum HANDLER_TYPE
 	{
-		HT_NONE,
-		HT_MOVE,
-		HT_ROTATE,
-		HT_SCALE
+		HANDLER_TYPE_NONE,
+		HANDLER_TYPE_MOVE,
+		HANDLER_TYPE_ROTATE,
+		HANDLER_TYPE_SCALE
 	};
 
-	void SetType(HANDLER_TYPE type);
-	HANDLER_TYPE GetType();
+	void setType(HANDLER_TYPE type);
+	HANDLER_TYPE getType();
 
-	void Render();
+	void render();
 
-	void SetPosition(const float3 & pos);
-	void SetRotation(const float3 & rot);
-	void SetRotation(const SMQuaternion & rot);
-	void SetScale(const float3 & scale);
+	void setPosition(const float3 & pos);
+	void setRotation(const float3 & rot);
+	void setRotation(const SMQuaternion & rot);
+	void setScale(const float3 & scale);
 
-	const float3 & GetPosition();
-	const float3 & GetRotation();
+	const float3 & getPosition();
+	const float3 & getRotation();
 	const float3 & getScale();
-	const SMQuaternion & GetRotationQ();
+	const SMQuaternion & getRotationQ();
 
-	void OnMouseMove(int x, int y);
+	void onMouseMove(int x, int y);
 
 	bool m_bIsDragging;
 	bool m_bIsDraggingStart;
@@ -79,19 +79,19 @@ public:
 
 private:
 
-	float3 Position;
-	float3 Rotation;
-	SMQuaternion QRotation;
-	float3 Scale, ScaleOld;
+	float3 m_vPosition;
+	float3 m_vRotation;
+	SMQuaternion m_qRotation;
+	float3 m_vScale, m_vScaleOld;
 
-	void DrawMove();
-	void DrawCylinder(float3_t lwh, DWORD color = 0xFFFFFFFF);
-	void DrawRotate();
-	void DrawScale();
+	void drawMove();
+	void drawCylinder(float3_t lwh, DWORD color = 0xFFFFFFFF);
+	void drawRotate();
+	void drawScale();
 
-	void IntersectMove(const float3 & start, const float3 & dir);
-	void IntersectRotate(const float3 & start, const float3 & dir);
-	void IntersectScale(const float3 & start, const float3 & dir);
+	void intersectMove(const float3 & start, const float3 & dir);
+	void intersectRotate(const float3 & start, const float3 & dir);
+	void intersectScale(const float3 & start, const float3 & dir);
 
 	struct vert
 	{
@@ -101,14 +101,14 @@ private:
 
 	enum HANDLER_AXE
 	{
-		HA_NONE = 0x00,
-		HA_X = 0x01,
-		HA_Y = 0x02,
-		HA_XY = 0x03,
-		HA_Z = 0x04,
-		HA_XZ = 0x05,
-		HA_YZ = 0x06,
-		HA_XYZ = 0x07
+		HANDLER_AXE_NONE = 0x00,
+		HANDLER_AXE_X = 0x01,
+		HANDLER_AXE_Y = 0x02,
+		HANDLER_AXE_XY = 0x03,
+		HANDLER_AXE_Z = 0x04,
+		HANDLER_AXE_XZ = 0x05,
+		HANDLER_AXE_YZ = 0x06,
+		HANDLER_AXE_XYZ = 0x07
 	};
 
 	HANDLER_AXE m_currentAxe;
@@ -118,7 +118,6 @@ private:
 	SMMATRIX m_mHelperMat;
 	SMMATRIX m_mOldHelperMat;
 	SMMATRIX m_mHelperMatScale2;
-	float dist;
 	SMMATRIX m_mOldDragMat;
 	SMMATRIX m_mOldDragMatPos;
 };
diff --git a/source/game/BaseAmmo.cpp b/source/game/BaseAmmo.cpp
index 41440c58a..193877062 100644
--- a/source/game/BaseAmmo.cpp
+++ b/source/game/BaseAmmo.cpp
@@ -312,7 +312,7 @@ bool CBaseAmmo::shouldRecochet(const float3 &vPos, const float3 &vNormal, const
 	bool isNewSpeedSet = false;
 	if(ID_VALID(idMtl))
 	{
-		fDurability = SML_MtlGetPenetration(idMtl); // прочность
+		fDurability = SML_MtlGetDurability(idMtl); // прочность
 		fDensity = SML_MtlGetDensity(idMtl); // плотность
 		if(fDurability <= 0)
 		{
diff --git a/source/geom/static_geom.cpp b/source/geom/static_geom.cpp
index 63cb685a3..4965c6fcf 100644
--- a/source/geom/static_geom.cpp
+++ b/source/geom/static_geom.cpp
@@ -1169,7 +1169,7 @@ bool CStaticGeom::sortExistsForRender(int sort, ID id_arr)
 					jidbuff = m_aAllModels[i]->m_aSubSets[jarrsplits[j]->m_pNumberGroupModel[k]].m_idBuff;
 					jnumgroup = jarrsplits[j]->m_pNumberGroup[k];
 
-					if (SGCore_MtlGetSort(m_aAllGroups[jnumgroup]->m_idTexture) == sort)
+					if (SGCore_MtlGetSort(m_aAllGroups[jnumgroup]->m_idTexture) & sort)
 						return true;
 				}
 			}
@@ -1219,7 +1219,7 @@ void CStaticGeom::render(DWORD timeDelta, int sort_mtl, ID id_arr, ID exclude_mo
 			CStaticGeom::m_pDXDevice->SetVertexDeclaration(SGCore_StaticModelGetDecl());
 			for (int k = 0, kl = m_aAllModels[i]->m_oLod0.m_pModel->m_uiSubsetCount; k < kl; ++k)
 			{
-				if (m_aAllModels[i]->m_oLod0.m_iSortGroup == sort_mtl || sort_mtl == -1)
+				if ((m_aAllModels[i]->m_oLod0.m_iSortGroup & sort_mtl) || sort_mtl == -1)
 				{
 					SGCore_MtlSet(m_aAllModels[i]->m_oLod0.m_aIDsTextures[k], 0);
 					SGCore_DIP(D3DPT_TRIANGLELIST, 0, 0, m_aAllModels[i]->m_oLod0.m_pModel->m_pVertexCount[k], m_aAllModels[i]->m_oLod0.m_pModel->m_pStartIndex[k], m_aAllModels[i]->m_oLod0.m_pModel->m_pIndexCount[k] / 3);
@@ -1258,7 +1258,7 @@ void CStaticGeom::render(DWORD timeDelta, int sort_mtl, ID id_arr, ID exclude_mo
 
 					int currsort = m_aAllGroups[jnumgroup]->m_iSortGroup;
 
-					if (m_aAllGroups[jnumgroup]->m_iSortGroup == sort_mtl || sort_mtl == -1)
+					if ((m_aAllGroups[jnumgroup]->m_iSortGroup & sort_mtl) || sort_mtl == -1)
 					{
 						if (
 							jarrsplits[j]->m_pCountPoly[k] > 0 &&	//если количество полигонов больше 0
@@ -1303,7 +1303,7 @@ void CStaticGeom::render(DWORD timeDelta, int sort_mtl, ID id_arr, ID exclude_mo
 		for(int i = 0, l = m_aAllGroups.size(); i < l; ++i)
 		{
 			CGroup* tmpgroup = m_aAllGroups[i];
-			if (!tmpgroup || tmpgroup->m_aCountVertex.size() <= 0 || !(tmpgroup->m_iSortGroup == sort_mtl || sort_mtl == -1))
+			if (!tmpgroup || tmpgroup->m_aCountVertex.size() <= 0 || !((tmpgroup->m_iSortGroup & sort_mtl) || sort_mtl == -1))
 				continue;
 
 			//проходимся по всем буферам
@@ -1364,7 +1364,7 @@ void CStaticGeom::render(DWORD timeDelta, int sort_mtl, ID id_arr, ID exclude_mo
 			CInfoGroup* tmpig = m_aDistGroup[i];
 			CGroup* tmpgroup = m_aAllGroups[tmpig->m_idGlobalGroup];
 
-			if (!tmpgroup || tmpgroup->m_aCountVertex.size() <= 0 || !(tmpgroup->m_iSortGroup == sort_mtl || sort_mtl == -1))
+			if (!tmpgroup || tmpgroup->m_aCountVertex.size() <= 0 || !((tmpgroup->m_iSortGroup & sort_mtl) || sort_mtl == -1))
 				continue;
 
 			if (exclude_model_id == tmpig->m_idModel && (exclude_group_id < 0 || exclude_group_id == tmpig->m_idGroup))
@@ -2742,8 +2742,8 @@ bool CStaticGeom::getIntersectedRayY(float3* pos)
 		{
 			for (DWORD group = 0; group<m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_uiCountSubSet; group++)
 			{
-				if (m_aAllGroups[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroup[group]]->m_iSortGroup > 0)
-					continue;
+				/*if (m_aAllGroups[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroup[group]]->m_iSortGroup > 0)
+					continue;*/
 
 				ID idbuff = m_aAllModels[id]->m_aSubSets[m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroupModel[group]].m_idBuff;
 				ID idgroup = m_aArrComFor[1]->m_aIRS[id]->m_ppSegments[k]->m_pNumberGroup[group];
diff --git a/source/mtllight/light.cpp b/source/mtllight/light.cpp
index d9fdb6a22..acd4c344b 100644
--- a/source/mtllight/light.cpp
+++ b/source/mtllight/light.cpp
@@ -69,12 +69,12 @@ ID CLights::createCopy(ID id)
 		if (tmplight->ShadowPSSM)
 		{
 			tmplight2->ShadowPSSM = new PSSM();
-			tmplight2->ShadowPSSM->Init();
+			tmplight2->ShadowPSSM->init();
 			tmplight2->GAngleX = tmplight->GAngleX;
 			tmplight2->GAngleY = tmplight->GAngleY;
-			tmplight2->ShadowPSSM->SetPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
-			memcpy((tmplight2->ShadowPSSM->NearFar), (tmplight->ShadowPSSM->NearFar), sizeof(float2)* 5);
-			memcpy((tmplight2->ShadowPSSM->IsUpdate), (tmplight->ShadowPSSM->IsUpdate), sizeof(int) * 5);
+			tmplight2->ShadowPSSM->setPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
+			memcpy((tmplight2->ShadowPSSM->m_aNearFar), (tmplight->ShadowPSSM->m_aNearFar), sizeof(float2)* 5);
+			memcpy((tmplight2->ShadowPSSM->m_aIsUpdate), (tmplight->ShadowPSSM->m_aIsUpdate), sizeof(int)* 5);
 		}
 		else
 			tmplight2->ShadowPSSM = 0;
@@ -82,15 +82,15 @@ ID CLights::createCopy(ID id)
 		if (tmplight->ShadowSM)
 		{
 			tmplight2->ShadowSM = new ShadowMapTech();
-			tmplight2->ShadowSM->Init();
-			tmplight2->ShadowSM->SetPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
-			tmplight2->ShadowSM->SetDirection(&(tmplight->Quaternion * LIGHTS_DIR_BASE));
+			tmplight2->ShadowSM->init();
+			tmplight2->ShadowSM->setPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
+			tmplight2->ShadowSM->setDirection(&(tmplight->Quaternion * LIGHTS_DIR_BASE));
 			
-			tmplight2->ShadowSM->SetBias(tmplight->ShadowSM->GetBias());
-			tmplight2->ShadowSM->SetBlurPixel(tmplight->ShadowSM->GetBlurPixel());
+			tmplight2->ShadowSM->setBias(tmplight->ShadowSM->getBias());
+			tmplight2->ShadowSM->setBlurPixel(tmplight->ShadowSM->getBlurPixel());
 			float3 anf;
-			tmplight2->ShadowSM->GetAngleNearFar(&anf);
-			tmplight2->ShadowSM->SetAngleNearFar(&anf);
+			tmplight2->ShadowSM->getAngleNearFar(&anf);
+			tmplight2->ShadowSM->setAngleNearFar(&anf);
 		}
 		else
 			tmplight2->ShadowSM = 0;
@@ -98,17 +98,17 @@ ID CLights::createCopy(ID id)
 		if (tmplight->ShadowCube)
 		{
 			tmplight2->ShadowCube = new ShadowMapCubeTech();
-			tmplight2->ShadowCube->Init();
-			tmplight2->ShadowCube->SetPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
-			tmplight2->ShadowCube->SetNearFar(&float2(0.1f, tmplight->Dist));
-			tmplight2->ShadowCube->SetNear(tmplight2->ShadowCube->GetNear());
-			tmplight2->ShadowCube->SetFar(tmplight2->ShadowCube->GetFar());
-			tmplight2->ShadowCube->SetBias(tmplight->ShadowCube->GetBias());
-			tmplight2->ShadowCube->SetBlurPixel(tmplight->ShadowCube->GetBlurPixel());
+			tmplight2->ShadowCube->init();
+			tmplight2->ShadowCube->setPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
+			tmplight2->ShadowCube->setNearFar(&float2(0.1f, tmplight->Dist));
+			tmplight2->ShadowCube->setNear(tmplight2->ShadowCube->getNear());
+			tmplight2->ShadowCube->setFar(tmplight2->ShadowCube->getFar());
+			tmplight2->ShadowCube->setBias(tmplight->ShadowCube->getBias());
+			tmplight2->ShadowCube->setBlurPixel(tmplight->ShadowCube->getBlurPixel());
 
 			for (int i = 0; i < 6; ++i)
 			{
-				tmplight2->ShadowCube->SetEnableCubeEdge(i, tmplight2->ShadowCube->GetEnableCubeEdge(i));
+				tmplight2->ShadowCube->setEnableCubeEdge(i, tmplight2->ShadowCube->getEnableCubeEdge(i));
 			}
 		}
 		else
@@ -163,11 +163,11 @@ void CLights::onLostDevice()
 	for (int i = 0; i < ArrLights.size(); ++i)
 	{
 		if (ArrLights[i]->ShadowSM)
-			ArrLights[i]->ShadowSM->OnLostDevice();
+			ArrLights[i]->ShadowSM->onLostDevice();
 		else if (ArrLights[i]->ShadowCube)
-			ArrLights[i]->ShadowCube->OnLostDevice();
+			ArrLights[i]->ShadowCube->onLostDevice();
 		else if (ArrLights[i]->ShadowPSSM)
-			ArrLights[i]->ShadowPSSM->OnLostDevice();
+			ArrLights[i]->ShadowPSSM->onLostDevice();
 	}
 }
 
@@ -176,11 +176,11 @@ void CLights::onResetDevice()
 	for (int i = 0; i < ArrLights.size(); ++i)
 	{
 		if (ArrLights[i]->ShadowSM)
-			ArrLights[i]->ShadowSM->OnResetDevice();
+			ArrLights[i]->ShadowSM->onResetDevice();
 		else if (ArrLights[i]->ShadowCube)
-			ArrLights[i]->ShadowCube->OnResetDevice();
+			ArrLights[i]->ShadowCube->onResetDevice();
 		else if (ArrLights[i]->ShadowPSSM)
-			ArrLights[i]->ShadowPSSM->OnResetDevice();
+			ArrLights[i]->ShadowPSSM->onResetDevice();
 
 		lightCountUpdateNull(i);
 	}
@@ -230,32 +230,32 @@ void CLights::clearIDArr()
 
 		if (ArrLights[i]->ShadowSM)
 		{
-			for (int k = 0; k < ArrLights[i]->ShadowSM->GetCountIDArrs(); ++k)
+			for (int k = 0; k < ArrLights[i]->ShadowSM->getCountIDArrs(); ++k)
 			{
-				ArrLights[i]->ShadowSM->SetIDArr(k, -1);
+				ArrLights[i]->ShadowSM->setIDArr(k, -1);
 			}
 		}
 		else if (ArrLights[i]->ShadowCube)
 		{
-			for (int k = 0; k < ArrLights[i]->ShadowCube->GetCountIDArrs(); ++k)
+			for (int k = 0; k < ArrLights[i]->ShadowCube->getCountIDArrs(); ++k)
 			{
-				ArrLights[i]->ShadowCube->SetIDArr(k, 0, -1);
-				ArrLights[i]->ShadowCube->SetIDArr(k, 1, -1);
-				ArrLights[i]->ShadowCube->SetIDArr(k, 2, -1);
-				ArrLights[i]->ShadowCube->SetIDArr(k, 3, -1);
-				ArrLights[i]->ShadowCube->SetIDArr(k, 4, -1);
-				ArrLights[i]->ShadowCube->SetIDArr(k, 5, -1);
+				ArrLights[i]->ShadowCube->setIDArr(k, 0, -1);
+				ArrLights[i]->ShadowCube->setIDArr(k, 1, -1);
+				ArrLights[i]->ShadowCube->setIDArr(k, 2, -1);
+				ArrLights[i]->ShadowCube->setIDArr(k, 3, -1);
+				ArrLights[i]->ShadowCube->setIDArr(k, 4, -1);
+				ArrLights[i]->ShadowCube->setIDArr(k, 5, -1);
 			}
 		}
 		else if (ArrLights[i]->ShadowPSSM)
 		{
-			for (int k = 0; k < ArrLights[i]->ShadowPSSM->GetCountIDArrs(); ++k)
+			for (int k = 0; k < ArrLights[i]->ShadowPSSM->getCountIDArrs(); ++k)
 			{
-				ArrLights[i]->ShadowPSSM->SetIDArr(k, 0, -1);
-				ArrLights[i]->ShadowPSSM->SetIDArr(k, 1, -1);
-				ArrLights[i]->ShadowPSSM->SetIDArr(k, 2, -1);
-				ArrLights[i]->ShadowPSSM->SetIDArr(k, 3, -1);
-				ArrLights[i]->ShadowPSSM->SetIDArr(k, 4, -1);
+				ArrLights[i]->ShadowPSSM->setIDArr(k, 0, -1);
+				ArrLights[i]->ShadowPSSM->setIDArr(k, 1, -1);
+				ArrLights[i]->ShadowPSSM->setIDArr(k, 2, -1);
+				ArrLights[i]->ShadowPSSM->setIDArr(k, 3, -1);
+				ArrLights[i]->ShadowPSSM->setIDArr(k, 4, -1);
 			}
 		}
 	}
@@ -339,15 +339,15 @@ ID CLights::createPoint(ID id, const float3* center, float dist, const float3* c
 		if (isglobal && is_shadow)
 		{
 			tmplight->ShadowPSSM = new PSSM();
-			tmplight->ShadowPSSM->Init();
-			tmplight->ShadowPSSM->SetPosition(&float3(center->x, center->y, center->z));
+			tmplight->ShadowPSSM->init();
+			tmplight->ShadowPSSM->setPosition(&float3(center->x, center->y, center->z));
 		}
 		else if (is_shadow)
 		{
 			tmplight->ShadowCube = new ShadowMapCubeTech();
-			tmplight->ShadowCube->Init();
-			tmplight->ShadowCube->SetPosition(&float3(center->x, center->y, center->z));
-			tmplight->ShadowCube->SetNearFar(&float2(LIGHTS_LOCAL_STD_NEAR, tmplight->Dist));
+			tmplight->ShadowCube->init();
+			tmplight->ShadowCube->setPosition(&float3(center->x, center->y, center->z));
+			tmplight->ShadowCube->setNearFar(&float2(LIGHTS_LOCAL_STD_NEAR, tmplight->Dist));
 			
 		}
 
@@ -422,10 +422,10 @@ ID CLights::createDirection(ID id, const float3* pos, float dist, const float3*
 	if (is_shadow)
 	{
 		tmplight->ShadowSM = new ShadowMapTech();
-		tmplight->ShadowSM->Init();
-		tmplight->ShadowSM->SetPosition(&float3(pos->x, pos->y, pos->z));
-		tmplight->ShadowSM->SetDirection(&(tmplight->Quaternion * LIGHTS_DIR_BASE));
-		tmplight->ShadowSM->SetAngleNearFar(&float3(angle, LIGHTS_LOCAL_STD_NEAR, dist));
+		tmplight->ShadowSM->init();
+		tmplight->ShadowSM->setPosition(&float3(pos->x, pos->y, pos->z));
+		tmplight->ShadowSM->setDirection(&(tmplight->Quaternion * LIGHTS_DIR_BASE));
+		tmplight->ShadowSM->setAngleNearFar(&float3(angle, LIGHTS_LOCAL_STD_NEAR, dist));
 	}
 	
 	if (is_shadow)
@@ -544,7 +544,7 @@ void CLights::setLightDist(ID id, float radius_height, bool is_create)
 	}
 
 	if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->SetAngleNearFar(&float3(ArrLights[id]->Angle, 0.1, ArrLights[id]->Dist));
+		ArrLights[id]->ShadowSM->setAngleNearFar(&float3(ArrLights[id]->Angle, 0.1, ArrLights[id]->Dist));
 
 	if (ArrLights[id]->TypeLight == LTYPE_LIGHT_POINT && is_create)
 	{
@@ -553,7 +553,7 @@ void CLights::setLightDist(ID id, float radius_height, bool is_create)
 	}
 
 	if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->SetNearFar(&float2(0.1, ArrLights[id]->Dist));
+		ArrLights[id]->ShadowCube->setNearFar(&float2(0.1, ArrLights[id]->Dist));
 
 	if (ArrLights[id]->Mesh)
 	{
@@ -593,7 +593,7 @@ void CLights::setLightPos(ID id, const float3* vec, bool greal)
 
 		tmplight->WorldMat = SMMatrixTranslation(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z);
 		if (tmplight->ShadowPSSM)
-			tmplight->ShadowPSSM->SetPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
+			tmplight->ShadowPSSM->setPosition(&float3(tmplight->Position.x, tmplight->Position.y, tmplight->Position.z));
 	}
 	else
 	{
@@ -606,13 +606,13 @@ void CLights::setLightPos(ID id, const float3* vec, bool greal)
 
 			if (ArrLights[id]->ShadowSM)
 			{
-				ArrLights[id]->ShadowSM->SetPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
+				ArrLights[id]->ShadowSM->setPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
 			}
 
 			if (ArrLights[id]->ShadowCube)
 			{
 				ArrLights[id]->WorldMat = SMMatrixTranslation(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z);
-				ArrLights[id]->ShadowCube->SetPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
+				ArrLights[id]->ShadowCube->setPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
 			}
 	}
 
@@ -633,7 +633,7 @@ void CLights::setLightOrient(ID id, const SMQuaternion* q)
 	ArrLights[id]->Quaternion = *q;
 
 	if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->SetDirection(&(ArrLights[id]->Quaternion * LIGHTS_DIR_BASE));
+		ArrLights[id]->ShadowSM->setDirection(&(ArrLights[id]->Quaternion * LIGHTS_DIR_BASE));
 
 	lightCountUpdateNull(id);
 }
@@ -643,9 +643,9 @@ void CLights::setShadowBias(ID id, float val)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 		if (ArrLights[id]->ShadowSM)
-			ArrLights[id]->ShadowSM->SetBias(val);
+			ArrLights[id]->ShadowSM->setBias(val);
 		else if (ArrLights[id]->ShadowCube)
-			ArrLights[id]->ShadowCube->SetBias(val);
+			ArrLights[id]->ShadowCube->setBias(val);
 
 		lightCountUpdateNull(id);
 }
@@ -655,9 +655,9 @@ float CLights::getShadowBias(ID id) const
 	LIGHTS_PRE_COND_ID(id, -1);
 
 	if (ArrLights[id]->ShadowSM)
-		return ArrLights[id]->ShadowSM->GetBias();
+		return ArrLights[id]->ShadowSM->getBias();
 	else if (ArrLights[id]->ShadowCube)
-		return ArrLights[id]->ShadowCube->GetBias();
+		return ArrLights[id]->ShadowCube->getBias();
 	return(0);
 }
 
@@ -763,11 +763,11 @@ void CLights::shadowRenderBegin(ID id)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->Begin();
+		ArrLights[id]->ShadowSM->begin();
 	else if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->Begin();
+		ArrLights[id]->ShadowCube->begin();
 	else if (ArrLights[id]->ShadowPSSM)
-		ArrLights[id]->ShadowPSSM->Begin();
+		ArrLights[id]->ShadowPSSM->begin();
 }
 
 void CLights::shadowRenderEnd(ID id)
@@ -775,11 +775,11 @@ void CLights::shadowRenderEnd(ID id)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->End();
+		ArrLights[id]->ShadowSM->end();
 	else if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->End();
+		ArrLights[id]->ShadowCube->end();
 	else if (ArrLights[id]->ShadowPSSM)
-		ArrLights[id]->ShadowPSSM->End();
+		ArrLights[id]->ShadowPSSM->end();
 }
 
 void CLights::shadowRenderPre(ID id, int cube)
@@ -787,9 +787,9 @@ void CLights::shadowRenderPre(ID id, int cube)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->Pre(cube);
+		ArrLights[id]->ShadowCube->pre(cube);
 	else if (ArrLights[id]->ShadowPSSM && cube >= 0 && cube < 5)
-		ArrLights[id]->ShadowPSSM->PreRender(cube);
+		ArrLights[id]->ShadowPSSM->preRender(cube);
 }
 
 void CLights::shadowRenderPost(ID id, int cube)
@@ -797,18 +797,17 @@ void CLights::shadowRenderPost(ID id, int cube)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->Post(cube);
+		ArrLights[id]->ShadowCube->post(cube);
 }
 
-void CLights::initShaderOfTypeMaterial(ID id, int typemat, float4x4* wmat)
+void CLights::initShaderOfTypeMaterial(ID id, int typemat, const float4x4* wmat)
 {
-	if (!wmat)
-		wmat = &SMMatrixIdentity();
+	float4x4 mWorld = (wmat ? (*wmat) : SMMatrixIdentity());
 	
 	float4x4 tmpmat;
 	Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &tmpmat);
-	tmpmat = SMMatrixTranspose((*wmat) * tmpmat);
-	float4x4 tmpwmat = SMMatrixTranspose(*wmat);
+	tmpmat = SMMatrixTranspose(mWorld * tmpmat);
+	float4x4 tmpwmat = SMMatrixTranspose(mWorld);
 	if (ArrLights[id]->ShadowSM || ArrLights[id]->ShadowPSSM)
 	{
 		if (typemat == MTL_TYPE_GEOM)
@@ -885,12 +884,12 @@ IFrustum* CLights::getLightFrustum(ID id, int how) const
 		else if (ArrLights[id]->ShadowCube)
 		{
 			if (how >= 0 && how < 6)
-				return ArrLights[id]->ShadowCube->Frustums[how];
+				return ArrLights[id]->ShadowCube->m_aFrustums[how];
 		}
 		else if (ArrLights[id]->ShadowPSSM)
 		{
 			if (how >= 0 && how < 5)
-				return ArrLights[id]->ShadowPSSM->Frustums[how];
+				return ArrLights[id]->ShadowPSSM->m_aFrustums[how];
 		}
 	return(NULL);
 }
@@ -899,8 +898,8 @@ IFrustum* CLights::getLightFrustumG(ID id, int split) const
 {
 	LIGHTS_PRE_COND_ID(id, 0);
 
-	if (ArrLights[id]->ShadowPSSM && split >= 0 && split < 4 && ArrLights[id]->ShadowPSSM->Frustums[split])
-		return ArrLights[id]->ShadowPSSM->Frustums[split];
+	if (ArrLights[id]->ShadowPSSM && split >= 0 && split < 4 && ArrLights[id]->ShadowPSSM->m_aFrustums[split])
+		return ArrLights[id]->ShadowPSSM->m_aFrustums[split];
 	return(NULL);
 }
 
@@ -908,7 +907,7 @@ void CLights::updateLightGFrustums(ID id, int split, const float3* pos, const fl
 {
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
-	ArrLights[id]->ShadowPSSM->UpdateFrustums(split, pos, dir);
+	ArrLights[id]->ShadowPSSM->updateFrustums(split, pos, dir);
 }
 
 void CLights::shadowGen2(ID id)
@@ -916,15 +915,15 @@ void CLights::shadowGen2(ID id)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->GenShadow2(SGCore_RTGetTexture(ShadowMap));
+		ArrLights[id]->ShadowSM->genShadow(SGCore_RTGetTexture(ShadowMap));
 	else if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->GenShadow2(SGCore_RTGetTexture(ShadowMap));
+		ArrLights[id]->ShadowCube->genShadow(SGCore_RTGetTexture(ShadowMap));
 	else if (ArrLights[id]->ShadowPSSM)
 	{
 		if (!m_isCastGlobalShadow)
-			ArrLights[id]->ShadowPSSM->GenShadow2(SGCore_RTGetTexture(ShadowMap));
+			ArrLights[id]->ShadowPSSM->genShadow(SGCore_RTGetTexture(ShadowMap));
 		else
-			ArrLights[id]->ShadowPSSM->GenShadowAll(SGCore_RTGetTexture(ShadowMap));
+			ArrLights[id]->ShadowPSSM->genShadowAll(SGCore_RTGetTexture(ShadowMap));
 	}
 }
 
@@ -971,7 +970,7 @@ void CLights::setLightAngle(ID id, float angle, bool is_create)
 		}
 
 		if (ArrLights[id]->TypeLight == LTYPE_LIGHT_DIR && ArrLights[id]->ShadowSM)
-			ArrLights[id]->ShadowSM->SetAngleNearFar(&float3(angle, 0.1, ArrLights[id]->Dist));
+			ArrLights[id]->ShadowSM->setAngleNearFar(&float3(angle, 0.1, ArrLights[id]->Dist));
 
 		lightCountUpdateNull(id);
 }
@@ -1003,11 +1002,11 @@ void CLights::setShadowBlurPixel(ID id, float blur_pixel)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 		if (ArrLights[id]->ShadowCube)
-			ArrLights[id]->ShadowCube->SetBlurPixel(blur_pixel);
+			ArrLights[id]->ShadowCube->setBlurPixel(blur_pixel);
 		else if (ArrLights[id]->ShadowSM)
-			ArrLights[id]->ShadowSM->SetBlurPixel(blur_pixel);
+			ArrLights[id]->ShadowSM->setBlurPixel(blur_pixel);
 		else if (ArrLights[id]->ShadowPSSM)
-			ArrLights[id]->ShadowPSSM->SetBlurPixel(blur_pixel);
+			ArrLights[id]->ShadowPSSM->setBlurPixel(blur_pixel);
 
 		lightCountUpdateNull(id);
 }
@@ -1017,11 +1016,11 @@ float CLights::getShadowBlurPixel(ID id) const
 	LIGHTS_PRE_COND_ID(id, -1);
 
 		if (ArrLights[id]->ShadowCube)
-			return ArrLights[id]->ShadowCube->GetBlurPixel();
+			return ArrLights[id]->ShadowCube->getBlurPixel();
 		else if (ArrLights[id]->ShadowSM)
-			return ArrLights[id]->ShadowSM->GetBlurPixel();
+			return ArrLights[id]->ShadowSM->getBlurPixel();
 		else if (ArrLights[id]->ShadowPSSM)
-			return ArrLights[id]->ShadowPSSM->GetBlurPixel();
+			return ArrLights[id]->ShadowPSSM->getBlurPixel();
 	return(0);
 }
 
@@ -1030,9 +1029,9 @@ void CLights::setShadowLocalNear(ID id, float slnear)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->SetNear(slnear);
+		ArrLights[id]->ShadowCube->setNear(slnear);
 	else if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->SetNear(slnear);
+		ArrLights[id]->ShadowSM->setNear(slnear);
 
 	lightCountUpdateNull(id);
 }
@@ -1042,9 +1041,9 @@ float CLights::getShadowLocalNear(ID id) const
 	LIGHTS_PRE_COND_ID(id, -1);
 
 	if (ArrLights[id]->ShadowCube)
-		return ArrLights[id]->ShadowCube->GetNear();
+		return ArrLights[id]->ShadowCube->getNear();
 	else if (ArrLights[id]->ShadowSM)
-		return ArrLights[id]->ShadowSM->GetNear();
+		return ArrLights[id]->ShadowSM->getNear();
 	return(0);
 }
 
@@ -1055,12 +1054,12 @@ void CLights::setShadowLocalFar(ID id, float slfar)
 	if (ArrLights[id]->ShadowCube)
 	{
 		float2 tmpnf;
-		ArrLights[id]->ShadowCube->GetNearFar(&tmpnf);
+		ArrLights[id]->ShadowCube->getNearFar(&tmpnf);
 		tmpnf.y = slfar;
-		ArrLights[id]->ShadowCube->SetNearFar(&tmpnf);
+		ArrLights[id]->ShadowCube->setNearFar(&tmpnf);
 	}
 	else if (ArrLights[id]->ShadowSM)
-		ArrLights[id]->ShadowSM->SetFar(slfar);
+		ArrLights[id]->ShadowSM->setFar(slfar);
 
 	lightCountUpdateNull(id);
 }
@@ -1072,11 +1071,11 @@ float CLights::getShadowLocalFar(ID id) const
 	if (ArrLights[id]->ShadowCube)
 	{
 		float2 tmpnf;
-		ArrLights[id]->ShadowCube->GetNearFar(&tmpnf);
+		ArrLights[id]->ShadowCube->getNearFar(&tmpnf);
 		return tmpnf.y;
 	}
 	else if (ArrLights[id]->ShadowSM)
-		return ArrLights[id]->ShadowSM->GetFar();
+		return ArrLights[id]->ShadowSM->getFar();
 	else
 		return ArrLights[id]->Dist;
 }
@@ -1086,7 +1085,7 @@ void CLights::setLightCubeEdgeEnable(ID id, int edge, bool enable)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowCube)
-		ArrLights[id]->ShadowCube->SetEnableCubeEdge(edge, enable);
+		ArrLights[id]->ShadowCube->setEnableCubeEdge(edge, enable);
 
 	lightCountUpdateNull(id);
 }
@@ -1096,7 +1095,7 @@ bool CLights::getLightCubeEdgeEnable(ID id, int edge) const
 	LIGHTS_PRE_COND_ID(id, false);
 
 	if (ArrLights[id]->ShadowCube)
-		return ArrLights[id]->ShadowCube->GetEnableCubeEdge(edge);
+		return ArrLights[id]->ShadowCube->getEnableCubeEdge(edge);
 	return(false);
 }
 
@@ -1107,17 +1106,17 @@ ID CLights::getLightIDArr(ID id, ID inid, int how)
 		if (ArrLights[id]->ShadowSM)
 		{
 			if (how == 0)
-				return ArrLights[id]->ShadowSM->GetIDArr(inid);
+				return ArrLights[id]->ShadowSM->getIDArr(inid);
 		}
 		else if (ArrLights[id]->ShadowCube)
 		{
 			if (how >= 0 && how < 6)
-				return ArrLights[id]->ShadowCube->GetIDArr(inid, how);
+				return ArrLights[id]->ShadowCube->getIDArr(inid, how);
 		}
 		else if (ArrLights[id]->ShadowPSSM)
 		{
 			if (how >= 0 && how < 5)
-				return ArrLights[id]->ShadowPSSM->GetIDArr(inid, how);
+				return ArrLights[id]->ShadowPSSM->getIDArr(inid, how);
 		}
 	return(-1);
 }
@@ -1129,17 +1128,17 @@ void CLights::setLightIDArr(ID id, ID inid, int how, ID id_arr)
 		if (ArrLights[id]->ShadowSM)
 		{
 			if (how == 0)
-				ArrLights[id]->ShadowSM->SetIDArr(inid, id_arr);
+				ArrLights[id]->ShadowSM->setIDArr(inid, id_arr);
 		}
 		else if (ArrLights[id]->ShadowCube)
 		{
 			if (how >= 0 && how < 6)
-				ArrLights[id]->ShadowCube->SetIDArr(inid, how, id_arr);
+				ArrLights[id]->ShadowCube->setIDArr(inid, how, id_arr);
 		}
 		else if (ArrLights[id]->ShadowPSSM)
 		{
 			if (how >= 0 && how < 5)
-				ArrLights[id]->ShadowPSSM->SetIDArr(inid, how, id_arr);
+				ArrLights[id]->ShadowPSSM->setIDArr(inid, how, id_arr);
 		}
 }
 
@@ -1157,10 +1156,10 @@ void CLights::setLightTypeShadowed(ID id, LTYPE_SHADOW type)
 		if (!ArrLights[id]->ShadowSM)
 		{
 			ArrLights[id]->ShadowSM = new ShadowMapTech();
-			ArrLights[id]->ShadowSM->Init();
-			ArrLights[id]->ShadowSM->SetPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
-			ArrLights[id]->ShadowSM->SetDirection(&(ArrLights[id]->Quaternion * LIGHTS_DIR_BASE));
-			ArrLights[id]->ShadowSM->SetAngleNearFar(&float3(ArrLights[id]->Angle, 0.1, ArrLights[id]->Dist));
+			ArrLights[id]->ShadowSM->init();
+			ArrLights[id]->ShadowSM->setPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
+			ArrLights[id]->ShadowSM->setDirection(&(ArrLights[id]->Quaternion * LIGHTS_DIR_BASE));
+			ArrLights[id]->ShadowSM->setAngleNearFar(&float3(ArrLights[id]->Angle, 0.1, ArrLights[id]->Dist));
 		}
 	}
 	else if (ArrLights[id]->TypeLight == LTYPE_LIGHT_GLOBAL)
@@ -1170,8 +1169,8 @@ void CLights::setLightTypeShadowed(ID id, LTYPE_SHADOW type)
 			if (!ArrLights[id]->ShadowPSSM)
 			{
 				ArrLights[id]->ShadowPSSM = new PSSM();
-				ArrLights[id]->ShadowPSSM->Init();
-				ArrLights[id]->ShadowPSSM->SetPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
+				ArrLights[id]->ShadowPSSM->init();
+				ArrLights[id]->ShadowPSSM->setPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
 			}
 		}
 	}
@@ -1180,9 +1179,9 @@ void CLights::setLightTypeShadowed(ID id, LTYPE_SHADOW type)
 		if (!ArrLights[id]->ShadowCube)
 		{
 			ArrLights[id]->ShadowCube = new ShadowMapCubeTech();
-			ArrLights[id]->ShadowCube->Init();
-			ArrLights[id]->ShadowCube->SetPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
-			ArrLights[id]->ShadowCube->SetNearFar(&float2(0.1f, ArrLights[id]->Dist));
+			ArrLights[id]->ShadowCube->init();
+			ArrLights[id]->ShadowCube->setPosition(&float3(ArrLights[id]->Position.x, ArrLights[id]->Position.y, ArrLights[id]->Position.z));
+			ArrLights[id]->ShadowCube->setNearFar(&float2(0.1f, ArrLights[id]->Dist));
 		}
 	}
 
@@ -1208,19 +1207,19 @@ bool CLights::lightCountUpdateUpdate(ID id, const float3* viewpos, int ghow)
 			{
 				if (ghow >= 0 && ghow < 4)
 				{
-					if (tmpl->ShadowPSSM->IsUpdate[ghow] >= ghow*LIGHTS_UPDATE_PSSM_SPLIT)
-						tmpl->ShadowPSSM->IsUpdate[ghow] = -1;
+					if (tmpl->ShadowPSSM->m_aIsUpdate[ghow] >= ghow*LIGHTS_UPDATE_PSSM_SPLIT)
+						tmpl->ShadowPSSM->m_aIsUpdate[ghow] = -1;
 				}
 				else
 				{
-					if (tmpl->ShadowPSSM->IsUpdate[ghow] >= LIGHTS_UPDATE_PSSM_SPLIT_5)
-						tmpl->ShadowPSSM->IsUpdate[ghow] = -1;
+					if (tmpl->ShadowPSSM->m_aIsUpdate[ghow] >= LIGHTS_UPDATE_PSSM_SPLIT_5)
+						tmpl->ShadowPSSM->m_aIsUpdate[ghow] = -1;
 					
 				}
 
-				++(tmpl->ShadowPSSM->IsUpdate[ghow]);
+				++(tmpl->ShadowPSSM->m_aIsUpdate[ghow]);
 				
-				return (tmpl->ShadowPSSM->IsUpdate[ghow] == 0);
+				return (tmpl->ShadowPSSM->m_aIsUpdate[ghow] == 0);
 			}
 		}
 
@@ -1275,7 +1274,7 @@ bool CLights::lightCountUpdateAllowed(ID id, int ghow) const
 		{
 			if (ArrLights[id]->ShadowPSSM)
 			{
-				return (ArrLights[id]->ShadowPSSM->IsUpdate[ghow] == 0);
+				return (ArrLights[id]->ShadowPSSM->m_aIsUpdate[ghow] == 0);
 			}
 		}
 		else if (ArrLights[id]->TypeShadowed == LTYPE_SHADOW_STATIC)
@@ -1502,7 +1501,7 @@ void CLights::set4Or3Splits(ID id, bool is4)
 	LIGHTS_PRE_COND_ID(id, _VOID);
 
 	if (ArrLights[id]->ShadowPSSM)
-		ArrLights[id]->ShadowPSSM->Set4Or3Splits(is4);
+		ArrLights[id]->ShadowPSSM->set4Or3Splits(is4);
 }
 
 bool CLights::get4Or3Splits(ID id)
@@ -1510,7 +1509,7 @@ bool CLights::get4Or3Splits(ID id)
 	LIGHTS_PRE_COND_ID(id, false);
 
 	if (ArrLights[id]->ShadowPSSM)
-		return ArrLights[id]->ShadowPSSM->Get4Or3Splits();
+		return ArrLights[id]->ShadowPSSM->get4Or3Splits();
 
 	return false;
 }
@@ -1542,17 +1541,17 @@ ID CLights::delGetIDArr(ID key, ID inid, int how)
 	if (ArrDelLights[key]->ShadowSM)
 	{
 		if (how == 0)
-			return ArrDelLights[key]->ShadowSM->GetIDArr(inid);
+			return ArrDelLights[key]->ShadowSM->getIDArr(inid);
 	}
 	else if (ArrDelLights[key]->ShadowCube)
 	{
 		if (how >= 0 && how < 6)
-			return ArrDelLights[key]->ShadowCube->GetIDArr(inid, how);
+			return ArrDelLights[key]->ShadowCube->getIDArr(inid, how);
 	}
 	else if (ArrDelLights[key]->ShadowPSSM)
 	{
 		if (how >= 0 && how < 5)
-			return ArrDelLights[key]->ShadowPSSM->GetIDArr(inid, how);
+			return ArrDelLights[key]->ShadowPSSM->getIDArr(inid, how);
 	}
 	return(-1);
 }
\ No newline at end of file
diff --git a/source/mtllight/light.h b/source/mtllight/light.h
index 5cf2ba1ce..2e63e57e7 100644
--- a/source/mtllight/light.h
+++ b/source/mtllight/light.h
@@ -135,7 +135,7 @@ public:
 
 	//-----------------------------------------------------------------------------
 
-	void initShaderOfTypeMaterial(ID id, int typemat, float4x4* wmat);
+	void initShaderOfTypeMaterial(ID id, int typemat, const float4x4* wmat);
 
 	//-----------------------------------------------------------------------------
 
diff --git "a/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp" "b/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp"
new file mode 100644
index 000000000..7a035cf3b
--- /dev/null
+++ "b/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.cpp"	
@@ -0,0 +1,2179 @@
+
+/***********************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
+See the license in LICENSE
+***********************************************************/
+
+#include "material.h"
+
+CMaterials::CMaterials()
+{
+	CurrFirstFree = -1;
+	m_uiCountTimeDelta = 0;
+	m_uiCurrTimeDelta = 0;
+	m_useForceblyAlphaTest = false;
+	SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs", "mtrlgeom_base.vs", SHADER_CHECKDOUBLE_PATH);
+	SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps", "mtrlgeom_base.ps", SHADER_CHECKDOUBLE_PATH);
+
+	SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs", "mtrlgreen_tree_base.vs", SHADER_CHECKDOUBLE_PATH);
+	SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs", "mtrlgreen_grass_base.vs", SHADER_CHECKDOUBLE_PATH);
+	SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps", "mtrlgreen_base.ps", SHADER_CHECKDOUBLE_PATH);
+
+	SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgeom_light.ps", "mtrlgeom_light.ps", SHADER_CHECKDOUBLE_PATH);
+
+	SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlskin_base.vs", "mtrlskin_base.vs", SHADER_CHECKDOUBLE_PATH);
+	SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlskin_base.ps", "mtrlskin_base.ps", SHADER_CHECKDOUBLE_PATH);
+
+	m_useCountSurface = false;
+	m_idCurrIdSurface = 0;
+
+	CUnitMaterial* tmpumtl = new CUnitMaterial();
+	CMaterial* tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_light";
+	tmpMtlDefaultLight->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+	tmpMtlDefaultLight->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_light.ps");
+
+	tmpMtlDefaultLight->m_oMainGraphics.m_idMainTexture = -1;
+	tmpMtlDefaultLight->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
+
+	MtrlDefLight = addUnitMaterial(tmpumtl);
+	addName(tmpMtlDefaultLight->m_sName.c_str(), MtrlDefLight);
+
+
+
+	tmpumtl = new CUnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_base";
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
+
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
+
+	MtrlDefStatic = addUnitMaterial(tmpumtl);
+	addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefStatic);
+
+
+	tmpumtl = new CUnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_tree";
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
+
+	MtrlDefTree = addUnitMaterial(tmpumtl);
+	addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefTree);
+
+
+	tmpumtl = new CUnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_grass";
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
+
+	MtrlDefGrass = addUnitMaterial(tmpumtl);
+	addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefGrass);
+
+
+	/*tmpumtl = new UnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	sprintf(tmpMtlDefaultLight->Name, "%s", "mtrldef_skin");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(0, "mtrlskin_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(1, "mtrlskin_base.ps");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
+
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
+
+	m_aUnitMtrls.push_back(tmpumtl);
+	AddName(tmpumtl->m_pMtrl->Name, m_aUnitMtrls.size() - 1);
+	MtrlDefSkin = m_aUnitMtrls.size() - 1;*/
+
+	BeginNonDef = m_aUnitMtrls.size();
+}
+
+CMaterials::~CMaterials()
+{
+	for (int i = 0; i < m_aMtrlPathes.size(); ++i)
+	{
+		for (int k = 0; k < m_aMtrlPathes[i]->m_aObjects.size(); ++k)
+		{
+			mem_delete(m_aMtrlPathes[i]->m_aObjects[k]);
+		}
+
+		mem_delete(m_aMtrlPathes[i]);
+	}
+
+	for (int i = 0; i < m_aUnitMtrls.size(); ++i)
+	{
+		mem_delete(m_aUnitMtrls[i]);
+	}
+
+	for (int i = 0; i < m_aMtrls.size(); ++i)
+	{
+		mem_delete(m_aMtrls[i]);
+	}
+}
+
+//**************************************************************************
+
+CMaterials::CMaterial::CMaterial()
+{
+	nulling();
+}
+
+void CMaterials::CMaterial::nulling()
+{
+	m_sName = "";
+	
+	m_isDelete = false;
+
+	m_oMainGraphics.m_idMainTexture = -1;
+	m_oMainGraphics.m_idShaderVS = -1;
+	m_oMainGraphics.m_idShaderPS = -1;
+	
+	m_oMicroDetail = CMaskDetailMicroRelief();
+	m_oLightParam = CLightParam();
+
+	m_oMainGraphics = CMainGraphics();
+
+	m_oPhysics = CPhysics();
+}
+
+CMaterials::CMaterial::~CMaterial()
+{
+	if (m_oMainGraphics.m_idMainTexture >= 0)
+		SGCore_LoadTexDelete(m_oMainGraphics.m_idMainTexture);
+
+	if (m_oLightParam.m_idTexParam >= 0)
+		SGCore_LoadTexDelete(m_oLightParam.m_idTexParam);
+
+	if (m_oLightParam.m_idTexParamHand >= 0)
+		SGCore_LoadTexDelete(m_oLightParam.m_idTexParamHand);
+
+	if (m_oMicroDetail.m_idMask >= 0)
+		SGCore_LoadTexDelete(m_oMicroDetail.m_idMask);
+
+	for (int i = 0; i < 4; ++i)
+	{
+		if (m_oMicroDetail.m_aDetail[i] >= 0)
+			SGCore_LoadTexDelete(m_oMicroDetail.m_aDetail[i]);
+
+		if (m_oMicroDetail.m_aMicroRelief[i] >= 0)
+			SGCore_LoadTexDelete(m_oMicroDetail.m_aMicroRelief[i]);
+	}
+}
+
+//**************************************************************************
+
+CMaterials::CMaterial::CMainGraphics::CMainGraphics()
+{
+	m_idMainTexture = -1;
+	m_idShaderVS = -1;
+	m_idShaderPS = -1;
+	m_isUnlit = false;
+	m_useAlphaTest = false;
+	type_model = MTLTYPE_MODEL::MTLTYPE_MODEL_DEFAULT;
+	m_oDataVS = CMainGraphics::СDataShader();
+	m_oDataPS = CMainGraphics::СDataShader();
+	m_oDataVS.m_isTransUserDataInOtherShader = false;
+	m_oDataPS.m_isTransUserDataInOtherShader = false;
+};
+
+CMaterials::CMaterial::CMainGraphics::~CMainGraphics()
+{
+
+};
+
+//**************************************************************************
+
+CMaterials::CMaterial::CMainGraphics::СDataShader::СDataShader()
+{
+	m_isTransWorld = false;
+	m_isTransView = false;
+	m_isTransProjection = false;
+	m_isTransWorldView = false;
+	m_isTransWorldViewProjection = false;
+	m_isTransPosCam = false;
+	m_isTransTimeDelta = false;
+	m_isTransUserData = false;
+	m_isTransWinSize = false;
+	m_vUserData = float4(0, 0, 0, 0);
+};
+
+CMaterials::CMaterial::CMainGraphics::СDataShader::~СDataShader()
+{
+
+};
+
+//**************************************************************************
+
+CMaterials::CMaterial::CLightParam::CLightParam()
+{
+	m_idTexParam = -1;
+	m_idTexParamHand = -1;
+
+	m_fRoughness = 0.f;
+	m_fF0 = 0.f;
+	m_fThickness = 1.f;
+	m_type_transparency = MTLTYPE_TRANSPARENCY_NONE;
+
+	m_type_reflect = MTLTYPE_REFLECT_NONE;
+	m_isTextureParam = true;
+}
+
+CMaterials::CMaterial::CLightParam::~CLightParam()
+{
+
+}
+
+//**************************************************************************
+
+CMaterials::CMaterial::CMaskDetailMicroRelief::CMaskDetailMicroRelief()
+{
+	m_idMask = -1;
+	m_aDetail[0] = -1;
+	m_aDetail[1] = -1;
+	m_aDetail[2] = -1;
+	m_aDetail[3] = -1;
+
+	m_aMicroRelief[0] = -1;
+	m_aMicroRelief[1] = -1;
+	m_aMicroRelief[2] = -1;
+	m_aMicroRelief[3] = -1;
+}
+
+CMaterials::CMaterial::CMaskDetailMicroRelief::~CMaskDetailMicroRelief()
+{
+
+}
+
+//**************************************************************************
+
+CMaterials::CMaterial::CPhysics::CPhysics()
+{
+	type_physics = MTLTYPE_PHYSIC_CONCRETE;
+
+	m_fDurability = 10.f;
+	m_fHitChance = 1.f;
+	m_fDensity = 1000;
+}
+
+CMaterials::CMaterial::CPhysics::~CPhysics()
+{
+
+}
+
+//**************************************************************************
+
+CMaterials::CUnitMaterial::CUnitMaterial()
+{
+	m_pMtrl = 0;
+	m_pReflect = 0;
+}
+
+CMaterials::CUnitMaterial::~CUnitMaterial()
+{
+	m_pMtrl->m_isDelete = true;
+	m_pReflect = 0;
+	//mem_delete(Reflect);
+}
+
+//##########################################################################
+
+ID CMaterials::exists(const char* name)
+{
+	char tmp_path[MTL_MAX_SIZE_DIR];//папка
+	char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением
+	int id = -1;
+	bool IsTruePath = false;
+	//обрезаем имя текстуры и папку
+	for (int i = 0; i<strlen(name); i++)
+	{
+		if (name[i] == '_')
+		{
+			memcpy(tmp_path, name, sizeof(char)*i);
+			tmp_path[i] = 0;
+			sprintf(tmp_name, "%s", name + i + 1);
+			IsTruePath = true;
+			break;
+		}
+	}
+
+	if (!IsTruePath)
+	{
+		return -2;
+		//LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", gen_msg_location, name);
+	}
+
+	int tmpkey = -1;	//переменная в которой храним ключ от массива в который записываем
+	for (int i = 0; i<m_aMtrlPathes.size(); ++i)
+	{
+		//TLPath* tmptlpath = m_aMtrlPathes[i];
+		if (m_aMtrlPathes[i] && strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), tmp_path) == 0)
+		{
+			tmpkey = i;
+			break;
+		}
+	}
+
+	//если мы не нашли совпадений значит путь уникален ...
+	if (tmpkey == -1)
+	{
+		return -1;
+	}
+
+	//проверяем записано ли уже имя текстуры
+	for (int i = 0; i<m_aMtrlPathes[tmpkey]->m_aObjects.size(); i++)
+	{
+		if (strcmp(m_aMtrlPathes[tmpkey]->m_aObjects[i]->m_sName.c_str(), tmp_name) == 0)
+		{
+			id = m_aMtrlPathes[tmpkey]->m_aObjects[i]->m_id;
+			break;
+		}
+	}
+
+	return id;
+}
+
+ID CMaterials::addUnitMaterial(CUnitMaterial* umtl)
+{
+	ID tmpid = -1;
+	if (CurrFirstFree + 1 == m_aUnitMtrls.size())
+	{
+		m_aUnitMtrls.push_back(umtl);
+		CurrFirstFree = tmpid = m_aUnitMtrls.size() - 1;
+	}
+	else
+	{
+		if (CurrFirstFree < 0 || m_aUnitMtrls[CurrFirstFree] != 0)
+		{
+			if (CurrFirstFree < 0)
+				CurrFirstFree = 0;
+
+			for (int i = CurrFirstFree; i < m_aUnitMtrls.size(); ++i)
+			{
+				if (m_aUnitMtrls[i] == 0)
+				{
+					CurrFirstFree = i;
+					break;
+				}
+			}
+		}
+
+		m_aUnitMtrls[CurrFirstFree] = umtl;
+		tmpid = CurrFirstFree;
+		++CurrFirstFree;
+	}
+
+	return tmpid;
+}
+
+ID CMaterials::addMaterial(CMaterial* mtl)
+{
+	m_aMtrls.push_back(mtl);
+	return m_aMtrls.size() - 1;
+}
+
+void CMaterials::addName(const char *szName, ID id)
+{
+	/*char tmp_path[MTL_MAX_SIZE_DIR];//папка
+	char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением
+
+	bool IsTruePath = false;
+	//обрезаем имя текстуры и папку
+	for (int i = 0; i<strlen(name); i++)
+	{
+		if (name[i] == '_')
+		{
+			memcpy(tmp_path, name, sizeof(char)*i);
+			tmp_path[i] = 0;
+			sprintf(tmp_name, "%s", name + i + 1);
+			IsTruePath = true;
+			break;
+		}
+	}*/
+
+	String sDir = StrSubstrSpre(szName, "_");
+	String sName = StrSubstrSpost(szName, "_");
+
+	int tmpkey = -1;	//переменная в которой храним ключ от массива в который записываем
+	for (int i = 0; i<m_aMtrlPathes.size(); ++i)
+	{
+		if (m_aMtrlPathes[i] && strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), sDir.c_str()) == 0)
+		{
+			tmpkey = i;
+			break;
+		}
+	}
+
+	//если мы не нашли совпадений значит путь уникален ...
+	if (tmpkey == -1)
+	{
+		tmpkey = m_aMtrlPathes.size();
+		CPath* tmpntlp = new CPath();
+		m_aMtrlPathes.push_back(tmpntlp);
+		m_aMtrlPathes[tmpkey]->m_sPath = sDir;
+	}
+
+	m_aMtrlPathes[tmpkey]->m_aObjects.push_back(new CPath::CObject(id, sName.c_str()));
+}
+
+bool CMaterials::loadMtl(const char* name, CMaterial** mtl)
+{
+	char* ArrRGBA[4] = { "r", "g", "b", "a" };
+
+	char tmpVS[256];
+	char tmpPS[256];
+
+	char tmpMask[256];
+	char tmpMicroDiff[4][256];
+	char tmpDetail[4][256];
+
+	char tmpParamLigth[256];
+
+	char tmp_path[256];//папка
+	char tmp_name[256];//само им¤ текстыр с расширением
+
+	bool IsTruePath = false;
+	//обрезаем им¤ текстуры и папку
+	for (int k = 0; k< strlen(name); k++)
+	{
+		if (name[k] == '_')
+		{
+			memcpy(tmp_path, name, sizeof(char)*k);
+			tmp_path[k] = 0;
+			sprintf(tmp_name, "%s", name + k + 1);
+			IsTruePath = true;
+			break;
+		}
+	}
+
+	char path[1024];
+
+	for (DWORD k = 0; k<strlen(name); k++)
+	{
+		if (name[k] == '.')
+		{
+			sprintf(tmp_name, "%s", name);
+			tmp_name[k] = 0;
+			IsTruePath = true;
+			break;
+		}
+	}
+
+	CMaterial* tmpMtl = *mtl;
+
+	sprintf(path, "%s%s\\%s.mtl", Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS), tmp_path, tmp_name);
+	if (FileExistsFile(path))
+	{
+		ISXConfig* config = Core_OpConfig(path);
+
+		//если в конфиге указана текстура то берем ее
+		if (config->keyExists(tmp_name, "texture"))
+			tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(config->getKey(tmp_name, "texture"), LOAD_TEXTURE_TYPE_LOAD);
+		else //если нет то тогда берем имя материала, может быть он имя текстуры, иначе будет -1
+			tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD);
+
+		tmpMtl->m_sName = tmp_name;
+
+		tmpVS[0] = 0;
+		if (config->keyExists(tmp_name, "vs"))
+			sprintf(tmpVS, "%s", config->getKey(tmp_name, "vs"));
+
+		tmpPS[0] = 0;
+		if (config->keyExists(tmp_name, "ps"))
+			sprintf(tmpPS, "%s", config->getKey(tmp_name, "ps"));
+
+
+		if (config->keyExists(tmp_name, "is_unlit"))
+			tmpMtl->m_oMainGraphics.m_isUnlit = String(config->getKey(tmp_name, "is_unlit")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_isUnlit = false;
+
+		if (config->keyExists(tmp_name, "type"))
+			tmpMtl->m_oMainGraphics.type_model = (MTLTYPE_MODEL)String(config->getKey(tmp_name, "type")).toInt();
+		else
+			tmpMtl->m_oMainGraphics.type_model = MTLTYPE_MODEL_DEFAULT;
+
+		if (config->keyExists(tmp_name, "physmaterial"))
+			tmpMtl->m_oPhysics.type_physics = (MTLTYPE_PHYSIC)String(config->getKey(tmp_name, "physmaterial")).toInt();
+		else
+			tmpMtl->m_oPhysics.type_physics = MTLTYPE_PHYSIC_DEFAULT;
+
+
+		if (STR_VALIDATE(tmpVS))
+			tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, tmpVS, tmpVS, SHADER_CHECKDOUBLE_PATH);
+		else
+			tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+
+		if (STR_VALIDATE(tmpPS))
+			tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, tmpPS, tmpPS, SHADER_CHECKDOUBLE_PATH);
+		else
+			tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
+
+		tmpMicroDiff[0][0] = 0;
+		if (config->keyExists(tmp_name, "mirco_diff_r"))
+			sprintf(tmpMicroDiff[0], "%s", config->getKey(tmp_name, "mirco_diff_r"));
+
+		if (tmpMicroDiff[0][0] != '0' && tmpMicroDiff[0][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[0] = SGCore_LoadTexAddName(tmpMicroDiff[0], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[0] = -1;
+
+		tmpMicroDiff[1][0] = 0;
+		if (config->keyExists(tmp_name, "mirco_diff_g"))
+			sprintf(tmpMicroDiff[1], "%s", config->getKey(tmp_name, "mirco_diff_g"));
+		if (tmpMicroDiff[1][0] != '0' && tmpMicroDiff[1][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[1] = SGCore_LoadTexAddName(tmpMicroDiff[1], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[1] = -1;
+
+		tmpMicroDiff[2][0] = 0;
+		if (config->keyExists(tmp_name, "mirco_diff_b"))
+			sprintf(tmpMicroDiff[2], "%s", config->getKey(tmp_name, "mirco_diff_b"));
+		if (tmpMicroDiff[2][0] != '0' && tmpMicroDiff[2][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[2] = SGCore_LoadTexAddName(tmpMicroDiff[2], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[2] = -1;
+
+		tmpMicroDiff[3][0] = 0;
+		if (config->keyExists(tmp_name, "mirco_diff_a"))
+			sprintf(tmpMicroDiff[3], "%s", config->getKey(tmp_name, "mirco_diff_a"));
+		if (tmpMicroDiff[3][0] != '0' && tmpMicroDiff[3][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[3] = SGCore_LoadTexAddName(tmpMicroDiff[3], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[3] = -1;
+
+
+		tmpDetail[0][0] = 0;
+		if (config->keyExists(tmp_name, "detail_r"))
+			sprintf(tmpDetail[0], "%s", config->getKey(tmp_name, "detail_r"));
+		if (tmpDetail[0][0] != '0' && tmpMicroDiff[0][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[0] = SGCore_LoadTexAddName(tmpDetail[0], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[0] = -1;
+
+		tmpDetail[1][0] = 0;
+		if (config->keyExists(tmp_name, "detail_g"))
+			sprintf(tmpDetail[1], "%s", config->getKey(tmp_name, "detail_g"));
+		if (tmpDetail[1][0] != '0' && tmpMicroDiff[1][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[1] = SGCore_LoadTexAddName(tmpDetail[1], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[1] = -1;
+
+		tmpDetail[2][0] = 0;
+		if (config->keyExists(tmp_name, "detail_b"))
+			sprintf(tmpDetail[2], "%s", config->getKey(tmp_name, "detail_b"));
+		if (tmpDetail[2][0] != '0' && tmpMicroDiff[2][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[2] = SGCore_LoadTexAddName(tmpDetail[2], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[2] = -1;
+
+		tmpDetail[3][0] = 0;
+		if (config->keyExists(tmp_name, "detail_a"))
+			sprintf(tmpDetail[3], "%s", config->getKey(tmp_name, "detail_a"));
+		if (tmpDetail[3][0] != '0' && tmpMicroDiff[3][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[3] = SGCore_LoadTexAddName(tmpDetail[3], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[3] = -1;
+
+		tmpMask[0] = 0;
+		if (config->keyExists(tmp_name, "mask"))
+			sprintf(tmpMask, "%s", config->getKey(tmp_name, "mask"));
+		if (tmpMask[0] != '0' && tmpMask[0] != 0)
+			tmpMtl->m_oMicroDetail.m_idMask = SGCore_LoadTexAddName(tmpMask, LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_idMask = -1;
+
+
+		tmpMtl->m_oLightParam.m_fRoughness = MTL_LIGHTING_DEFAULT_ROUGHNESS;
+		tmpMtl->m_oLightParam.m_fF0 = MTL_LIGHTING_DEFAULT_F0;
+		tmpMtl->m_oLightParam.m_fThickness = MTL_LIGHTING_DEFAULT_THICKNESS;
+
+		if (config->keyExists(tmp_name, "roughness"))
+			tmpMtl->m_oLightParam.m_fRoughness = String(config->getKey(tmp_name, "roughness")).toDouble();
+
+		if (config->keyExists(tmp_name, "f0"))
+			tmpMtl->m_oLightParam.m_fF0 = String(config->getKey(tmp_name, "f0")).toDouble();
+
+		if (config->keyExists(tmp_name, "thickness"))
+			tmpMtl->m_oLightParam.m_fThickness = String(config->getKey(tmp_name, "thickness")).toDouble();
+
+		if (config->keyExists(tmp_name, "penetration"))
+			tmpMtl->m_oPhysics.m_fDurability = String(config->getKey(tmp_name, "penetration")).toDouble();
+
+		if (config->keyExists(tmp_name, "hit_chance"))
+			tmpMtl->m_oPhysics.m_fHitChance = String(config->getKey(tmp_name, "hit_chance")).toDouble();
+
+		if (config->keyExists(tmp_name, "density"))
+			tmpMtl->m_oPhysics.m_fDensity = String(config->getKey(tmp_name, "density")).toDouble();
+
+		tmpMtl->m_oLightParam.m_idTexParamHand = createTexParamLighting(tmpMtl->m_oLightParam.m_fRoughness, tmpMtl->m_oLightParam.m_fF0, tmpMtl->m_oLightParam.m_fThickness);
+
+		//говорим что не установлено использовать ли текстуру или нет
+		int istexparam = -1;
+
+		//если есть ключ использования текстуры то грузим
+		if (config->keyExists(tmp_name, "is_texture_param"))
+			istexparam = String(config->getKey(tmp_name, "is_texture_param")).toBool();
+
+		tmpParamLigth[0] = 0;
+		if (config->keyExists(tmp_name, "param_ligth"))
+			sprintf(tmpParamLigth, "%s", config->getKey(tmp_name, "param_ligth"));
+
+		//если текстура с параметрами освещения была определена
+		if (tmpParamLigth[0] != '0' && tmpParamLigth[0] != 0)
+		{
+			tmpMtl->m_oLightParam.m_idTexParam = SGCore_LoadTexAddName(tmpParamLigth, LOAD_TEXTURE_TYPE_LOAD);
+			//если использование параметров освещения из текстуры не было определено
+			if (istexparam == -1)
+				tmpMtl->m_oLightParam.m_isTextureParam = true;
+			else
+				tmpMtl->m_oLightParam.m_isTextureParam = istexparam;
+		}
+		//если использование параметров освещения из текстуры не было определено
+		else if (istexparam == -1)
+		{
+			tmpMtl->m_oLightParam.m_isTextureParam = false;
+		}
+
+
+		if (config->keyExists(tmp_name, "refraction"))
+			tmpMtl->m_oLightParam.m_type_transparency = (MTLTYPE_TRANSPARENCY)String(config->getKey(tmp_name, "refraction")).toInt();
+		else
+			tmpMtl->m_oLightParam.m_type_transparency = MTLTYPE_TRANSPARENCY_NONE;
+
+
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransView = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransProjection =
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransPosCam =
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserData = false;
+
+		if (config->keyExists(tmp_name, "vs_world"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = String(config->getKey(tmp_name, "vs_world")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_view"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransView = String(config->getKey(tmp_name, "vs_view")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_projection"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransProjection = String(config->getKey(tmp_name, "vs_projection")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_worldview"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = String(config->getKey(tmp_name, "vs_worldview")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_worldviewprojection"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = String(config->getKey(tmp_name, "vs_worldviewprojection")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_poscam"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = String(config->getKey(tmp_name, "vs_poscam")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_timedelta"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = String(config->getKey(tmp_name, "vs_timedelta")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_winsize"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = String(config->getKey(tmp_name, "vs_winsize")).toInt();
+
+		if (config->keyExists(tmp_name, "vs_userdata"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserData = String(config->getKey(tmp_name, "vs_userdata")).toInt();
+
+
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData = float4(0, 0, 0, 0);
+		if (config->keyExists(tmp_name, "vs_userdata_value_x"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.x = String(config->getKey(tmp_name, "vs_userdata_value_x")).toDouble();
+
+		if (config->keyExists(tmp_name, "vs_userdata_value_y"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.y = String(config->getKey(tmp_name, "vs_userdata_value_y")).toDouble();
+
+		if (config->keyExists(tmp_name, "vs_userdata_value_z"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.z = String(config->getKey(tmp_name, "vs_userdata_value_z")).toDouble();
+
+		if (config->keyExists(tmp_name, "vs_userdata_value_w"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.w = String(config->getKey(tmp_name, "vs_userdata_value_w")).toDouble();
+
+		if (config->keyExists(tmp_name, "vs_userdata_trans_in_ps"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = String(config->getKey(tmp_name, "vs_userdata_trans_in_ps")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = false;
+
+
+		tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorld = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransView = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransProjection =
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransPosCam =
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = false;
+
+		if (config->keyExists(tmp_name, "ps_world"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorld = String(config->getKey(tmp_name, "ps_world")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_view"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransView = String(config->getKey(tmp_name, "ps_view")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_projection"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransProjection = String(config->getKey(tmp_name, "ps_projection")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_worldview"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = String(config->getKey(tmp_name, "ps_worldview")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_worldviewprojection"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = String(config->getKey(tmp_name, "ps_worldviewprojection")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_poscam"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = String(config->getKey(tmp_name, "ps_poscam")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_timedelta"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = String(config->getKey(tmp_name, "ps_timedelta")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_winsize"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = String(config->getKey(tmp_name, "ps_winsize")).toInt();
+
+		if (config->keyExists(tmp_name, "ps_userdata"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = String(config->getKey(tmp_name, "ps_userdata")).toInt();
+
+		tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0);
+
+		if (config->keyExists(tmp_name, "ps_userdata_value_x"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.x = String(config->getKey(tmp_name, "ps_userdata_value_x")).toDouble();
+
+		if (config->keyExists(tmp_name, "ps_userdata_value_y"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.y = String(config->getKey(tmp_name, "ps_userdata_value_y")).toDouble();
+
+		if (config->keyExists(tmp_name, "ps_userdata_value_z"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.z = String(config->getKey(tmp_name, "ps_userdata_value_z")).toDouble();
+
+		if (config->keyExists(tmp_name, "ps_userdata_value_w"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.w = String(config->getKey(tmp_name, "ps_userdata_value_w")).toDouble();
+
+		if (config->keyExists(tmp_name, "ps_userdata_trans_in_vs"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = String(config->getKey(tmp_name, "ps_userdata_trans_in_vs")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = false;
+
+		if (config->keyExists(tmp_name, "type_reflect"))
+			tmpMtl->m_oLightParam.m_type_reflect = (MTLTYPE_REFLECT)String(config->getKey(tmp_name, "type_reflect")).toInt();
+
+		if (config->keyExists(tmp_name, "alpha_test"))
+			tmpMtl->m_oMainGraphics.m_useAlphaTest = String(config->getKey(tmp_name, "alpha_test")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_useAlphaTest = false;
+
+		return true;
+	}
+
+	return false;
+}
+
+ID CMaterials::createTexParamLighting(float roughness, float f0, float thickness)
+{
+	IDirect3DTexture9* TexMaterial;
+	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &TexMaterial, NULL);
+	D3DLOCKED_RECT LockedRect;
+	uint32_t tmpColor = D3DCOLOR_ARGB(0, DWORD(roughness*255.f), DWORD(f0*255.f), DWORD(thickness*255.f));
+
+	TexMaterial->LockRect(0, &LockedRect, 0, 0);
+
+	uint32_t* tmpOldColor = (uint32_t*)LockedRect.pBits + 0 * LockedRect.Pitch + 0 * sizeof(uint32_t);
+	memcpy(tmpOldColor, &tmpColor, sizeof(uint32_t));
+
+	TexMaterial->UnlockRect(0);
+
+	//SGCore_LoadTexLoadTextures();
+
+	char nametex[64];
+	sprintf(nametex, "%c_%d_%d_%d", MTL_VIRTUAL_DIR_HAND_MTL, m_aUnitMtrls.size(), rand() % 9999, rand() % 9999);
+
+	return SGCore_LoadTexCreate(nametex, TexMaterial);
+}
+
+void CMaterials::createMtl(const char* name, CMaterial** mtl, MTLTYPE_MODEL type)
+{
+	CMaterial* tmpMtl = *mtl;
+	new(tmpMtl)CMaterial*;
+	//если такого материала не существует, то мы должны были задать примерный тип материала
+	tmpMtl->m_oMainGraphics.type_model = type;
+	//обычна¤ геометри¤
+	if (type == MTLTYPE_MODEL_STATIC)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
+	}
+	//деревь¤
+	else if (type == MTLTYPE_MODEL_TREE)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+		//tmpMtl->RenderStates.m_oMainGraphics.m_useAlphaTest = true;
+	}
+	//трава
+	else if (type == MTLTYPE_MODEL_GRASS)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+		//tmpMtl->RenderStates.m_oMainGraphics.m_useAlphaTest = true;
+	}
+	//анимационная модель
+	else if (type == MTLTYPE_MODEL_SKIN)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlskin_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlskin_base.ps");
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
+	}
+	//источник света
+	/*else if (type == MTL_LIGHT)
+	{
+	tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(0, "mtrlgeom_base.vs");
+	tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(1, "mtrlgeom_light.ps");
+	tmpMtl->IsForwardRender = true;
+	tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = true;
+	tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0);
+	}*/
+
+	tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD);
+	tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
+
+	tmpMtl->m_oLightParam.m_fRoughness = MTL_LIGHTING_DEFAULT_ROUGHNESS;
+	tmpMtl->m_oLightParam.m_fF0 = MTL_LIGHTING_DEFAULT_F0;
+	tmpMtl->m_oLightParam.m_fThickness = MTL_LIGHTING_DEFAULT_THICKNESS;
+
+	tmpMtl->m_oLightParam.m_idTexParam = -1;
+	tmpMtl->m_oLightParam.m_isTextureParam = false;
+	tmpMtl->m_oLightParam.m_idTexParamHand = createTexParamLighting(tmpMtl->m_oLightParam.m_fRoughness, tmpMtl->m_oLightParam.m_fF0, tmpMtl->m_oLightParam.m_fThickness);
+
+	//char path[1024];
+	char tmp_name[256];
+	bool IsTruePath = false;
+
+	for (DWORD k = 0; k<strlen(name); k++)
+	{
+		if (name[k] == '.')
+		{
+			sprintf(tmp_name, "%s", name);
+			tmp_name[k] = 0;
+			IsTruePath = true;
+			break;
+		}
+	}
+
+	tmpMtl->m_sName = tmp_name;
+}
+
+ID CMaterials::mtlLoad(const char* name, MTLTYPE_MODEL type)
+{
+	ID IsLoad = exists(name);
+
+	if (IsLoad >= 0)
+	{
+		CUnitMaterial* tmpumtl = new CUnitMaterial();
+		tmpumtl->m_pMtrl = m_aUnitMtrls[IsLoad]->m_pMtrl;
+
+		if (m_aUnitMtrls[IsLoad]->m_pReflect){
+			CUnitMaterial* tmpmtl = m_aUnitMtrls[IsLoad];
+			tmpumtl->m_pReflect = new CReflection();
+			tmpumtl->m_pReflect->init(m_aUnitMtrls[IsLoad]->m_pReflect->getTypeReflect());
+		}
+
+		return addUnitMaterial(tmpumtl);
+	}
+	else
+	{
+		CUnitMaterial* tmpumtl = new CUnitMaterial();
+		tmpumtl->m_pMtrl = new CMaterial();
+		addMaterial(tmpumtl->m_pMtrl);
+		if (!loadMtl(name, &(tmpumtl->m_pMtrl)))
+		{
+			createMtl(name, &(tmpumtl->m_pMtrl), type);
+		}
+		else
+		{
+			if (tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE)
+			{
+				tmpumtl->m_pReflect = new CReflection();
+				tmpumtl->m_pReflect->init(tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect);
+			}
+		}
+
+		ID tmpid = addUnitMaterial(tmpumtl);
+
+		addName(name, tmpid);
+		return tmpid;
+	}
+}
+
+void CMaterials::mtlReLoad(ID id, const char* name)
+{
+	MTL_PRE_COND_ID(id);
+	CUnitMaterial* tmpumtl = m_aUnitMtrls[id];
+	char tmpname[1024];
+	if (name == 0)
+		sprintf(tmpname, "%s.dds", tmpumtl->m_pMtrl->m_sName.c_str());
+	else
+		sprintf(tmpname, "%s", name);
+
+	tmpumtl->m_pMtrl->nulling();
+	if (!loadMtl(tmpname, &(tmpumtl->m_pMtrl)))
+	{
+		createMtl(name, &(tmpumtl->m_pMtrl), tmpumtl->m_pMtrl->m_oMainGraphics.type_model);
+	}
+	else
+	{
+		if (tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE)
+		{
+			tmpumtl->m_pReflect = new CReflection();
+			tmpumtl->m_pReflect->init(tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect);
+		}
+	}
+}
+
+void CMaterials::mtlSave(ID id)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+
+	char* ArrRGBA[4] = { "r", "g", "b", "a" };
+
+	CMaterial* mtrl = m_aUnitMtrls[id]->m_pMtrl;
+
+	String sDir = StrSubstrSpre(mtrl->m_sName.c_str(), "_");
+	String sPath = String(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS)) + sDir + "/";
+
+	FileCreateDir(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS));
+	FileCreateDir(sPath.c_str());
+	sPath += FileSetStrExt(mtrl->m_sName.c_str(), ".mtl");
+
+	FILE* file = 0;
+	file = fopen(sPath.c_str(), "w");
+
+	fprintf(file, "[%s]\n", mtrl->m_sName.c_str());
+
+	char tmpPathVSName[1024];
+	char tmpPathPSName[1024];
+
+	char tmpPathMaskName[1024];
+
+	SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, mtrl->m_oMainGraphics.m_idShaderVS, tmpPathVSName);
+	SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, mtrl->m_oMainGraphics.m_idShaderPS, tmpPathPSName);
+
+	fprintf(file, "type = %d\n", mtrl->m_oMainGraphics.type_model);
+	fprintf(file, "is_unlit = %d\n", mtrl->m_oMainGraphics.m_isUnlit);
+	fprintf(file, "%s%d%s", "physmaterial = ", mtrl->m_oPhysics.type_physics, "\n");
+
+	fprintf(file, "%s%s%s", "vs = ", tmpPathVSName, "\n");
+	fprintf(file, "%s%s%s", "ps = ", tmpPathPSName, "\n");
+
+	fprintf(file, "%s%d%s", "alpha_test = ", mtrl->m_oMainGraphics.m_useAlphaTest, "\n");
+
+	char namebasetex[256];
+	namebasetex[0] = '0';
+	namebasetex[1] = '\0';
+	SGCore_LoadTexGetName(mtrl->m_oMainGraphics.m_idMainTexture, namebasetex);
+	fprintf(file, "%s%s%s", "texture = ", namebasetex, "\n");
+
+	if (mtrl->m_oMicroDetail.m_idMask == -1)
+	{
+		tmpPathMaskName[0] = '0';
+		tmpPathMaskName[1] = 0;
+	}
+	else
+		SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_idMask, tmpPathMaskName);
+
+	fprintf(file, "%s%s%s", "mask = ", tmpPathMaskName, "\n");
+
+	for (int k = 0; k<4; k++)
+	{
+		if (mtrl->m_oMicroDetail.m_aMicroRelief[k] == -1)
+		{
+			tmpPathMaskName[0] = '0';
+			tmpPathMaskName[1] = 0;
+		}
+		else
+			SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_aMicroRelief[k], tmpPathMaskName);
+
+		fprintf(file, "mirco_diff_%s = %s\n", ArrRGBA[k], tmpPathMaskName);
+	}
+
+	for (int k = 0; k<4; k++)
+	{
+		if (mtrl->m_oMicroDetail.m_aDetail[k] == -1)
+		{
+			tmpPathMaskName[0] = '0';
+			tmpPathMaskName[1] = 0;
+		}
+		else
+			SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_aDetail[k], tmpPathMaskName);
+
+		fprintf(file, "detail_%s = %s\n", ArrRGBA[k], tmpPathMaskName);
+	}
+
+	if (mtrl->m_oLightParam.m_idTexParam == -1)
+	{
+		tmpPathMaskName[0] = '0';
+		tmpPathMaskName[1] = 0;
+	}
+	else
+		SGCore_LoadTexGetName(mtrl->m_oLightParam.m_idTexParam, tmpPathMaskName);
+
+	if (tmpPathMaskName[0] == MTL_VIRTUAL_DIR_HAND_MTL)
+		sprintf(tmpPathMaskName, "0");
+	else
+		fprintf(file, "is_texture_param = %d\n", mtrl->m_oLightParam.m_isTextureParam);
+
+	fprintf(file, "param_ligth = %s\n", tmpPathMaskName);
+
+	fprintf(file, "roughness = %f\n", mtrl->m_oLightParam.m_fRoughness);
+	fprintf(file, "f0 = %f\n", mtrl->m_oLightParam.m_fF0);
+	fprintf(file, "thickness = %f\n", mtrl->m_oLightParam.m_fThickness);
+	fprintf(file, "penetration = %f\n", mtrl->m_oPhysics.m_fDurability);
+	fprintf(file, "hit_chance = %f\n", mtrl->m_oPhysics.m_fHitChance);
+	fprintf(file, "density = %f\n", mtrl->m_oPhysics.m_fDensity);
+
+	fprintf(file, "refraction = %d\n", mtrl->m_oLightParam.m_type_transparency);
+
+	fprintf(file, "vs_world = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld);
+	fprintf(file, "vs_view = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransView);
+	fprintf(file, "vs_projection = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection);
+	fprintf(file, "vs_worldview = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView);
+	fprintf(file, "vs_worldviewprojection = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection);
+
+	fprintf(file, "vs_poscam = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam);
+	fprintf(file, "vs_timedelta = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta);
+	fprintf(file, "vs_winsize = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize);
+	fprintf(file, "vs_userdata = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData);
+	fprintf(file, "vs_userdata_value_x = %f\nvs_userdata_value_y = %f\nvs_userdata_value_z = %f\nvs_userdata_value_w = %f\n", mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.x, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.y, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.z, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.w);
+	fprintf(file, "vs_userdata_trans_in_ps = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader);
+
+	fprintf(file, "ps_world = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld);
+	fprintf(file, "ps_view = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransView);
+	fprintf(file, "ps_projection = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection);
+	fprintf(file, "ps_worldview = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView);
+	fprintf(file, "ps_worldviewprojection = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection);
+
+	fprintf(file, "ps_poscam = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam);
+	fprintf(file, "ps_timedelta = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta);
+	fprintf(file, "ps_winsize = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize);
+	fprintf(file, "ps_userdata = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData);
+	fprintf(file, "ps_userdata_value_x = %f\nps_userdata_value_y = %f\nps_userdata_value_z = %f\nps_userdata_value_w = %f\n", mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.x, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.y, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.z, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.w);
+	fprintf(file, "ps_userdata_trans_in_vs = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader);
+
+	fprintf(file, "type_reflect = %d\n", mtrl->m_oLightParam.m_type_reflect);
+
+	fprintf(file, "\n");
+	fclose(file);
+}
+
+//##########################################################################
+
+int CMaterials::delRefCount()
+{
+	return m_aReflections.size();
+}
+
+ID CMaterials::delRefGetIDArr(ID key, ID inid, int cube)
+{
+	if (!(key >= 0 && key < m_aReflections.size()))
+		return -1;
+
+	return m_aReflections[key]->getIDArr(inid, cube);
+}
+
+void CMaterials::delRefAllDel()
+{
+	for (int i = 0; i < m_aReflections.size(); ++i)
+	{
+		mem_delete(m_aReflections[i]);
+	}
+
+	m_aReflections.clear();
+}
+
+//##########################################################################
+
+void CMaterials::clear(bool isClearRefDel)
+{
+	int tmpcountdel = 0;
+	
+	for (int i = 0; i < m_aMtrlPathes.size(); ++i)
+	{
+		if (strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), MTL_VIRTUAL_DIR_STD_MTL) != 0)
+		{
+			for (int k = 0; k < m_aMtrlPathes[i]->m_aObjects.size(); ++k)
+			{
+				mem_delete(m_aMtrlPathes[i]->m_aObjects[k]);
+				m_aMtrlPathes[i]->m_aObjects.erase(k);
+				--k;
+				++tmpcountdel;
+			}
+
+			if (m_aMtrlPathes.size() <= 0)
+			{
+				mem_delete(m_aMtrlPathes[i]);
+				m_aMtrlPathes.erase(i);
+				--i;
+			}
+		}
+	}
+
+	tmpcountdel = 0;
+
+	for (int i = BeginNonDef; i < m_aUnitMtrls.size(); ++i)
+	{
+		//если есть отражения, то записываем в очередь на удаление
+		if (m_aUnitMtrls[i]->m_pReflect)
+			m_aReflections.push_back(m_aUnitMtrls[i]->m_pReflect);
+
+		mem_delete(m_aUnitMtrls[i]);
+		++tmpcountdel;
+	}
+
+	CurrFirstFree = BeginNonDef;
+
+	tmpcountdel = 0;
+
+	for (int i = 0; i < m_aMtrls.size(); ++i)
+	{
+		if (m_aMtrls[i]->m_isDelete)
+		{
+			mem_delete(m_aMtrls[i]);
+			m_aMtrls.erase(i);
+			--i;
+			++tmpcountdel;
+		}
+	}
+
+	if (isClearRefDel)
+		delRefAllDel();
+}
+
+//##########################################################################
+
+void CMaterials::onLostDevice()
+{
+	for (int i = 0; i < m_aUnitMtrls.size(); ++i)
+	{
+		if (m_aUnitMtrls[i] && m_aUnitMtrls[i]->m_pReflect)
+			m_aUnitMtrls[i]->m_pReflect->onLostDevice();
+	}
+}
+
+void CMaterials::onResetDevice()
+{
+	for (int i = 0; i < m_aUnitMtrls.size(); ++i)
+	{
+		if (m_aUnitMtrls[i] && m_aUnitMtrls[i]->m_pReflect)
+			m_aUnitMtrls[i]->m_pReflect->onResetDevice();
+	}
+}
+
+//##########################################################################
+
+ID CMaterials::getStdMtl(MTLTYPE_MODEL type_model)
+{
+	if (type_model == MTLTYPE_MODEL_STATIC)
+	{
+		return MtrlDefStatic;
+	}
+	else if (type_model == MTLTYPE_MODEL_GRASS)
+	{
+		return MtrlDefGrass;
+	}
+	else if (type_model == MTLTYPE_MODEL_TREE)
+	{
+		return MtrlDefTree;
+	}
+	else if (type_model == MTLTYPE_MODEL_SKIN)
+	{
+		return MtrlDefSkin;
+	}
+	return(-1);
+}
+
+MTLTYPE_MODEL CMaterials::getTypeModel(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_MODEL_STATIC);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.type_model;
+}
+
+void CMaterials::setTypeModel(ID id, MTLTYPE_MODEL type_model)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.type_model = type_model;
+}
+
+void CMaterials::update(UINT timeDelta)
+{
+	m_uiCurrTimeDelta = timeDelta;
+	m_uiCountTimeDelta += timeDelta;
+}
+
+void CMaterials::setMainTexture(ID slot, ID id)
+{
+	if (id >= 0 && id < m_aUnitMtrls.size() && m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture != -1)
+		MLSet::DXDevice->SetTexture(slot, SGCore_LoadTexGetTex(m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture));
+	else
+		MLSet::DXDevice->SetTexture(slot, 0);
+}
+
+ID CMaterials::getID(const char* name)
+{
+	for (int i = 0; i < m_aUnitMtrls.size(); i++)
+	{
+		if (strcmp(m_aUnitMtrls[i]->m_pMtrl->m_sName.c_str(), name) == 0)
+			return i;
+	}
+	return -1;
+}
+
+int CMaterials::getCount()
+{
+	return m_aUnitMtrls.size();
+}
+
+
+void CMaterials::setForceblyAlphaTest(bool isat)
+{
+	m_useForceblyAlphaTest = isat;
+	if (!isat)
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+}
+
+bool CMaterials::getForceblyAlphaTest()
+{
+	return m_useForceblyAlphaTest;
+}
+
+//##########################################################################
+
+bool CMaterials::mtlGetUsingAlphaTest(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_useAlphaTest;
+}
+
+void CMaterials::mtlSetUsingAlphaTest(ID id, bool is_using)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_useAlphaTest = is_using;
+}
+
+MTLTYPE_REFLECT CMaterials::mtlTypeReflection(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect;
+}
+
+//**************************************************************************
+
+void CMaterials::mtlRefSetIDArr(ID id, ID inid, int cube, ID idarr)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->setIDArr(inid, cube, idarr);
+}
+
+ID CMaterials::mtlRefGetIDArr(ID id, ID inid, int cube)
+{
+	MTL_REF_PRE_COND_ID(id,- 1);
+	return m_aUnitMtrls[id]->m_pReflect->getIDArr(inid, cube);
+}
+
+/*void CMaterials::mtlRefSetPlane(ID id, D3DXPLANE* plane)
+{
+	MTL_REF_PRE_COND_ID(id);
+	m_aUnitMtrls[id]->m_pReflect->Plane = *plane;
+}*/
+
+/*void CMaterials::mtlRefSetCenter(ID id, float3_t* center)
+{
+	MTL_REF_PRE_COND_ID(id);
+	m_aUnitMtrls[id]->m_pReflect->Position = *center;
+}*/
+
+void CMaterials::mtlRefPreRenderPlane(ID id, D3DXPLANE* plane)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->preRenderRefPlane(plane);
+}
+
+const IFrustum* CMaterials::mtlRefGetfrustum(ID id, int cube)
+{
+	MTL_REF_PRE_COND_ID(id, 0);
+	if (cube == 0 || (cube > 0 && (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC)))
+		return m_aUnitMtrls[id]->m_pReflect->getFrustum(cube);
+	return 0;
+}
+
+void CMaterials::mtlRefPostRenderPlane(ID id)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->postRenderRefPlane();
+}
+
+IDirect3DTexture9* CMaterials::mtlRefPlaneGetTex(ID id)
+{
+ 	MTL_REF_PRE_COND_ID(id, 0);
+	return m_aUnitMtrls[id]->m_pReflect->getRefPlaneTex();
+}
+
+
+void CMaterials::mtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->setMinMax(pMin, pMax);
+}
+
+bool CMaterials::mtlRefIsAllowedRender(ID  id)
+{
+	MTL_REF_PRE_COND_ID(id, false);
+	if (m_aUnitMtrls[id]->m_pReflect)
+		return m_aUnitMtrls[id]->m_pReflect->allowedRender();
+
+	return false;
+}
+
+
+void CMaterials::mtlRefCubeBeginRender(ID id, const float3_t *pCenter)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->beginRenderRefCube(pCenter);
+}
+
+void CMaterials::mtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->preRenderRefCube(iCube, pWorld);
+}
+
+void CMaterials::mtlRefCubePostRender(ID id, int iCube)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->postRenderRefCube(iCube);
+}
+
+void CMaterials::mtlRefCubeEndRender(ID id, const float3_t *pViewPos)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->endRenderRefCube(pViewPos);
+}
+
+bool CMaterials::mtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos)
+{
+	MTL_REF_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pReflect->updateCountUpdate(pViewPos);
+}
+
+void CMaterials::mtlRefNullingCountUpdate(ID id)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->nullingCountUpdate();
+}
+
+IDirect3DCubeTexture9* CMaterials::refCubeGetTex(ID id)
+{
+	MTL_REF_PRE_COND_ID(id, 0);
+	return m_aUnitMtrls[id]->m_pReflect->getRefCubeTex();
+}
+
+//**************************************************************************
+
+void CMaterials::mtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type)
+{
+	MTL_PRE_COND_ID(id);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.type_physics = type;
+}
+
+MTLTYPE_PHYSIC CMaterials::mtlGetPhysicMaterial(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_PHYSIC_CONCRETE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.type_physics;
+}
+
+void CMaterials::mtlSetTexture(ID id, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
+
+void CMaterials::mtlGetTexture(ID id, char* name)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+
+	if (name && m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture, name);
+}
+
+ID CMaterials::mtlGetTextureID(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture;
+}
+
+void CMaterials::mtlSetVS(ID id, const char* path_vs)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, path_vs, path_vs, SHADER_CHECKDOUBLE_PATH);
+}
+
+void CMaterials::mtlGetVS(ID id, char* name)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderVS, name);
+}
+
+void CMaterials::mtlSetPS(ID id, const char* path_ps)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, path_ps, path_ps, SHADER_CHECKDOUBLE_PATH);
+}
+
+void CMaterials::mtlGetPS(ID id, char* name)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderPS, name);
+}
+
+
+void CMaterials::mtlSetLighting(ID id, bool is_lighting)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit = !is_lighting;
+}
+
+bool CMaterials::mtlGetLighting(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return !m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit;
+}
+
+
+void CMaterials::mtlSetIsTextureLighting(ID id, bool is_tex_lighting)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTextureParam = is_tex_lighting;
+}
+
+bool CMaterials::mtlGetIsTextureLighting(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTextureParam;
+}
+
+
+void CMaterials::mtlSetTextureLighting(ID id, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
+
+void CMaterials::mtlGetTextureLighting(ID id, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam >= 0)
+	{
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam, path_tex);
+		if (path_tex[0] == MTL_VIRTUAL_DIR_HAND_MTL)
+			path_tex[0] = 0;
+	}
+	else if (path_tex)
+		path_tex[0] = 0;
+}
+
+
+void CMaterials::mtlSetRoughness(ID id, float roughness)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fRoughness = roughness;
+}
+
+float CMaterials::mtlGetRoughness(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fRoughness;
+}
+
+
+void CMaterials::mtlSetF0(ID id, float f0)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fF0 = f0;
+}
+
+float CMaterials::mtlGetF0(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fF0;
+}
+
+
+void CMaterials::mtlSetThickness(ID id, float thickness)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fThickness = thickness;
+}
+
+float CMaterials::mtlGetThickness(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fThickness;
+}
+
+
+void CMaterials::mtlSetDurability(ID id, float fDurability)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDurability = fDurability;
+}
+
+float CMaterials::mtlGetDurability(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDurability;
+}
+
+
+void CMaterials::mtlSetHitChance(ID id, float fHitChance)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fHitChance = fHitChance;
+}
+
+float CMaterials::mtlGetHitChance(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fHitChance;
+}
+
+
+void CMaterials::mtlSetDensity(ID id, float fDensity)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDensity = fDensity;
+}
+
+float CMaterials::mtlGetDensity(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDensity;
+}
+
+
+
+void CMaterials::mtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_transparency = type;
+}
+
+MTLTYPE_TRANSPARENCY CMaterials::mtlGetTypeTransparency(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_TRANSPARENCY_NONE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_transparency;
+}
+
+
+void CMaterials::mtlSetTypeReflection(ID id, MTLTYPE_REFLECT type)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect = type;
+
+	if (m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE)
+	{
+		if (!m_aUnitMtrls[id]->m_pReflect)
+			m_aUnitMtrls[id]->m_pReflect = new CReflection();
+
+		m_aUnitMtrls[id]->m_pReflect->init(m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect);
+	}
+}
+
+MTLTYPE_REFLECT CMaterials::mtlGetTypeReflection(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect;
+}
+
+
+void CMaterials::mtlSetMaskTex(ID id, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
+
+void CMaterials::mtlGetMaskTex(ID id, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask, path_tex);
+	else if (path_tex)
+		path_tex[0] = 0;
+}
+
+void CMaterials::mtlSetMRTex(ID id, int channel, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
+
+void CMaterials::mtlGetMRTex(ID id, int channel, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel] >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel], path_tex);
+	else if (path_tex)
+		path_tex[0] = 0;
+}
+
+
+void CMaterials::mtlSetDTex(ID id, int channel, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
+
+void CMaterials::mtlGetDTex(ID id, int channel, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel] >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel], path_tex);
+	else if (path_tex)
+		path_tex[0] = 0;
+}
+
+
+void CMaterials::mtlSetStdVS(ID id, MTL_SHADERSTD type, bool is_send)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = is_send;
+
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = is_send;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = is_send;
+
+	else if (type == MTL_SHADERSTD_USERDATA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData = is_send;
+
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = is_send;
+}
+
+bool CMaterials::mtlGetStdVS(ID id, MTL_SHADERSTD type)
+{
+	MTL_PRE_COND_ID(id, false);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection;
+
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta;
+
+	else if (type == MTL_SHADERSTD_USERDATA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData;
+
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize;
+
+	return(false);
+}
+
+void CMaterials::mtlSetStdPS(ID id, MTL_SHADERSTD type, bool is_send)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = is_send;
+
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = is_send;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = is_send;
+
+	else if (type == MTL_SHADERSTD_USERDATA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData = is_send;
+
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = is_send;
+}
+
+bool CMaterials::mtlGetStdPS(ID id, MTL_SHADERSTD type)
+{
+	MTL_PRE_COND_ID(id, false);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection;
+
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta;
+
+	else if (type == MTL_SHADERSTD_USERDATA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData;
+
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize;
+	return(false);
+}
+
+
+void CMaterials::mtlSetUserDataVS(ID id, int component, float val)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData[component] = val;
+}
+
+float CMaterials::mtlGetUserDataVS(ID id, int component)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData[component];
+}
+
+void CMaterials::mtlSetUserDataVS_InPS(ID id, bool is_send_ps)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = is_send_ps;
+}
+
+bool CMaterials::mtlGetUserDataVS_InPS(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader;
+}
+
+
+void CMaterials::mtlSetUserDataPS(ID id, int component, float val)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData[component] = val;
+}
+
+float CMaterials::mtlGetUserDataPS(ID id, int component)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData[component];
+}
+
+void CMaterials::mtlSetUserDataPS_InPS(ID id, bool is_send_vs)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = is_send_vs;
+}
+
+bool CMaterials::mtlGetUserDataPS_InPS(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader;
+}
+
+//##########################################################################
+
+void CMaterials::setIsIncrCountSurf(bool bf)
+{
+	m_useCountSurface = bf;
+}
+
+bool CMaterials::getIsIncrCountSurf()
+{
+	return m_useCountSurface;
+}
+
+void CMaterials::nullingCurrCountSurf()
+{
+	m_idCurrIdSurface = 0;
+}
+
+int CMaterials::getCurrCountSurf()
+{
+	return m_idCurrIdSurface;
+}
+
+void CMaterials::setCurrCountSurf(int count)
+{
+	m_idCurrIdSurface = count;
+}
+
+//##########################################################################
+
+void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl)
+{
+	//может быть случай когда текстура в которую сейчас рисуем еще стоит в текстурных слотах
+	//из-за этого может быть необъяснимое поводенеие и как результат непонятные артефакты в самой текстуре в которую сейчас рисуем
+	//поэтому нужно обнулить слот в котором возможно была текстура
+	//такое явление может быть в случае когда в кадре только один материал который отражает
+	MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, 0);
+
+	if (idMtl >= 0 && idMtl < m_aUnitMtrls.size())
+		setMainTexture(idSlot, idMtl);
+
+	if (type == MTLTYPE_MODEL_STATIC)
+	{
+		SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom);
+
+		float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity());
+		float4x4 wvpmat;
+		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat);
+		wvpmat = SMMatrixTranspose(wmat * wvpmat);
+		wmat = SMMatrixTranspose(wmat);
+
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "WorldViewProjection", &wvpmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom, "World", &wmat);
+
+		if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0))
+		{
+			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP);
+
+			float3 tmpnormal, tmppoint;
+
+			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal);
+			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint);
+
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "PlaneNormal", &tmpnormal);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeomCP, "PlanePoint", &tmppoint);
+		}
+		else
+			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGeom);
+	}
+	else if (type == MTLTYPE_MODEL_GRASS || type == MTLTYPE_MODEL_TREE)
+	{
+		ID tmpvs = (type == MTLTYPE_MODEL_GRASS ? MLSet::IDsShaders::VS::StdGrass : MLSet::IDsShaders::VS::StdTree);
+		SGCore_ShaderBind(SHADER_TYPE_VERTEX, tmpvs);
+
+		float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity());
+		float4x4 wvpmat;
+		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat);
+		wvpmat = SMMatrixTranspose(wmat * wvpmat);
+		wmat = SMMatrixTranspose(wmat);
+
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "WorldViewProjection", &wvpmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpvs, "World", &wmat);
+
+		if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0))
+		{
+			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP);
+
+			float3 tmpnormal, tmppoint;
+
+			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal);
+			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint);
+
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "PlaneNormal", &tmpnormal);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreenCP, "PlanePoint", &tmppoint);
+		}
+		else
+			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdGreen);
+	}
+	else if (type == MTLTYPE_MODEL_SKIN)
+	{
+		SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin);
+
+		float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity());
+		float4x4 wvpmat;
+		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat);
+		wvpmat = SMMatrixTranspose(wmat * wvpmat);
+		wmat = SMMatrixTranspose(wmat);
+
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "WorldViewProjection", &wvpmat);
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin, "World", &wmat);
+
+		if (Core_RBoolGet(G_RI_BOOL_CLIPPLANE0))
+		{
+			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP);
+
+			float3 tmpnormal, tmppoint;
+
+			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_NORMAL, &tmpnormal);
+			Core_RFloat3Get(G_RI_FLOAT3_CLIPPLANE0_POINT, &tmppoint);
+
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "PlaneNormal", &tmpnormal);
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkinCP, "PlanePoint", &tmppoint);
+		}
+		else
+			SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::StdSkin);
+	}
+}
+
+void CMaterials::render(ID id, const float4x4 *pWorld)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+
+	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_near = GET_PCVAR_FLOAT("r_near");
+	static const float *r_far = GET_PCVAR_FLOAT("r_far");
+
+	m_mWorld = (pWorld ? (*pWorld) : SMMatrixIdentity());
+
+	CMaterial *pMtrl = m_aUnitMtrls[id]->m_pMtrl;
+
+	//если есть то устанавливаем текстуру материала
+	if (pMtrl->m_oMainGraphics.m_idMainTexture != -1)
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_MAIN, SGCore_LoadTexGetTex(pMtrl->m_oMainGraphics.m_idMainTexture));
+
+	//если нет отражени¤ то отправл¤ем 0
+	if (pMtrl->m_oLightParam.m_type_reflect == 0)
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, 0);
+	else
+	{
+		if (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_PLANE)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefPlaneTex());
+		else if (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefCubeTex());
+	}
+
+	MLSet::DXDevice->SetTexture(MTL_TEX_R_CURR_DEPTH, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene0));
+
+	//если есть рефаркци¤, а она идет вторым проходом, то отправл¤ем, иначе посылаем 0
+	/*if (pMtrl->m_oLightParam.m_type_transparency)
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_REFRACTION, SGCore_RTGetTexture(SML_DSGetRT_ID(DS_RT_SCENE_LIGHT_COM_REF)));
+	else
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_REFRACTION, 0);*/
+
+	if (pMtrl->m_oMicroDetail.m_idMask != -1)
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_MASK, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_idMask));
+
+	for (int k = 0; k<4; k++)
+	{
+		if (pMtrl->m_oMicroDetail.m_aDetail[k] != -1)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_aDetail[k]));
+		else
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, 0);
+
+		if (pMtrl->m_oMicroDetail.m_aMicroRelief[k] != -1)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_aMicroRelief[k]));
+		else
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, 0);
+	}
+
+	//если есть текстура с параметрами освещени¤ и установлено что берем параметры из текстуры, то отправл¤ем текстуру с параметрами
+	if (pMtrl->m_oLightParam.m_idTexParam != -1 && pMtrl->m_oLightParam.m_isTextureParam)
+	{
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParam));
+	}
+	//иначе если берем параметры из ... редактора
+	else if (!pMtrl->m_oLightParam.m_isTextureParam)
+	{
+		if (pMtrl->m_oLightParam.m_fOldRoughness != pMtrl->m_oLightParam.m_fRoughness || pMtrl->m_oLightParam.m_fOldF0 != pMtrl->m_oLightParam.m_fF0 || pMtrl->m_oLightParam.m_fOldThickness != pMtrl->m_oLightParam.m_fThickness)
+		{
+			//блокируем текстуру 1х1 котора¤ есть параметры освещени¤, и запсиываем туда то что настроили
+			D3DLOCKED_RECT LockedRect;
+			IDirect3DTexture9* ParamLightModelTex = SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand);
+			ParamLightModelTex->LockRect(0, &LockedRect, 0, 0);
+			DWORD *param = (DWORD*)LockedRect.pBits;
+			//DWORD param = D3DCOLOR_ARGB(0,0,0,0);
+			param[0] = D3DCOLOR_ARGB(0, DWORD(pMtrl->m_oLightParam.m_fRoughness*255.f), DWORD(pMtrl->m_oLightParam.m_fF0*255.f), DWORD(pMtrl->m_oLightParam.m_fThickness*255.f));
+			ParamLightModelTex->UnlockRect(0);
+
+			pMtrl->m_oLightParam.m_fOldRoughness = pMtrl->m_oLightParam.m_fRoughness;
+			pMtrl->m_oLightParam.m_fOldF0 = pMtrl->m_oLightParam.m_fF0;
+			pMtrl->m_oLightParam.m_fOldThickness = pMtrl->m_oLightParam.m_fThickness;
+		}
+
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand));
+	}
+	else
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(MLSet::IDsTexs::NullMaterial));
+
+
+	if (pMtrl->m_oMainGraphics.m_idShaderVS != -1)
+		SGCore_ShaderBind(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS);
+
+	if (pMtrl->m_oMainGraphics.m_idShaderPS != -1)
+		SGCore_ShaderBind(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS);
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
+		m_mWorldTrans = SMMatrixTranspose(m_mWorld);
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
+	{
+		//float4x4 view;
+		Core_RMatrixGet(G_RI_MATRIX_VIEW, &m_mViewTrans);
+		//MLSet::DXDevice->GetTransform(D3DTS_VIEW, &tmpView);
+		//view = float4x4(tmpView);
+		m_mViewTrans = SMMatrixTranspose(m_mViewTrans);
+
+		//float4x4 proj;
+		Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &m_mProjTrans);
+		//MLSet::DXDevice->GetTransform(D3DTS_PROJECTION, &tmpProjection);
+		//proj = float4x4(tmpProjection);
+		m_mProjTrans = SMMatrixTranspose(m_mProjTrans);
+	}
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "World", &m_mWorldTrans);
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "World", &m_mWorldTrans);
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "View", &m_mViewTrans);
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "View", &m_mViewTrans);
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Projection", &m_mProjTrans);
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Projection", &m_mProjTrans);
+
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView)
+	{
+		float4x4 wv = m_mViewTrans * m_mWorldTrans;
+
+		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView)
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldView", &wv);
+
+		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView)
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldView", &wv);
+	}
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
+	{
+		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &m_mViewProj);
+		
+		float4x4 mWVP = m_mWorld * m_mViewProj;
+		mWVP = SMMatrixTranspose(mWVP);
+
+		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection)
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldViewProjection", &mWVP);
+
+		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldViewProjection", &mWVP);
+	}
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam)
+	{
+		float3 vObserverPos;
+		Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos);
+
+		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam)
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "PosCam", &vObserverPos);
+
+		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam)
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "PosCam", &vObserverPos);
+	}
+
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Param", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "ParamVS", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Param", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "ParamPS", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
+
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WinSize", &float2_t(*r_win_width, *r_win_height));
+
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WinSize", &float2_t(*r_win_width, *r_win_height));
+
+	//если материалом назначен альфа тест и не включен принудительный
+	if (pMtrl->m_oMainGraphics.m_useAlphaTest && !m_useForceblyAlphaTest)
+	{
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAREF, MTL_ALPHATEST_FREE_VALUE);
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
+	}
+	//если не включен принудительный альфа тест
+	else if (!m_useForceblyAlphaTest)
+	{
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+	}
+	//иначе включен принудительный альфа тест
+	else
+	{
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAREF, MTL_ALPHATEST_FORCEBLY_VALUE);
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
+	}
+
+	//почти во всех пиксельных шейдерах материалов есть данна¤ NearFar, необходима¤ д¤л записи глубины
+	if (pMtrl->m_oMainGraphics.m_idShaderPS != -1)
+	{	
+		//освещаемый ли тип материала или нет? Ппрозрачный освещаемый?
+		//0,0.33,0.66,1
+		float fLayer;
+		if (pMtrl->m_oMainGraphics.m_isUnlit)
+		{
+			if (pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_NONE)
+				fLayer = MTLTYPE_LAYER_OPAQUE_UNLIT;
+			else
+				fLayer = MTLTYPE_LAYER_TRANSPARENT_UNLIT;
+		}
+		else
+		{
+			if (pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_NONE)
+				fLayer = MTLTYPE_LAYER_OPAQUE_LIGHT;
+			else
+				fLayer = MTLTYPE_LAYER_TRANSPARENT_LIGHT;
+		}
+
+		if (m_useCountSurface && (pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_ALPHA_LIGHT || pMtrl->m_oLightParam.m_type_transparency == MTLTYPE_TRANSPARENCY_ALPHA_UNLIT))
+			++(m_idCurrIdSurface);
+
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "NearFarIsUnlit", &float4_t(*r_near, *r_far, fLayer, float(m_idCurrIdSurface) / 255.f));
+	}
+}
+
+void CMaterials::renderLight(const float4_t *pColor, const float4x4 *pWorld)
+{
+	MTL_PRE_COND_ID(MtrlDefLight, _VOID);
+
+	m_aUnitMtrls[MtrlDefLight]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData = *pColor;
+	render(MtrlDefLight, pWorld);
+	m_aUnitMtrls[MtrlDefLight]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0);
+}
\ No newline at end of file
diff --git "a/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h" "b/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h"
new file mode 100644
index 000000000..097f3ea2d
--- /dev/null
+++ "b/source/mtllight/material - \320\272\320\276\320\277\320\270\321\217.h"	
@@ -0,0 +1,431 @@
+
+/***********************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
+See the license in LICENSE
+***********************************************************/
+
+#ifndef __MATERIAL_H
+#define __MATERIAL_H
+
+#include <common/String.h>
+#include <common/Array.h>
+#include <common/file_utils.h>
+#include "reflection.h"
+#include <direct.h>
+
+#define MTL_PRE_COND_ID(id,stdval) \
+if (!(id >= 0 && id < m_aUnitMtrls.size()))\
+{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\
+else if (!m_aUnitMtrls[id])\
+{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material '%d' is not init", GEN_MSG_LOCATION, id); return stdval; }
+
+#define MTL_REF_PRE_COND_ID(id,stdval) \
+MTL_PRE_COND_ID(id, stdval)\
+if (!(m_aUnitMtrls[id]->m_pReflect))\
+{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material id = '%d', name = '%s' unsupported reflection", GEN_MSG_LOCATION, id, m_aUnitMtrls[id]->m_pMtrl->m_sName.c_str()); return stdval; }
+
+class CMaterials
+{
+public:
+	CMaterials();
+	~CMaterials();
+
+	void onLostDevice();
+	void onResetDevice();
+
+	SX_ALIGNED_OP_MEM
+
+	void clear(bool isClearRefDel);
+	void update(UINT timeDelta);
+	void setMainTexture(ID idSlot, ID idTexure);
+	void render(ID id, const float4x4 *pWorld);
+	void renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl);
+	void renderLight(const float4_t *pColor, const float4x4 *pWorld);
+	int getCount();
+
+	void setForceblyAlphaTest(bool useAlphaTest);
+	bool getForceblyAlphaTest();
+
+	void setIsIncrCountSurf(bool bf);
+	bool getIsIncrCountSurf();
+	void nullingCurrCountSurf();
+	int getCurrCountSurf();
+	void setCurrCountSurf(int iCount);
+
+	ID mtlLoad(const char *szName, MTLTYPE_MODEL type = MTLTYPE_MODEL_STATIC);
+	void mtlReLoad(ID id, const char *szName = 0);
+	void mtlSave(ID id);
+
+	ID getStdMtl(MTLTYPE_MODEL type_model);
+	ID exists(const char *szName);
+	MTLTYPE_MODEL getTypeModel(ID id);
+	void setTypeModel(ID id, MTLTYPE_MODEL type_model);
+	ID getID(const char *szName);
+
+	//######################################################################
+
+	bool mtlGetUsingAlphaTest(ID id);
+	void mtlSetUsingAlphaTest(ID id, bool isUsing);
+	MTLTYPE_REFLECT mtlTypeReflection(ID id);
+
+	void mtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type);
+	MTLTYPE_PHYSIC mtlGetPhysicMaterial(ID id);
+
+	void mtlSetTexture(ID id, const char *szTexture);
+	void mtlGetTexture(ID id, char *szName);
+	ID mtlGetTextureID(ID id);
+	void mtlSetVS(ID id, const char *szNameVS);
+	void mtlGetVS(ID id, char *szNamePS);
+	void mtlSetPS(ID id, const char *szNamePS);
+	void mtlGetPS(ID id, char *szNamePS);
+
+
+	void mtlSetLighting(ID id, bool isLighting);
+	bool mtlGetLighting(ID id);
+
+	void mtlSetIsTextureLighting(ID id, bool isTexLighting);
+	bool mtlGetIsTextureLighting(ID id);
+
+	void mtlSetTextureLighting(ID id, const char *szTex);
+	void mtlGetTextureLighting(ID id, char *szTex);
+
+	void mtlSetRoughness(ID id, float fRroughness);
+	float mtlGetRoughness(ID id);
+
+	void mtlSetF0(ID id, float fF0);
+	float mtlGetF0(ID id);
+
+	void mtlSetThickness(ID id, float fThickness);
+	float mtlGetThickness(ID id);
+
+	void mtlSetDurability(ID id, float fDurability);
+	float mtlGetDurability(ID id);
+
+	void mtlSetHitChance(ID id, float fHitChance);
+	float mtlGetHitChance(ID id);
+
+	void mtlSetDensity(ID id, float fDensity);
+	float mtlGetDensity(ID id);
+
+	void mtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type);
+	MTLTYPE_TRANSPARENCY mtlGetTypeTransparency(ID id);
+
+	void mtlSetTypeReflection(ID id, MTLTYPE_REFLECT type);
+	MTLTYPE_REFLECT mtlGetTypeReflection(ID id);
+
+
+	void mtlSetMaskTex(ID id, const char *szTexture);
+	void mtlGetMaskTex(ID id, char *szTexture);
+
+	void mtlSetMRTex(ID id, int iChannel, const char *szTexture);
+	void mtlGetMRTex(ID id, int iChannel, char *szTexture);
+
+	void mtlSetDTex(ID id, int iChannel, const char *szTexture);
+	void mtlGetDTex(ID id, int iChannel, char *szTexture);
+
+
+	void mtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend);
+	bool mtlGetStdVS(ID id, MTL_SHADERSTD type);
+	void mtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend);
+	bool mtlGetStdPS(ID id, MTL_SHADERSTD type);
+
+
+	void mtlSetUserDataVS(ID id, int iComponent, float val);
+	float mtlGetUserDataVS(ID id, int iComponent);
+	void mtlSetUserDataVS_InPS(ID id, bool isSendPS);
+	bool mtlGetUserDataVS_InPS(ID id);
+	void mtlSetUserDataPS(ID id, int iComponent, float fValue);
+	float mtlGetUserDataPS(ID id, int iComponent);
+	void mtlSetUserDataPS_InPS(ID id, bool isSendVS);
+	bool mtlGetUserDataPS_InPS(ID id);
+
+	//**********************************************************************
+
+	void mtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr);
+	ID mtlRefGetIDArr(ID id, ID idOwner, int iCube);
+
+	void mtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane);
+	const IFrustum* mtlRefGetfrustum(ID id, int iCube);
+	void mtlRefPostRenderPlane(ID id);
+	IDirect3DTexture9* mtlRefPlaneGetTex(ID id);
+
+	void mtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax);
+	bool mtlRefIsAllowedRender(ID id);
+
+	void mtlRefCubeBeginRender(ID id, const float3_t *pCenter);
+	void mtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld);
+	void mtlRefCubePostRender(ID id, int iCube);
+	void mtlRefCubeEndRender(ID id, const float3_t *pViewPos);
+	bool mtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos);
+	void mtlRefNullingCountUpdate(ID id);
+	IDirect3DCubeTexture9* refCubeGetTex(ID id);
+
+	//######################################################################
+
+	int delRefCount();
+	ID delRefGetIDArr(ID idKey, ID idOwner, int iCube);
+	void delRefAllDel();
+
+	//######################################################################
+
+	struct CMaterial
+	{
+		CMaterial();
+		~CMaterial();
+
+		SX_ALIGNED_OP_MEM
+
+		//! обнуление всех данных в материале
+		void nulling();
+
+		//! удален ли материал
+		bool m_isDelete;
+
+		//! основные графические свойства
+		struct CMainGraphics
+		{
+			CMainGraphics();
+			~CMainGraphics();
+
+			//! основная текстура
+			ID m_idMainTexture;
+
+			//! вершинный шейдер
+			ID m_idShaderVS;
+
+			//! пиксельный шейдер
+			ID m_idShaderPS;
+
+			//! неосвещаемый материал
+			bool m_isUnlit;
+
+			//! использовать ли альфа тест
+			bool m_useAlphaTest;
+
+			//! тип модели для рендера
+			MTLTYPE_MODEL type_model;
+
+			//! отправляемые данные в шейдеры
+			struct СDataShader
+			{
+				СDataShader();
+				~СDataShader();
+
+				SX_ALIGNED_OP_MEM
+
+					//! отправлять ли мировую матрицу
+					bool m_isTransWorld;
+
+				//! отправлять ли видову матрицу
+				bool m_isTransView;
+
+				//! отправлять ли проекционную матрицу
+				bool m_isTransProjection;
+
+				//! отправлять ли world * view
+				bool m_isTransWorldView;
+
+				//! отправлять ли world * view * projection
+				bool m_isTransWorldViewProjection;
+
+				//! отправлять ли позицию камеры/наблюдателя
+				bool m_isTransPosCam;
+
+				//! отправлять время кадра
+				bool m_isTransTimeDelta;
+
+				//! отправлять ли пользовательские данные
+				bool m_isTransUserData;
+
+				//! отправлять ли пользовательские данные в другой шейдер
+				bool m_isTransUserDataInOtherShader;
+
+				//! отправлять ли размер окна рендера
+				bool m_isTransWinSize;
+
+				//! пользовательские данные, значения [0, 1]
+				float4 m_vUserData;
+			};
+
+			//! отправляемые данные в вершинный шейдер
+			СDataShader m_oDataVS;
+
+			//! отправляемые данные в пиксельный шейдер
+			СDataShader m_oDataPS;
+		};
+
+		//! детализированные свойства, маска и 4 детальных и 4 микрорельефных карты
+		struct CMaskDetailMicroRelief
+		{
+			CMaskDetailMicroRelief();
+			~CMaskDetailMicroRelief();
+
+			//! идентификатор текстуры маски, где к каждому каналу привязаны 4 детальных и микрорельефных текстуры
+			ID m_idMask;
+
+			//! массив идентификаторов детальных текстур, для каждого канала маски
+			ID m_aDetail[4];
+
+			//! массив идентификаторов микрорельефных текстур (normal map), для каждого канала маски
+			ID m_aMicroRelief[4];
+		};
+
+		//! световые свойсвта, основные характеристики просчета освещения
+		struct CLightParam
+		{
+			CLightParam();
+			~CLightParam();
+
+			//! текстура с параметрами материала (созданная пользователем)
+			ID m_idTexParam;
+
+			//! текстура с параметрами материала, размер 1х1, параметры взяты из текущей структуры
+			ID m_idTexParamHand;
+
+			//! назначена ли (true) текстура для параметров материала (или данные берем из параметров и кладем в рабочую текстуру)
+			bool m_isTextureParam;
+
+			//! шероховатость [0 - гладкий, 1 - полностью шершавый]
+			float m_fRoughness;
+
+			//! отражательная способность [0 - ничего не отражает, 1 - все отражает]
+			float m_fF0;
+
+			//! толщина/просвечиваемость [0 - просвечивается, 1 - не просвечивается]
+			float m_fThickness;
+
+			float m_fOldRoughness;
+			float m_fOldF0;
+			float m_fOldThickness;
+
+			//! тип отражений
+			MTLTYPE_REFLECT m_type_reflect;
+
+			//! тип прозрачности
+			MTLTYPE_TRANSPARENCY m_type_transparency;
+		};
+
+		
+
+		//! физические свойства
+		struct CPhysics
+		{
+			CPhysics();
+			~CPhysics();
+
+			//! тип физического материала
+			MTLTYPE_PHYSIC type_physics;
+
+			//! коэффициент пробиваемости [0, ], чем больше тем сложнее пробить
+			float m_fDurability;
+
+			//! шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется]
+			float m_fHitChance;
+
+			//! плотность материала кг/м3
+			float m_fDensity;
+		};
+
+		//! имя материала
+		String m_sName;
+
+		//! основные графические свойства
+		CMainGraphics m_oMainGraphics;
+		
+		//! параметры детальности
+		CMaskDetailMicroRelief m_oMicroDetail;
+
+		//! параметры освещения
+		CLightParam m_oLightParam;
+
+		//! физические свойства
+		CPhysics m_oPhysics;
+	};
+
+	//! юнит материала
+	struct CUnitMaterial
+	{
+		CUnitMaterial();
+		~CUnitMaterial();
+
+		//! объект материала
+		CMaterial *m_pMtrl;
+
+		//! объект отражений
+		CReflection *m_pReflect;
+	};
+
+protected:
+
+	//! использовать ли принудительный альфа тест
+	bool m_useForceblyAlphaTest;
+
+	bool loadMtl(const char *szName, CMaterial **ppMtrl);
+	void createMtl(const char *szName, CMaterial **ppMtrl, MTLTYPE_MODEL type);
+	ID createTexParamLighting(float fRoughness, float fF0, float fThickness);
+
+	void addName(const char *szName, ID id);
+	ID addUnitMaterial(CUnitMaterial *pUnitMtrl);
+	ID addMaterial(CMaterial *pMtrl);
+
+	//! структура описывающая папку и все текстуры в ней, у каждой свой id для доступа
+	struct CPath
+	{
+		CPath(){}
+
+		//! путь
+		String m_sPath;
+
+		struct CObject
+		{
+			CObject(){ m_id = -1; }
+			CObject(ID id, const char *szName){ m_id = id; m_sName = szName; }
+
+			//! идентификатор
+			ID m_id;
+
+			//! имя
+			String m_sName;
+		};
+
+		//! массив CObject
+		Array<CObject*> m_aObjects;
+	};
+
+	//! массив путей до текстур/материалов
+	Array<CPath*> m_aMtrlPathes;
+
+	//! массив юнитов материалов
+	Array<CUnitMaterial*> m_aUnitMtrls;
+
+	//! массив материалов
+	Array<CMaterial*> m_aMtrls;
+
+	//! массив отражений
+	Array<CReflection*> m_aReflections;
+
+	//! использовать ли подсчет поверхностей
+	bool m_useCountSurface;
+
+	//! текущий индентификатор поверхности
+	ID m_idCurrIdSurface;
+
+	int CurrFirstFree;
+
+	//! текущее время кадра в млсек
+	UINT m_uiCurrTimeDelta;
+
+	//! общее время кадров в млсек
+	UINT m_uiCountTimeDelta;
+
+	ID MtrlDefLight;
+	ID MtrlDefTree;
+	ID MtrlDefGrass;
+	ID MtrlDefStatic;
+	ID MtrlDefSkin;
+	ID BeginNonDef;
+
+	float4x4 m_mWorld, m_mViewProj, m_mWorldTrans, m_mViewTrans, m_mProjTrans;
+};
+
+#endif
\ No newline at end of file
diff --git a/source/mtllight/material.cpp b/source/mtllight/material.cpp
index a4d93d93e..8ba9ab038 100644
--- a/source/mtllight/material.cpp
+++ b/source/mtllight/material.cpp
@@ -6,11 +6,12 @@ See the license in LICENSE
 
 #include "material.h"
 
-Materials::Materials()
+CMaterials::CMaterials()
 {
 	CurrFirstFree = -1;
-	CountTimeDelta = 0;
-	IsForceblyAlphaTest = false;
+	m_uiCountTimeDelta = 0;
+	m_uiCurrTimeDelta = 0;
+	m_useForceblyAlphaTest = false;
 	SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs", "mtrlgeom_base.vs", SHADER_CHECKDOUBLE_PATH);
 	SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps", "mtrlgeom_base.ps", SHADER_CHECKDOUBLE_PATH);
 
@@ -23,1817 +24,1785 @@ Materials::Materials()
 	SGCore_ShaderLoad(SHADER_TYPE_VERTEX, "mtrlskin_base.vs", "mtrlskin_base.vs", SHADER_CHECKDOUBLE_PATH);
 	SGCore_ShaderLoad(SHADER_TYPE_PIXEL, "mtrlskin_base.ps", "mtrlskin_base.ps", SHADER_CHECKDOUBLE_PATH);
 
-	IsIncrCountSurf = false;
-	CurrIdSurf = 0;
+	m_useCountSurface = false;
+	m_idCurrIdSurface = 0;
 
-	UnitMaterial* tmpumtl = new UnitMaterial();
-	Material* tmpMtlDefaultLight = new Material();
-	AddMaterial(tmpMtlDefaultLight);
-	tmpumtl->mtl = tmpMtlDefaultLight;
-	sprintf(tmpMtlDefaultLight->Name, "%s_%s", MTL_VIRTUAL_DIR_STD_MTL, "light");
-	tmpMtlDefaultLight->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
-	tmpMtlDefaultLight->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_light.ps");
+	CUnitMaterial* tmpumtl = new CUnitMaterial();
+	CMaterial* tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_light";
+	tmpMtlDefaultLight->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+	tmpMtlDefaultLight->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_light.ps");
 
-	tmpMtlDefaultLight->MainTexture = -1;
-	tmpMtlDefaultLight->VS.IsTransWorldViewProjection = true;
+	tmpMtlDefaultLight->m_oMainGraphics.m_idMainTexture = -1;
+	tmpMtlDefaultLight->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
 
-	MtrlDefLight = AddUnitMaterial(tmpumtl);
-	AddName(tmpMtlDefaultLight->Name, MtrlDefLight);
+	MtrlDefLight = addUnitMaterial(tmpumtl);
+	addName(tmpMtlDefaultLight->m_sName.c_str(), MtrlDefLight);
 
 
 
-	tmpumtl = new UnitMaterial();
-	tmpMtlDefaultLight = new Material();
-	AddMaterial(tmpMtlDefaultLight);
-	tmpumtl->mtl = tmpMtlDefaultLight;
-	sprintf(tmpMtlDefaultLight->Name, "%s_%s", MTL_VIRTUAL_DIR_STD_MTL, "base");
-	tmpumtl->mtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
-	tmpumtl->mtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
-	tmpumtl->mtl->VS.IsTransWorld = true;
+	tmpumtl = new CUnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_base";
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
 
-	tmpumtl->mtl->MainTexture = -1;
-	tmpumtl->mtl->VS.IsTransWorldViewProjection = true;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
 
-	MtrlDefStatic = AddUnitMaterial(tmpumtl);
-	AddName(tmpumtl->mtl->Name, MtrlDefStatic);
+	MtrlDefStatic = addUnitMaterial(tmpumtl);
+	addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefStatic);
 
 
-	tmpumtl = new UnitMaterial();
-	tmpMtlDefaultLight = new Material();
-	AddMaterial(tmpMtlDefaultLight);
-	tmpumtl->mtl = tmpMtlDefaultLight;
-	sprintf(tmpMtlDefaultLight->Name, "%s_%s", MTL_VIRTUAL_DIR_STD_MTL, "tree");
-	tmpumtl->mtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs");
-	tmpumtl->mtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+	tmpumtl = new CUnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_tree";
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
 
-	tmpumtl->mtl->MainTexture = -1;
-	tmpumtl->mtl->VS.IsTransWorldViewProjection = true;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
 
-	MtrlDefTree = AddUnitMaterial(tmpumtl);
-	AddName(tmpumtl->mtl->Name, MtrlDefTree);
+	MtrlDefTree = addUnitMaterial(tmpumtl);
+	addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefTree);
 
 
-	tmpumtl = new UnitMaterial();
-	tmpMtlDefaultLight = new Material();
-	AddMaterial(tmpMtlDefaultLight);
-	tmpumtl->mtl = tmpMtlDefaultLight;
-	sprintf(tmpMtlDefaultLight->Name, "%s_%s", MTL_VIRTUAL_DIR_STD_MTL, "grass");
-	tmpumtl->mtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs");
-	tmpumtl->mtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+	tmpumtl = new CUnitMaterial();
+	tmpMtlDefaultLight = new CMaterial();
+	addMaterial(tmpMtlDefaultLight);
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight->m_sName = String(MTL_VIRTUAL_DIR_STD_MTL) + "_grass";
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
 
-	tmpumtl->mtl->MainTexture = -1;
-	tmpumtl->mtl->VS.IsTransWorldViewProjection = true;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
 
-	MtrlDefGrass = AddUnitMaterial(tmpumtl);
-	AddName(tmpumtl->mtl->Name, MtrlDefGrass);
+	MtrlDefGrass = addUnitMaterial(tmpumtl);
+	addName(tmpumtl->m_pMtrl->m_sName.c_str(), MtrlDefGrass);
 
 
 	/*tmpumtl = new UnitMaterial();
-	tmpMtlDefaultLight = new Material();
-	tmpumtl->mtl = tmpMtlDefaultLight;
+	tmpMtlDefaultLight = new CMaterial();
+	tmpumtl->m_pMtrl = tmpMtlDefaultLight;
 	sprintf(tmpMtlDefaultLight->Name, "%s", "mtrldef_skin");
-	tmpumtl->mtl->PreShaderVS = SGCore_ShaderGetID(0, "mtrlskin_base.vs");
-	tmpumtl->mtl->PreShaderPS = SGCore_ShaderGetID(1, "mtrlskin_base.ps");
-	tmpumtl->mtl->VS.IsTransWorld = true;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(0, "mtrlskin_base.vs");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(1, "mtrlskin_base.ps");
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
 
-	tmpumtl->mtl->MainTexture = -1;
-	tmpumtl->mtl->VS.IsTransWorldViewProjection = true;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_idMainTexture = -1;
+	tmpumtl->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
 
-	ArrMaterials.push_back(tmpumtl);
-	AddName(tmpumtl->mtl->Name, ArrMaterials.size() - 1);
-	MtrlDefSkin = ArrMaterials.size() - 1;*/
+	m_aUnitMtrls.push_back(tmpumtl);
+	AddName(tmpumtl->m_pMtrl->Name, m_aUnitMtrls.size() - 1);
+	MtrlDefSkin = m_aUnitMtrls.size() - 1;*/
 
-	BeginNonDef = ArrMaterials.size();
+	BeginNonDef = m_aUnitMtrls.size();
 }
 
-Materials::~Materials()
+CMaterials::~CMaterials()
 {
-	for (int i = 0; i < ArrHMtls.size(); ++i)
+	for (int i = 0; i < m_aMtrlPathes.size(); ++i)
 	{
-		for (int k = 0; k < ArrHMtls[i]->ArrTex.size(); ++k)
+		for (int k = 0; k < m_aMtrlPathes[i]->m_aObjects.size(); ++k)
 		{
-			mem_delete(ArrHMtls[i]->ArrTex[k]);
+			mem_delete(m_aMtrlPathes[i]->m_aObjects[k]);
 		}
 
-		mem_delete(ArrHMtls[i]);
+		mem_delete(m_aMtrlPathes[i]);
 	}
 
-	for (int i = 0; i < ArrMaterials.size(); ++i)
+	for (int i = 0; i < m_aUnitMtrls.size(); ++i)
 	{
-		mem_delete(ArrMaterials[i]);
+		mem_delete(m_aUnitMtrls[i]);
 	}
 
-	for (int i = 0; i < ArrMtrls.size(); ++i)
+	for (int i = 0; i < m_aMtrls.size(); ++i)
 	{
-		mem_delete(ArrMtrls[i]);
+		mem_delete(m_aMtrls[i]);
 	}
 }
 
-Materials::Material::Material()
-{
-	Name[0] = 0;
-	TransVSDataInPS = false;
-	TransPSDataInVS = false;
-
-	IsDelete = false;
-
-	IsUnlit = false;
-	IsAlphaTest = false;
-	PhysicsMaterial = MTLTYPE_PHYSIC_CONCRETE;
-
-	Type = MTLTYPE_MODEL_STATIC;
-
-	MainTexture - 1;
-	PreShaderVS - 1;
-	PreShaderPS - 1;
-
-	HitChance = 1.0f;
-	Penetration = 100.0f;
-	Density = 1000.0f;
+//**************************************************************************
 
+CMaterials::CMaterial::CMaterial()
+{
+	nulling();
 }
 
-void Materials::Material::Nulling()
+void CMaterials::CMaterial::nulling()
 {
-	Name[0] = 0;
-	TransVSDataInPS = false;
-	TransPSDataInVS = false;
-	IsDelete = false;
-	IsUnlit = false;
-	IsAlphaTest = false;
-	PhysicsMaterial = MTLTYPE_PHYSIC_CONCRETE;
-
-	Type = MTLTYPE_MODEL_STATIC;
+	m_sName = "";
+	
+	m_isDelete = false;
 
-	MainTexture = -1;
-	PreShaderVS = -1;
-	PreShaderPS = -1;
+	m_oMainGraphics.m_idMainTexture = -1;
+	m_oMainGraphics.m_idShaderVS = -1;
+	m_oMainGraphics.m_idShaderPS = -1;
 	
-	MicroDetail = MaterialMaskPM();
-	LightParam = MaterialLightParam();
+	m_oMicroDetail = CMaskDetailMicroRelief();
+	m_oLightParam = CLightParam();
 
-	Penetration = 0.f;
-	HitChance = 1.f;
-	Density = 1500;
+	m_oMainGraphics = CMainGraphics();
 
-	VS = MaterialDataShader();
-	PS = MaterialDataShader();
+	m_oPhysics = CPhysics();
 }
 
-Materials::Material::~Material()
+CMaterials::CMaterial::~CMaterial()
 {
-	if (MainTexture >= 0)
-		SGCore_LoadTexDelete(MainTexture);
+	if (m_oMainGraphics.m_idMainTexture >= 0)
+		SGCore_LoadTexDelete(m_oMainGraphics.m_idMainTexture);
 
-	if (LightParam.ParamTex >= 0)
-		SGCore_LoadTexDelete(LightParam.ParamTex);
+	if (m_oLightParam.m_idTexParam >= 0)
+		SGCore_LoadTexDelete(m_oLightParam.m_idTexParam);
 
-	if (LightParam.ParamTexHand >= 0)
-		SGCore_LoadTexDelete(LightParam.ParamTexHand);
+	if (m_oLightParam.m_idTexParamHand >= 0)
+		SGCore_LoadTexDelete(m_oLightParam.m_idTexParamHand);
 
-	if (MicroDetail.Mask >= 0)
-		SGCore_LoadTexDelete(MicroDetail.Mask);
+	if (m_oMicroDetail.m_idMask >= 0)
+		SGCore_LoadTexDelete(m_oMicroDetail.m_idMask);
 
 	for (int i = 0; i < 4; ++i)
 	{
-		if (MicroDetail.ArrDeatail[i] >= 0)
-			SGCore_LoadTexDelete(MicroDetail.ArrDeatail[i]);
+		if (m_oMicroDetail.m_aDetail[i] >= 0)
+			SGCore_LoadTexDelete(m_oMicroDetail.m_aDetail[i]);
 
-		if (MicroDetail.ArrMicroDiffuse[i] >= 0)
-			SGCore_LoadTexDelete(MicroDetail.ArrMicroDiffuse[i]);
+		if (m_oMicroDetail.m_aMicroRelief[i] >= 0)
+			SGCore_LoadTexDelete(m_oMicroDetail.m_aMicroRelief[i]);
 	}
 }
 
-Materials::Material::MaterialDataShader::MaterialDataShader()
+//**************************************************************************
+
+CMaterials::CMaterial::CMainGraphics::CMainGraphics()
 {
-	IsTransWorld = false;
-	IsTransView = false;
-	IsTransProjection = false;
-	IsTransWorldView = false;
-	IsTransWorldViewProjection = false;
-	IsTransPosCam = false;
-	IsTransTimeDelta = false;
-	IsTransUserData = false;
-	IsTransWinSize = false;
-	Param = float4(0, 0, 0, 0);
+	m_idMainTexture = -1;
+	m_idShaderVS = -1;
+	m_idShaderPS = -1;
+	m_isUnlit = false;
+	m_useAlphaTest = false;
+	type_model = MTLTYPE_MODEL::MTLTYPE_MODEL_DEFAULT;
+	m_oDataVS = CMainGraphics::СDataShader();
+	m_oDataPS = CMainGraphics::СDataShader();
+	m_oDataVS.m_isTransUserDataInOtherShader = false;
+	m_oDataPS.m_isTransUserDataInOtherShader = false;
 };
 
-Materials::Material::MaterialDataShader::~MaterialDataShader()
+CMaterials::CMaterial::CMainGraphics::~CMainGraphics()
 {
 
 };
 
-Materials::Material::MaterialLightParam::MaterialLightParam()
+//**************************************************************************
+
+CMaterials::CMaterial::CMainGraphics::СDataShader::СDataShader()
+{
+	m_isTransWorld = false;
+	m_isTransView = false;
+	m_isTransProjection = false;
+	m_isTransWorldView = false;
+	m_isTransWorldViewProjection = false;
+	m_isTransPosCam = false;
+	m_isTransTimeDelta = false;
+	m_isTransUserData = false;
+	m_isTransWinSize = false;
+	m_vUserData = float4(0, 0, 0, 0);
+};
+
+CMaterials::CMaterial::CMainGraphics::СDataShader::~СDataShader()
 {
-	ParamTex = -1;
-	ParamTexHand = -1;
 
-	RoughnessValue = 0.f;
-	F0Value = 0.f;
-	ThicknessValue = 1.f;
-	TypeRefraction = MTLTYPE_TRANSPARENCY_NONE;
+};
 
-	TypeReflect = MTLTYPE_REFLECT_NONE;
-	IsTextureParam = true;
-}
+//**************************************************************************
 
-Materials::Material::MaterialLightParam::~MaterialLightParam()
+CMaterials::CMaterial::CLightParam::CLightParam()
 {
+	m_idTexParam = -1;
+	m_idTexParamHand = -1;
 
+	m_fRoughness = 0.f;
+	m_fF0 = 0.f;
+	m_fThickness = 1.f;
+	m_isTransparent = false;
+
+	m_type_reflect = MTLTYPE_REFLECT_NONE;
+	m_isTextureParam = true;
 }
 
-Materials::Material::MaterialMaskPM::MaterialMaskPM()
+CMaterials::CMaterial::CLightParam::~CLightParam()
 {
-	Mask = -1;
-	ArrDeatail[0] = -1;
-	ArrDeatail[1] = -1;
-	ArrDeatail[2] = -1;
-	ArrDeatail[3] = -1;
 
-	ArrMicroDiffuse[0] = -1;
-	ArrMicroDiffuse[1] = -1;
-	ArrMicroDiffuse[2] = -1;
-	ArrMicroDiffuse[3] = -1;
 }
 
-Materials::Material::MaterialMaskPM::~MaterialMaskPM()
+//**************************************************************************
+
+CMaterials::CMaterial::CMaskDetailMicroRelief::CMaskDetailMicroRelief()
 {
+	m_idMask = -1;
+	m_aDetail[0] = -1;
+	m_aDetail[1] = -1;
+	m_aDetail[2] = -1;
+	m_aDetail[3] = -1;
 
+	m_aMicroRelief[0] = -1;
+	m_aMicroRelief[1] = -1;
+	m_aMicroRelief[2] = -1;
+	m_aMicroRelief[3] = -1;
 }
 
-Materials::UnitMaterial::UnitMaterial()
+CMaterials::CMaterial::CMaskDetailMicroRelief::~CMaskDetailMicroRelief()
 {
-	mtl = 0;
-	Reflect = 0;
-}
 
-Materials::UnitMaterial::~UnitMaterial()
-{
-	mtl->IsDelete = true;
-	Reflect = 0;
-	//mem_delete(Reflect);
 }
 
-/////
+//**************************************************************************
 
-int Materials::DelRefCount()
+CMaterials::CMaterial::CPhysics::CPhysics()
 {
-	return ArrDelRefMtrls.size();
+	type_physics = MTLTYPE_PHYSIC_CONCRETE;
+
+	m_fDurability = 10.f;
+	m_fHitChance = 1.f;
+	m_fDensity = 1000;
 }
 
-ID Materials::DelRefGetIDArr(ID key, ID inid, int cube)
+CMaterials::CMaterial::CPhysics::~CPhysics()
 {
-	if (!(key >= 0 && key < ArrDelRefMtrls.size()))
-		return -1;
 
-	return ArrDelRefMtrls[key]->getIDArr(inid, cube);
 }
 
-void Materials::DelRefAllDel()
+//**************************************************************************
+
+CMaterials::CUnitMaterial::CUnitMaterial()
 {
-	for (int i = 0; i < ArrDelRefMtrls.size(); ++i)
-	{
-		mem_delete(ArrDelRefMtrls[i]);
-	}
+	m_pMtrl = 0;
+	m_pReflect = 0;
+}
 
-	ArrDelRefMtrls.clear();
+CMaterials::CUnitMaterial::~CUnitMaterial()
+{
+	m_pMtrl->m_isDelete = true;
+	m_pReflect = 0;
+	//mem_delete(Reflect);
 }
 
-void Materials::Clear(bool clear_del)
+//##########################################################################
+
+ID CMaterials::exists(const char* name)
 {
-	int tmpcountdel = 0;
-	
-	for (int i = 0; i < ArrHMtls.size(); ++i)
+	char tmp_path[MTL_MAX_SIZE_DIR];//папка
+	char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением
+	int id = -1;
+	bool IsTruePath = false;
+	//обрезаем имя текстуры и папку
+	for (int i = 0; i<strlen(name); i++)
 	{
-		if (strcmp(ArrHMtls[i]->Path.c_str(), MTL_VIRTUAL_DIR_STD_MTL) != 0)
+		if (name[i] == '_')
 		{
-			for (int k = 0; k < ArrHMtls[i]->ArrTex.size(); ++k)
-			{
-				mem_delete(ArrHMtls[i]->ArrTex[k]);
-				ArrHMtls[i]->ArrTex.erase(k);
-				--k;
-				++tmpcountdel;
-			}
-
-			if (ArrHMtls.size() <= 0)
-			{
-				mem_delete(ArrHMtls[i]);
-				ArrHMtls.erase(i);
-				--i;
-			}
+			memcpy(tmp_path, name, sizeof(char)*i);
+			tmp_path[i] = 0;
+			sprintf(tmp_name, "%s", name + i + 1);
+			IsTruePath = true;
+			break;
 		}
 	}
 
-	tmpcountdel = 0;
-
-	for (int i = BeginNonDef; i < ArrMaterials.size(); ++i)
+	if (!IsTruePath)
 	{
-		//если есть отражения, то записываем в очередь на удаление
-		if (ArrMaterials[i]->Reflect)
-			ArrDelRefMtrls.push_back(ArrMaterials[i]->Reflect);
-
-		mem_delete(ArrMaterials[i]);
-		++tmpcountdel;
+		return -2;
+		//LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", gen_msg_location, name);
 	}
 
-	CurrFirstFree = BeginNonDef;
-
-	tmpcountdel = 0;
-
-	for (int i = 0; i < ArrMtrls.size(); ++i)
+	int tmpkey = -1;	//переменная в которой храним ключ от массива в который записываем
+	for (int i = 0; i<m_aMtrlPathes.size(); ++i)
 	{
-		if (ArrMtrls[i]->IsDelete)
+		//TLPath* tmptlpath = m_aMtrlPathes[i];
+		if (m_aMtrlPathes[i] && strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), tmp_path) == 0)
 		{
-			mem_delete(ArrMtrls[i]);
-			ArrMtrls.erase(i);
-			--i;
-			++tmpcountdel;
+			tmpkey = i;
+			break;
 		}
 	}
 
-	if (clear_del)
-		DelRefAllDel();
-}
-
-void Materials::OnLostDevice()
-{
-	for (long i = 0; i < ArrMaterials.size(); ++i)
+	//если мы не нашли совпадений значит путь уникален ...
+	if (tmpkey == -1)
 	{
-		if (ArrMaterials[i] && ArrMaterials[i]->Reflect)
-			ArrMaterials[i]->Reflect->onLostDevice();
+		return -1;
 	}
-}
 
-void Materials::OnResetDevice()
-{
-	for (long i = 0; i < ArrMaterials.size(); ++i)
+	//проверяем записано ли уже имя текстуры
+	for (int i = 0; i<m_aMtrlPathes[tmpkey]->m_aObjects.size(); i++)
 	{
-		if (ArrMaterials[i] && ArrMaterials[i]->Reflect)
-			ArrMaterials[i]->Reflect->onResetDevice();
+		if (strcmp(m_aMtrlPathes[tmpkey]->m_aObjects[i]->m_sName.c_str(), tmp_name) == 0)
+		{
+			id = m_aMtrlPathes[tmpkey]->m_aObjects[i]->m_id;
+			break;
+		}
 	}
-}
 
-////
+	return id;
+}
 
-ID Materials::GetStdMtl(MTLTYPE_MODEL type_model)
+ID CMaterials::addUnitMaterial(CUnitMaterial* umtl)
 {
-	if (type_model == MTLTYPE_MODEL_STATIC)
-	{
-		return MtrlDefStatic;
-	}
-	else if (type_model == MTLTYPE_MODEL_GRASS)
-	{
-		return MtrlDefGrass;
-	}
-	else if (type_model == MTLTYPE_MODEL_TREE)
+	ID tmpid = -1;
+	if (CurrFirstFree + 1 == m_aUnitMtrls.size())
 	{
-		return MtrlDefTree;
+		m_aUnitMtrls.push_back(umtl);
+		CurrFirstFree = tmpid = m_aUnitMtrls.size() - 1;
 	}
-	else if (type_model == MTLTYPE_MODEL_SKIN)
+	else
 	{
-		return MtrlDefSkin;
-	}
-	return(-1);
-}
+		if (CurrFirstFree < 0 || m_aUnitMtrls[CurrFirstFree] != 0)
+		{
+			if (CurrFirstFree < 0)
+				CurrFirstFree = 0;
 
-MTLTYPE_MODEL Materials::GetTypeModel(ID id)
-{
-	MTL_PRE_COND_ID(id, MTLTYPE_MODEL_STATIC);
-	return ArrMaterials[id]->mtl->Type;
-}
+			for (int i = CurrFirstFree; i < m_aUnitMtrls.size(); ++i)
+			{
+				if (m_aUnitMtrls[i] == 0)
+				{
+					CurrFirstFree = i;
+					break;
+				}
+			}
+		}
 
-void Materials::SetTypeModel(ID id, MTLTYPE_MODEL type_model)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->Type = type_model;
-}
+		m_aUnitMtrls[CurrFirstFree] = umtl;
+		tmpid = CurrFirstFree;
+		++CurrFirstFree;
+	}
 
-bool Materials::MtlGetUsingAlphaTest(ID id)
-{
-	MTL_PRE_COND_ID(id, false);
-	return ArrMaterials[id]->mtl->IsAlphaTest;
+	return tmpid;
 }
 
-void Materials::MtlSetUsingAlphaTest(ID id, bool is_using)
+ID CMaterials::addMaterial(CMaterial* mtl)
 {
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->IsAlphaTest = is_using;
+	m_aMtrls.push_back(mtl);
+	return m_aMtrls.size() - 1;
 }
 
-MTLTYPE_REFLECT Materials::MtlTypeReflection(ID id)
+void CMaterials::addName(const char *szName, ID id)
 {
-	MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE);
-	return ArrMaterials[id]->mtl->LightParam.TypeReflect;
-}
+	String sDir = StrSubstrSpre(szName, "_");
+	String sName = StrSubstrSpost(szName, "_");
 
+	ID idTex = -1;
+	for (int i = 0; i<m_aMtrlPathes.size(); ++i)
+	{
+		if (m_aMtrlPathes[i] && strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), sDir.c_str()) == 0)
+		{
+			idTex = i;
+			break;
+		}
+	}
 
-///////
+	//если мы не нашли совпадений значит путь уникален ...
+	if (idTex == -1)
+	{
+		idTex = m_aMtrlPathes.size();
+		CPath* tmpntlp = new CPath();
+		m_aMtrlPathes.push_back(tmpntlp);
+		m_aMtrlPathes[idTex]->m_sPath = sDir;
+	}
 
-void Materials::MtlRefSetIDArr(ID id, ID inid, int cube, ID idarr)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->setIDArr(inid, cube, idarr);
+	m_aMtrlPathes[idTex]->m_aObjects.push_back(new CPath::CObject(id, sName.c_str()));
 }
 
-ID Materials::MtlRefGetIDArr(ID id, ID inid, int cube)
+bool CMaterials::loadMtl(const char *szName, CMaterial **ppMtrl)
 {
-	MTL_REF_PRE_COND_ID(id,- 1);
-	return ArrMaterials[id]->Reflect->getIDArr(inid, cube);
-}
+	char* ArrRGBA[4] = { "r", "g", "b", "a" };
 
-/*void Materials::MtlRefSetPlane(ID id, D3DXPLANE* plane)
-{
-	MTL_REF_PRE_COND_ID(id);
-	ArrMaterials[id]->Reflect->Plane = *plane;
-}*/
+	char tmpVS[256];
+	char tmpPS[256];
 
-/*void Materials::MtlRefSetCenter(ID id, float3_t* center)
-{
-	MTL_REF_PRE_COND_ID(id);
-	ArrMaterials[id]->Reflect->Position = *center;
-}*/
+	char tmpMask[256];
+	char tmpMicroDiff[4][256];
+	char tmpDetail[4][256];
 
-void Materials::MtlRefPreRenderPlane(ID id, D3DXPLANE* plane)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->preRenderRefPlane(plane);
-}
+	char tmpParamLigth[256];
 
-const IFrustum* Materials::MtlRefGetfrustum(ID id, int cube)
-{
-	MTL_REF_PRE_COND_ID(id, 0);
-	if (cube == 0 || (cube > 0 && (ArrMaterials[id]->Reflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || ArrMaterials[id]->Reflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC)))
-		return ArrMaterials[id]->Reflect->getFrustum(cube);
-	return 0;
-}
+	String sDir = StrSubstrSpre(szName, "_");
+	String sName = StrSubstrSpre(szName, ".");
 
-void Materials::MtlRefPostRenderPlane(ID id)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->postRenderRefPlane();
-}
+	CMaterial* tmpMtl = *ppMtrl;
 
-IDirect3DTexture9* Materials::MtlRefPlaneGetTex(ID id)
-{
- 	MTL_REF_PRE_COND_ID(id, 0);
-	return ArrMaterials[id]->Reflect->getRefPlaneTex();
-}
+	char szPath[1024];
+	sprintf(szPath, "%s%s/%s.mtl", Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS), sDir.c_str(), sName.c_str());
+	if (FileExistsFile(szPath))
+	{
+		ISXConfig* config = Core_OpConfig(szPath);
 
+		//если в конфиге указана текстура то берем ее
+		if (config->keyExists(sName.c_str(), "texture"))
+			tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(config->getKey(sName.c_str(), "texture"), LOAD_TEXTURE_TYPE_LOAD);
+		else //если нет то тогда берем имя материала, может быть он имя текстуры, иначе будет -1
+			tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(szName, LOAD_TEXTURE_TYPE_LOAD);
 
-void Materials::MtlRefSetMinMax(ID id, float3_t* min, float3_t* max)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->setMinMax(min,max);
-}
+		tmpMtl->m_sName = sName.c_str();
 
-bool Materials::MtlRefIsAllowedRender(ID  id)
-{
-	MTL_REF_PRE_COND_ID(id, false);
-	if (ArrMaterials[id]->Reflect)
-		return ArrMaterials[id]->Reflect->allowedRender();
+		tmpVS[0] = 0;
+		if (config->keyExists(sName.c_str(), "vs"))
+			sprintf(tmpVS, "%s", config->getKey(sName.c_str(), "vs"));
 
-	return false;
-}
+		tmpPS[0] = 0;
+		if (config->keyExists(sName.c_str(), "ps"))
+			sprintf(tmpPS, "%s", config->getKey(sName.c_str(), "ps"));
 
 
-void Materials::MtlRefCubeBeginRender(ID id, float3_t* center)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->beginRenderRefCube(center);
-}
+		if (config->keyExists(sName.c_str(), "lighted"))
+			tmpMtl->m_oMainGraphics.m_isUnlit = String(config->getKey(sName.c_str(), "lighted")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_isUnlit = false;
 
-void Materials::MtlRefCubePreRender(ID id, int cube, float4x4* world)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->preRenderRefCube(cube, world);
-}
+		if (config->keyExists(sName.c_str(), "model"))
+			tmpMtl->m_oMainGraphics.type_model = (MTLTYPE_MODEL)String(config->getKey(sName.c_str(), "model")).toInt();
+		else
+			tmpMtl->m_oMainGraphics.type_model = MTLTYPE_MODEL_DEFAULT;
 
-void Materials::MtlRefCubePostRender(ID id, int cube)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->postRenderRefCube(cube);
-}
+		if (config->keyExists(sName.c_str(), "physmaterial"))
+			tmpMtl->m_oPhysics.type_physics = (MTLTYPE_PHYSIC)String(config->getKey(sName.c_str(), "physmaterial")).toInt();
+		else
+			tmpMtl->m_oPhysics.type_physics = MTLTYPE_PHYSIC_DEFAULT;
 
-void Materials::MtlRefCubeEndRender(ID id, float3_t* viewpos)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->endRenderRefCube(viewpos);
-}
 
-bool Materials::MtlRefUpdateCountUpdate( ID id, float3_t* viewpos)
-{
-	MTL_REF_PRE_COND_ID(id, false);
-	return ArrMaterials[id]->Reflect->updateCountUpdate(viewpos);
-}
+		if (STR_VALIDATE(tmpVS))
+			tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, tmpVS, tmpVS, SHADER_CHECKDOUBLE_PATH);
+		else
+			tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
 
-void Materials::MtlRefNullingCountUpdate(ID id)
-{
-	MTL_REF_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->Reflect->nullingCountUpdate();
-}
+		if (STR_VALIDATE(tmpPS))
+			tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, tmpPS, tmpPS, SHADER_CHECKDOUBLE_PATH);
+		else
+			tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
 
-IDirect3DCubeTexture9* Materials::RefCubeGetTex(ID id)
-{
-	MTL_REF_PRE_COND_ID(id, 0);
-	return ArrMaterials[id]->Reflect->getRefCubeTex();
-}
+		tmpMicroDiff[0][0] = 0;
+		if (config->keyExists(sName.c_str(), "microrelief_r"))
+			sprintf(tmpMicroDiff[0], "%s", config->getKey(sName.c_str(), "microrelief_r"));
 
+		if (tmpMicroDiff[0][0] != '0' && tmpMicroDiff[0][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[0] = SGCore_LoadTexAddName(tmpMicroDiff[0], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[0] = -1;
 
-///////
+		tmpMicroDiff[1][0] = 0;
+		if (config->keyExists(sName.c_str(), "microrelief_g"))
+			sprintf(tmpMicroDiff[1], "%s", config->getKey(sName.c_str(), "microrelief_g"));
+		if (tmpMicroDiff[1][0] != '0' && tmpMicroDiff[1][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[1] = SGCore_LoadTexAddName(tmpMicroDiff[1], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[1] = -1;
 
-void Materials::MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type)
-{
-	MTL_PRE_COND_ID(id);
-	ArrMaterials[id]->mtl->PhysicsMaterial = type;
-}
+		tmpMicroDiff[2][0] = 0;
+		if (config->keyExists(sName.c_str(), "microrelief_b"))
+			sprintf(tmpMicroDiff[2], "%s", config->getKey(sName.c_str(), "microrelief_b"));
+		if (tmpMicroDiff[2][0] != '0' && tmpMicroDiff[2][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[2] = SGCore_LoadTexAddName(tmpMicroDiff[2], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[2] = -1;
 
-MTLTYPE_PHYSIC Materials::MtlGetPhysicMaterial(ID id)
-{
-	MTL_PRE_COND_ID(id, MTLTYPE_PHYSIC_CONCRETE);
-	return ArrMaterials[id]->mtl->PhysicsMaterial;
-}
+		tmpMicroDiff[3][0] = 0;
+		if (config->keyExists(sName.c_str(), "microrelief_a"))
+			sprintf(tmpMicroDiff[3], "%s", config->getKey(sName.c_str(), "microrelief_a"));
+		if (tmpMicroDiff[3][0] != '0' && tmpMicroDiff[3][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[3] = SGCore_LoadTexAddName(tmpMicroDiff[3], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aMicroRelief[3] = -1;
 
-void Materials::MtlSetTexture(ID id, const char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->MainTexture = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
-}
 
-void Materials::MtlGetTexture(ID id, char* name)
-{
-	MTL_PRE_COND_ID(id, _VOID);
+		tmpDetail[0][0] = 0;
+		if (config->keyExists(sName.c_str(), "detail_r"))
+			sprintf(tmpDetail[0], "%s", config->getKey(sName.c_str(), "detail_r"));
+		if (tmpDetail[0][0] != '0' && tmpMicroDiff[0][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[0] = SGCore_LoadTexAddName(tmpDetail[0], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[0] = -1;
 
-	if (name && ArrMaterials[id]->mtl->MainTexture >= 0)
-		SGCore_LoadTexGetName(ArrMaterials[id]->mtl->MainTexture, name);
-}
+		tmpDetail[1][0] = 0;
+		if (config->keyExists(sName.c_str(), "detail_g"))
+			sprintf(tmpDetail[1], "%s", config->getKey(sName.c_str(), "detail_g"));
+		if (tmpDetail[1][0] != '0' && tmpMicroDiff[1][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[1] = SGCore_LoadTexAddName(tmpDetail[1], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[1] = -1;
 
-ID Materials::MtlGetTextureID(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
+		tmpDetail[2][0] = 0;
+		if (config->keyExists(sName.c_str(), "detail_b"))
+			sprintf(tmpDetail[2], "%s", config->getKey(sName.c_str(), "detail_b"));
+		if (tmpDetail[2][0] != '0' && tmpMicroDiff[2][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[2] = SGCore_LoadTexAddName(tmpDetail[2], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[2] = -1;
 
-	return ArrMaterials[id]->mtl->MainTexture;
-}
+		tmpDetail[3][0] = 0;
+		if (config->keyExists(sName.c_str(), "detail_a"))
+			sprintf(tmpDetail[3], "%s", config->getKey(sName.c_str(), "detail_a"));
+		if (tmpDetail[3][0] != '0' && tmpMicroDiff[3][0] != 0)
+			tmpMtl->m_oMicroDetail.m_aDetail[3] = SGCore_LoadTexAddName(tmpDetail[3], LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_aDetail[3] = -1;
 
-void Materials::MtlSetVS(ID id, const char* path_vs)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->PreShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, path_vs, path_vs, SHADER_CHECKDOUBLE_PATH);
-}
+		tmpMask[0] = 0;
+		if (config->keyExists(sName.c_str(), "mask"))
+			sprintf(tmpMask, "%s", config->getKey(sName.c_str(), "mask"));
+		if (tmpMask[0] != '0' && tmpMask[0] != 0)
+			tmpMtl->m_oMicroDetail.m_idMask = SGCore_LoadTexAddName(tmpMask, LOAD_TEXTURE_TYPE_LOAD);
+		else
+			tmpMtl->m_oMicroDetail.m_idMask = -1;
 
-void Materials::MtlGetVS(ID id, char* name)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, ArrMaterials[id]->mtl->PreShaderVS, name);
-}
 
-void Materials::MtlSetPS(ID id, const char* path_ps)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->PreShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, path_ps, path_ps, SHADER_CHECKDOUBLE_PATH);
-}
+		tmpMtl->m_oLightParam.m_fRoughness = MTL_LIGHTING_DEFAULT_ROUGHNESS;
+		tmpMtl->m_oLightParam.m_fF0 = MTL_LIGHTING_DEFAULT_F0;
+		tmpMtl->m_oLightParam.m_fThickness = MTL_LIGHTING_DEFAULT_THICKNESS;
 
-void Materials::MtlGetPS(ID id, char* name)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, ArrMaterials[id]->mtl->PreShaderPS, name);
-}
+		if (config->keyExists(sName.c_str(), "roughness"))
+			tmpMtl->m_oLightParam.m_fRoughness = String(config->getKey(sName.c_str(), "roughness")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "f0"))
+			tmpMtl->m_oLightParam.m_fF0 = String(config->getKey(sName.c_str(), "f0")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "thickness"))
+			tmpMtl->m_oLightParam.m_fThickness = String(config->getKey(sName.c_str(), "thickness")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "durability"))
+			tmpMtl->m_oPhysics.m_fDurability = String(config->getKey(sName.c_str(), "durability")).toDouble();
 
-void Materials::MtlSetLighting(ID id, bool is_lighting)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->IsUnlit = !is_lighting;
-}
+		if (config->keyExists(sName.c_str(), "hit_chance"))
+			tmpMtl->m_oPhysics.m_fHitChance = String(config->getKey(sName.c_str(), "hit_chance")).toDouble();
 
-bool Materials::MtlGetLighting(ID id)
-{
-	MTL_PRE_COND_ID(id, false);
-	return !ArrMaterials[id]->mtl->IsUnlit;
-}
+		if (config->keyExists(sName.c_str(), "density"))
+			tmpMtl->m_oPhysics.m_fDensity = String(config->getKey(sName.c_str(), "density")).toDouble();
 
+		tmpMtl->m_oLightParam.m_idTexParamHand = createTexParamLighting(tmpMtl->m_oLightParam.m_fRoughness, tmpMtl->m_oLightParam.m_fF0, tmpMtl->m_oLightParam.m_fThickness);
 
-void Materials::MtlSetIsTextureLighting(ID id, bool is_tex_lighting)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.IsTextureParam = is_tex_lighting;
-}
+		//говорим что не установлено использовать ли текстуру или нет
+		int istexparam = -1;
 
-bool Materials::MtlGetIsTextureLighting(ID id)
-{
-	MTL_PRE_COND_ID(id, false);
-	return ArrMaterials[id]->mtl->LightParam.IsTextureParam;
-}
+		//если есть ключ использования текстуры то грузим
+		if (config->keyExists(sName.c_str(), "use_texparamlight"))
+			istexparam = String(config->getKey(sName.c_str(), "use_texparamlight")).toBool();
 
+		tmpParamLigth[0] = 0;
+		if (config->keyExists(sName.c_str(), "texparamligth"))
+			sprintf(tmpParamLigth, "%s", config->getKey(sName.c_str(), "texparamligth"));
 
-void Materials::MtlSetTextureLighting(ID id, const char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.ParamTex = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
-}
+		//если текстура с параметрами освещения была определена
+		if (tmpParamLigth[0] != '0' && tmpParamLigth[0] != 0)
+		{
+			tmpMtl->m_oLightParam.m_idTexParam = SGCore_LoadTexAddName(tmpParamLigth, LOAD_TEXTURE_TYPE_LOAD);
+			//если использование параметров освещения из текстуры не было определено
+			if (istexparam == -1)
+				tmpMtl->m_oLightParam.m_isTextureParam = true;
+			else
+				tmpMtl->m_oLightParam.m_isTextureParam = istexparam;
+		}
+		//если использование параметров освещения из текстуры не было определено
+		else if (istexparam == -1)
+		{
+			tmpMtl->m_oLightParam.m_isTextureParam = false;
+		}
 
-void Materials::MtlGetTextureLighting(ID id, char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	if (path_tex && ArrMaterials[id]->mtl->LightParam.ParamTex >= 0)
-	{
-		SGCore_LoadTexGetName(ArrMaterials[id]->mtl->LightParam.ParamTex, path_tex);
-		if (path_tex[0] == MTL_VIRTUAL_DIR_HAND_MTL)
-			path_tex[0] = 0;
-	}
-	else if (path_tex)
-		path_tex[0] = 0;
-}
 
+		if (config->keyExists(sName.c_str(), "transparent"))
+			tmpMtl->m_oLightParam.m_isTransparent = String(config->getKey(sName.c_str(), "transparent")).toBool();
+		else
+			tmpMtl->m_oLightParam.m_isTransparent = false;
 
-void Materials::MtlSetRoughness(ID id, float roughness)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.RoughnessValue = roughness;
-}
 
-float Materials::MtlGetRoughness(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->LightParam.RoughnessValue;
-}
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransView = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransProjection =
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransPosCam =
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserData = false;
 
+		if (config->keyExists(sName.c_str(), "vs_world"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = String(config->getKey(sName.c_str(), "vs_world")).toInt();
 
-void Materials::MtlSetF0(ID id, float f0)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.F0Value = f0;
-}
+		if (config->keyExists(sName.c_str(), "vs_view"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransView = String(config->getKey(sName.c_str(), "vs_view")).toInt();
 
-float Materials::MtlGetF0(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->LightParam.F0Value;
-}
+		if (config->keyExists(sName.c_str(), "vs_projection"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransProjection = String(config->getKey(sName.c_str(), "vs_projection")).toInt();
 
-void Materials::MtlSetThickness(ID id, float thickness)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.ThicknessValue = thickness;
-}
+		if (config->keyExists(sName.c_str(), "vs_worldview"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = String(config->getKey(sName.c_str(), "vs_worldview")).toInt();
 
-float Materials::MtlGetThickness(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->LightParam.ThicknessValue;
-}
+		if (config->keyExists(sName.c_str(), "vs_worldviewprojection"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = String(config->getKey(sName.c_str(), "vs_worldviewprojection")).toInt();
 
-void Materials::MtlSetPenetration(ID id, float penetration)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->Penetration = penetration;
-}
+		if (config->keyExists(sName.c_str(), "vs_poscam"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = String(config->getKey(sName.c_str(), "vs_poscam")).toInt();
 
-float Materials::MtlGetPenetration(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->Penetration;
-}
+		if (config->keyExists(sName.c_str(), "vs_timedelta"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = String(config->getKey(sName.c_str(), "vs_timedelta")).toInt();
 
+		if (config->keyExists(sName.c_str(), "vs_winsize"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = String(config->getKey(sName.c_str(), "vs_winsize")).toInt();
 
-void Materials::MtlSetHitChance(ID id, float fHitChance)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->HitChance = fHitChance;
-}
+		if (config->keyExists(sName.c_str(), "vs_userdata"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserData = String(config->getKey(sName.c_str(), "vs_userdata")).toInt();
 
-float Materials::MtlGetHitChance(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->HitChance;
-}
 
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData = float4(0, 0, 0, 0);
+		if (config->keyExists(sName.c_str(), "vs_userdata_x"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.x = String(config->getKey(sName.c_str(), "vs_userdata_x")).toDouble();
 
-void Materials::MtlSetDensity(ID id, float fDensity)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->Density = fDensity;
-}
+		if (config->keyExists(sName.c_str(), "vs_userdata_y"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.y = String(config->getKey(sName.c_str(), "vs_userdata_y")).toDouble();
 
-float Materials::MtlGetDensity(ID id)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->Density;
-}
+		if (config->keyExists(sName.c_str(), "vs_userdata_z"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.z = String(config->getKey(sName.c_str(), "vs_userdata_z")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "vs_userdata_w"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_vUserData.w = String(config->getKey(sName.c_str(), "vs_userdata_w")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "vs_userdata_trans_ps"))
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = String(config->getKey(sName.c_str(), "vs_userdata_trans_ps")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = false;
 
-void Materials::MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.TypeRefraction = type;
-}
 
-MTLTYPE_TRANSPARENCY Materials::MtlGetTypeTransparency(ID id)
-{
-	MTL_PRE_COND_ID(id, MTLTYPE_TRANSPARENCY_NONE);
-	return ArrMaterials[id]->mtl->LightParam.TypeRefraction;
-}
+		tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorld = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransView = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransProjection =
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransPosCam =
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = false;
 
+		if (config->keyExists(sName.c_str(), "ps_world"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorld = String(config->getKey(sName.c_str(), "ps_world")).toInt();
 
-void Materials::MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->LightParam.TypeReflect = type;
+		if (config->keyExists(sName.c_str(), "ps_view"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransView = String(config->getKey(sName.c_str(), "ps_view")).toInt();
 
-	if (ArrMaterials[id]->mtl->LightParam.TypeReflect != MTLTYPE_REFLECT_NONE)
-	{
-		if (!ArrMaterials[id]->Reflect)
-			ArrMaterials[id]->Reflect = new CReflection();
+		if (config->keyExists(sName.c_str(), "ps_projection"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransProjection = String(config->getKey(sName.c_str(), "ps_projection")).toInt();
 
-		ArrMaterials[id]->Reflect->init(ArrMaterials[id]->mtl->LightParam.TypeReflect);
-	}
-}
+		if (config->keyExists(sName.c_str(), "ps_worldview"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = String(config->getKey(sName.c_str(), "ps_worldview")).toInt();
 
-MTLTYPE_REFLECT Materials::MtlGetTypeReflection(ID id)
-{
-	MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE);
-	return ArrMaterials[id]->mtl->LightParam.TypeReflect;
-}
+		if (config->keyExists(sName.c_str(), "ps_worldviewprojection"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = String(config->getKey(sName.c_str(), "ps_worldviewprojection")).toInt();
 
+		if (config->keyExists(sName.c_str(), "ps_poscam"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = String(config->getKey(sName.c_str(), "ps_poscam")).toInt();
 
+		if (config->keyExists(sName.c_str(), "ps_timedelta"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = String(config->getKey(sName.c_str(), "ps_timedelta")).toInt();
 
+		if (config->keyExists(sName.c_str(), "ps_winsize"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = String(config->getKey(sName.c_str(), "ps_winsize")).toInt();
 
-void Materials::MtlSetMaskTex(ID id, const char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->MicroDetail.Mask = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
-}
+		if (config->keyExists(sName.c_str(), "ps_userdata"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = String(config->getKey(sName.c_str(), "ps_userdata")).toInt();
 
-void Materials::MtlGetMaskTex(ID id, char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	if (path_tex && ArrMaterials[id]->mtl->MicroDetail.Mask >= 0)
-		SGCore_LoadTexGetName(ArrMaterials[id]->mtl->MicroDetail.Mask, path_tex);
-	else if (path_tex)
-		path_tex[0] = 0;
-}
+		tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0);
 
-void Materials::MtlSetMRTex(ID id, int channel, const char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->MicroDetail.ArrMicroDiffuse[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
-}
+		if (config->keyExists(sName.c_str(), "ps_userdata_x"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.x = String(config->getKey(sName.c_str(), "ps_userdata_x")).toDouble();
 
-void Materials::MtlGetMRTex(ID id, int channel, char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	if (path_tex && ArrMaterials[id]->mtl->MicroDetail.ArrMicroDiffuse[channel] >= 0)
-		SGCore_LoadTexGetName(ArrMaterials[id]->mtl->MicroDetail.ArrMicroDiffuse[channel], path_tex);
-	else if (path_tex)
-		path_tex[0] = 0;
-}
+		if (config->keyExists(sName.c_str(), "ps_userdata_y"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.y = String(config->getKey(sName.c_str(), "ps_userdata_y")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "ps_userdata_z"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.z = String(config->getKey(sName.c_str(), "ps_userdata_z")).toDouble();
 
-void Materials::MtlSetDTex(ID id, int channel, const char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->MicroDetail.ArrDeatail[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
-}
-
-void Materials::MtlGetDTex(ID id, int channel, char* path_tex)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	if (path_tex && ArrMaterials[id]->mtl->MicroDetail.ArrDeatail[channel] >= 0)
-		SGCore_LoadTexGetName(ArrMaterials[id]->mtl->MicroDetail.ArrDeatail[channel], path_tex);
-	else if (path_tex)
-		path_tex[0] = 0;
-}
-
+		if (config->keyExists(sName.c_str(), "ps_userdata_w"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData.w = String(config->getKey(sName.c_str(), "ps_userdata_w")).toDouble();
 
+		if (config->keyExists(sName.c_str(), "ps_userdata_trans_vs"))
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = String(config->getKey(sName.c_str(), "ps_userdata_trans_vs")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = false;
 
-void Materials::MtlSetSTDVS(ID id, MTL_SHADERSTD type, bool is_send)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	if (type == MTL_SHADERSTD_MATRIX_WORLD)
-		ArrMaterials[id]->mtl->VS.IsTransWorld = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
-		ArrMaterials[id]->mtl->VS.IsTransView = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
-		ArrMaterials[id]->mtl->VS.IsTransProjection = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
-		ArrMaterials[id]->mtl->VS.IsTransWorldView = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
-		ArrMaterials[id]->mtl->VS.IsTransWorldViewProjection = is_send;
+		if (config->keyExists(sName.c_str(), "reflection"))
+			tmpMtl->m_oLightParam.m_type_reflect = (MTLTYPE_REFLECT)String(config->getKey(sName.c_str(), "reflection")).toInt();
 
-	else if (type == MTL_SHADERSTD_CAMPOS)
-		ArrMaterials[id]->mtl->VS.IsTransPosCam = is_send;
-	else if (type == MTL_SHADERSTD_TIMEDELTA)
-		ArrMaterials[id]->mtl->VS.IsTransTimeDelta = is_send;
+		if (config->keyExists(sName.c_str(), "alphatest"))
+			tmpMtl->m_oMainGraphics.m_useAlphaTest = String(config->getKey(sName.c_str(), "alphatest")).toBool();
+		else
+			tmpMtl->m_oMainGraphics.m_useAlphaTest = false;
 
-	else if (type == MTL_SHADERSTD_USERDATA)
-		ArrMaterials[id]->mtl->VS.IsTransUserData = is_send;
+		return true;
+	}
 
-	else if (type == MTL_SHADERSTD_WINSIZE)
-		ArrMaterials[id]->mtl->VS.IsTransWinSize = is_send;
+	return false;
 }
 
-bool Materials::MtlGetSTDVS(ID id, MTL_SHADERSTD type)
+ID CMaterials::createTexParamLighting(float roughness, float f0, float thickness)
 {
-	MTL_PRE_COND_ID(id, false);
-	if (type == MTL_SHADERSTD_MATRIX_WORLD)
-		return ArrMaterials[id]->mtl->VS.IsTransWorld;
-	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
-		return ArrMaterials[id]->mtl->VS.IsTransView;
-	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
-		return ArrMaterials[id]->mtl->VS.IsTransProjection;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
-		return ArrMaterials[id]->mtl->VS.IsTransWorldView;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
-		return ArrMaterials[id]->mtl->VS.IsTransWorldViewProjection;
+	IDirect3DTexture9* TexMaterial;
+	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &TexMaterial, NULL);
+	D3DLOCKED_RECT LockedRect;
+	uint32_t tmpColor = D3DCOLOR_ARGB(255, DWORD(roughness*255.f), DWORD(f0*255.f), DWORD(thickness*255.f));
 
-	else if (type == MTL_SHADERSTD_CAMPOS)
-		return ArrMaterials[id]->mtl->VS.IsTransPosCam;
-	else if (type == MTL_SHADERSTD_TIMEDELTA)
-		return ArrMaterials[id]->mtl->VS.IsTransTimeDelta;
+	TexMaterial->LockRect(0, &LockedRect, 0, 0);
 
-	else if (type == MTL_SHADERSTD_USERDATA)
-		return ArrMaterials[id]->mtl->VS.IsTransUserData;
+	uint32_t* tmpOldColor = (uint32_t*)LockedRect.pBits + 0 * LockedRect.Pitch + 0 * sizeof(uint32_t);
+	memcpy(tmpOldColor, &tmpColor, sizeof(uint32_t));
 
-	else if (type == MTL_SHADERSTD_WINSIZE)
-		return ArrMaterials[id]->mtl->VS.IsTransWinSize;
+	TexMaterial->UnlockRect(0);
 
-	return(false);
+	//SGCore_LoadTexLoadTextures();
+
+	char nametex[64];
+	sprintf(nametex, "%c_%d_%d_%d", MTL_VIRTUAL_DIR_HAND_MTL, m_aUnitMtrls.size(), rand() % 9999, rand() % 9999);
+
+	return SGCore_LoadTexCreate(nametex, TexMaterial);
 }
 
-void Materials::MtlSetSTDPS(ID id, MTL_SHADERSTD type, bool is_send)
+void CMaterials::createMtl(const char* name, CMaterial** mtl, MTLTYPE_MODEL type)
 {
-	MTL_PRE_COND_ID(id, _VOID);
-	if (type == MTL_SHADERSTD_MATRIX_WORLD)
-		ArrMaterials[id]->mtl->PS.IsTransWorld = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
-		ArrMaterials[id]->mtl->PS.IsTransView = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
-		ArrMaterials[id]->mtl->PS.IsTransProjection = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
-		ArrMaterials[id]->mtl->PS.IsTransWorldView = is_send;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
-		ArrMaterials[id]->mtl->PS.IsTransWorldViewProjection = is_send;
+	CMaterial* tmpMtl = *mtl;
+	new(tmpMtl)CMaterial*;
+	//если такого материала не существует, то мы должны были задать примерный тип материала
+	tmpMtl->m_oMainGraphics.type_model = type;
+	//обычна¤ геометри¤
+	if (type == MTLTYPE_MODEL_STATIC)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
+	}
+	//деревь¤
+	else if (type == MTLTYPE_MODEL_TREE)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+		//tmpMtl->RenderStates.m_oMainGraphics.m_useAlphaTest = true;
+	}
+	//трава
+	else if (type == MTLTYPE_MODEL_GRASS)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
+		//tmpMtl->RenderStates.m_oMainGraphics.m_useAlphaTest = true;
+	}
+	//анимационная модель
+	else if (type == MTLTYPE_MODEL_SKIN)
+	{
+		tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlskin_base.vs");
+		tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlskin_base.ps");
+		tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorld = true;
+	}
+	//источник света
+	/*else if (type == MTL_LIGHT)
+	{
+	tmpMtl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderGetID(0, "mtrlgeom_base.vs");
+	tmpMtl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderGetID(1, "mtrlgeom_light.ps");
+	tmpMtl->IsForwardRender = true;
+	tmpMtl->m_oMainGraphics.m_oDataPS.m_isTransUserData = true;
+	tmpMtl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0);
+	}*/
 
-	else if (type == MTL_SHADERSTD_CAMPOS)
-		ArrMaterials[id]->mtl->PS.IsTransPosCam = is_send;
-	else if (type == MTL_SHADERSTD_TIMEDELTA)
-		ArrMaterials[id]->mtl->PS.IsTransTimeDelta = is_send;
+	tmpMtl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD);
+	tmpMtl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = true;
 
-	else if (type == MTL_SHADERSTD_USERDATA)
-		ArrMaterials[id]->mtl->PS.IsTransUserData = is_send;
+	tmpMtl->m_oLightParam.m_fRoughness = MTL_LIGHTING_DEFAULT_ROUGHNESS;
+	tmpMtl->m_oLightParam.m_fF0 = MTL_LIGHTING_DEFAULT_F0;
+	tmpMtl->m_oLightParam.m_fThickness = MTL_LIGHTING_DEFAULT_THICKNESS;
 
-	else if (type == MTL_SHADERSTD_WINSIZE)
-		ArrMaterials[id]->mtl->PS.IsTransWinSize = is_send;
+	tmpMtl->m_oLightParam.m_idTexParam = -1;
+	tmpMtl->m_oLightParam.m_isTextureParam = false;
+	tmpMtl->m_oLightParam.m_idTexParamHand = createTexParamLighting(tmpMtl->m_oLightParam.m_fRoughness, tmpMtl->m_oLightParam.m_fF0, tmpMtl->m_oLightParam.m_fThickness);
+
+	//char path[1024];
+	char tmp_name[256];
+	bool IsTruePath = false;
+
+	for (DWORD k = 0; k<strlen(name); k++)
+	{
+		if (name[k] == '.')
+		{
+			sprintf(tmp_name, "%s", name);
+			tmp_name[k] = 0;
+			IsTruePath = true;
+			break;
+		}
+	}
+
+	tmpMtl->m_sName = tmp_name;
 }
 
-bool Materials::MtlGetSTDPS(ID id, MTL_SHADERSTD type)
+ID CMaterials::mtlLoad(const char* name, MTLTYPE_MODEL type)
 {
-	MTL_PRE_COND_ID(id, false);
-	if (type == MTL_SHADERSTD_MATRIX_WORLD)
-		return ArrMaterials[id]->mtl->PS.IsTransWorld;
-	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
-		return ArrMaterials[id]->mtl->PS.IsTransView;
-	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
-		return ArrMaterials[id]->mtl->PS.IsTransProjection;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
-		return ArrMaterials[id]->mtl->PS.IsTransWorldView;
-	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
-		return ArrMaterials[id]->mtl->PS.IsTransWorldViewProjection;
+	ID IsLoad = exists(name);
 
-	else if (type == MTL_SHADERSTD_CAMPOS)
-		return ArrMaterials[id]->mtl->PS.IsTransPosCam;
-	else if (type == MTL_SHADERSTD_TIMEDELTA)
-		return ArrMaterials[id]->mtl->PS.IsTransTimeDelta;
+	if (IsLoad >= 0)
+	{
+		CUnitMaterial* tmpumtl = new CUnitMaterial();
+		tmpumtl->m_pMtrl = m_aUnitMtrls[IsLoad]->m_pMtrl;
 
-	else if (type == MTL_SHADERSTD_USERDATA)
-		return ArrMaterials[id]->mtl->PS.IsTransUserData;
+		if (m_aUnitMtrls[IsLoad]->m_pReflect){
+			CUnitMaterial* tmpmtl = m_aUnitMtrls[IsLoad];
+			tmpumtl->m_pReflect = new CReflection();
+			tmpumtl->m_pReflect->init(m_aUnitMtrls[IsLoad]->m_pReflect->getTypeReflect());
+		}
 
-	else if (type == MTL_SHADERSTD_WINSIZE)
-		return ArrMaterials[id]->mtl->PS.IsTransWinSize;
-	return(false);
-}
+		return addUnitMaterial(tmpumtl);
+	}
+	else
+	{
+		CUnitMaterial* tmpumtl = new CUnitMaterial();
+		tmpumtl->m_pMtrl = new CMaterial();
+		addMaterial(tmpumtl->m_pMtrl);
+		if (!loadMtl(name, &(tmpumtl->m_pMtrl)))
+		{
+			createMtl(name, &(tmpumtl->m_pMtrl), type);
+		}
+		else
+		{
+			if (tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE)
+			{
+				tmpumtl->m_pReflect = new CReflection();
+				tmpumtl->m_pReflect->init(tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect);
+			}
+		}
 
+		ID tmpid = addUnitMaterial(tmpumtl);
 
-void Materials::MtlSetUDVS(ID id, int component, float val)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->VS.Param[component] = val;
+		addName(name, tmpid);
+		return tmpid;
+	}
 }
 
-float Materials::MtlGetUDVS(ID id, int component)
+void CMaterials::mtlReLoad(ID id, const char* name)
 {
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->VS.Param[component];
+	MTL_PRE_COND_ID(id);
+	CUnitMaterial* tmpumtl = m_aUnitMtrls[id];
+	char tmpname[1024];
+	if (name == 0)
+		sprintf(tmpname, "%s.dds", tmpumtl->m_pMtrl->m_sName.c_str());
+	else
+		sprintf(tmpname, "%s", name);
+
+	tmpumtl->m_pMtrl->nulling();
+	if (!loadMtl(tmpname, &(tmpumtl->m_pMtrl)))
+	{
+		createMtl(name, &(tmpumtl->m_pMtrl), tmpumtl->m_pMtrl->m_oMainGraphics.type_model);
+	}
+	else
+	{
+		if (tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE)
+		{
+			tmpumtl->m_pReflect = new CReflection();
+			tmpumtl->m_pReflect->init(tmpumtl->m_pMtrl->m_oLightParam.m_type_reflect);
+		}
+	}
 }
 
-void Materials::MtlSetUDVS_InPS(ID id, bool is_send_ps)
+void CMaterials::mtlSave(ID id)
 {
 	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->TransVSDataInPS = is_send_ps;
-}
 
-bool Materials::MtlGetUDVS_InPS(ID id)
-{
-	MTL_PRE_COND_ID(id, false);
-	return ArrMaterials[id]->mtl->TransVSDataInPS;
-}
+	char* ArrRGBA[4] = { "r", "g", "b", "a" };
 
+	CMaterial* mtrl = m_aUnitMtrls[id]->m_pMtrl;
 
-void Materials::MtlSetUDPS(ID id, int component, float val)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->PS.Param[component] = val;
-}
+	String sDir = StrSubstrSpre(mtrl->m_sName.c_str(), "_");
+	String sPath = String(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS)) + sDir + "/";
 
-float Materials::MtlGetUDPS(ID id, int component)
-{
-	MTL_PRE_COND_ID(id, -1);
-	return ArrMaterials[id]->mtl->PS.Param[component];
-}
+	FileCreateDir(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS));
+	FileCreateDir(sPath.c_str());
+	sPath += FileSetStrExt(mtrl->m_sName.c_str(), ".mtl");
 
-void Materials::MtlSetUDPS_InPS(ID id, bool is_send_vs)
-{
-	MTL_PRE_COND_ID(id, _VOID);
-	ArrMaterials[id]->mtl->TransPSDataInVS = is_send_vs;
-}
+	FILE* file = 0;
+	file = fopen(sPath.c_str(), "w");
 
-bool Materials::MtlGetUDPS_InPS(ID id)
-{
-	MTL_PRE_COND_ID(id, false);
-	return ArrMaterials[id]->mtl->TransPSDataInVS;
-}
+	fprintf(file, "[%s]\n", mtrl->m_sName.c_str());
 
+	char tmpPathVSName[1024];
+	char tmpPathPSName[1024];
 
-///////
+	char tmpPathMaskName[1024];
 
-ID Materials::IsExists(const char* name)
-{
-	char tmp_path[MTL_MAX_SIZE_DIR];//папка
-	char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением
-	long id = -1;
-	bool IsTruePath = false;
-	//обрезаем имя текстуры и папку
-	for (int i = 0; i<strlen(name); i++)
-	{
-		if (name[i] == '_')
-		{
-			memcpy(tmp_path, name, sizeof(char)*i);
-			tmp_path[i] = 0;
-			sprintf(tmp_name, "%s", name + i + 1);
-			IsTruePath = true;
-			break;
-		}
-	}
+	SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, mtrl->m_oMainGraphics.m_idShaderVS, tmpPathVSName);
+	SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, mtrl->m_oMainGraphics.m_idShaderPS, tmpPathPSName);
 
-	if (!IsTruePath)
+	fprintf(file, "model = %d\n", mtrl->m_oMainGraphics.type_model);
+	fprintf(file, "lighted = %d\n", mtrl->m_oMainGraphics.m_isUnlit);
+	fprintf(file, "physmaterial = %d\n", mtrl->m_oPhysics.type_physics);
+
+	fprintf(file, "vs = %s\n", tmpPathVSName);
+	fprintf(file, "ps = %s\n", tmpPathPSName);
+
+	fprintf(file, "alphatest = %d\n", mtrl->m_oMainGraphics.m_useAlphaTest);
+
+	char namebasetex[256];
+	namebasetex[0] = '0';
+	namebasetex[1] = '\0';
+	SGCore_LoadTexGetName(mtrl->m_oMainGraphics.m_idMainTexture, namebasetex);
+	fprintf(file, "texture = %s\n\n", namebasetex);
+
+	if (mtrl->m_oMicroDetail.m_idMask == -1)
 	{
-		return -2;
-		//LibReport(REPORT_MSG_LEVEL_ERROR, "%s - wrong texture name [%s]!!!", gen_msg_location, name);
+		tmpPathMaskName[0] = '0';
+		tmpPathMaskName[1] = 0;
 	}
+	else
+		SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_idMask, tmpPathMaskName);
+
+	fprintf(file, "mask = %s\n", tmpPathMaskName);
 
-	long tmpkey = -1;	//переменная в которой храним ключ от массива в который записываем
-	for (long i = 0; i<ArrHMtls.size(); ++i)
+	for (int k = 0; k<4; k++)
 	{
-		//TLPath* tmptlpath = ArrHMtls[i];
-		if (ArrHMtls[i] && strcmp(ArrHMtls[i]->Path.c_str(), tmp_path) == 0)
+		if (mtrl->m_oMicroDetail.m_aMicroRelief[k] == -1)
 		{
-			tmpkey = i;
-			break;
+			tmpPathMaskName[0] = '0';
+			tmpPathMaskName[1] = 0;
 		}
-	}
+		else
+			SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_aMicroRelief[k], tmpPathMaskName);
 
-	//если мы не нашли совпадений значит путь уникален ...
-	if (tmpkey == -1)
-	{
-		return -1;
+		fprintf(file, "microrelief_%s = %s\n", ArrRGBA[k], tmpPathMaskName);
 	}
 
-	//проверяем записано ли уже имя текстуры
-	for (int i = 0; i<ArrHMtls[tmpkey]->ArrTex.size(); i++)
+	for (int k = 0; k<4; k++)
 	{
-		if (strcmp(ArrHMtls[tmpkey]->ArrTex[i]->name.c_str(), tmp_name) == 0)
+		if (mtrl->m_oMicroDetail.m_aDetail[k] == -1)
 		{
-			id = ArrHMtls[tmpkey]->ArrTex[i]->id;
-			break;
+			tmpPathMaskName[0] = '0';
+			tmpPathMaskName[1] = 0;
 		}
+		else
+			SGCore_LoadTexGetName(mtrl->m_oMicroDetail.m_aDetail[k], tmpPathMaskName);
+
+		fprintf(file, "detail_%s = %s\n", ArrRGBA[k], tmpPathMaskName);
 	}
 
-	return id;
-}
+	fprintf(file, "\n");
 
-ID Materials::AddUnitMaterial(UnitMaterial* umtl)
-{
-	ID tmpid = -1;
-	if (CurrFirstFree + 1 == ArrMaterials.size())
+	fprintf(file, "vs_world = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld);
+	fprintf(file, "vs_view = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransView);
+	fprintf(file, "vs_projection = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection);
+	fprintf(file, "vs_worldview = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView);
+	fprintf(file, "vs_worldviewprojection = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection);
+
+	fprintf(file, "vs_poscam = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam);
+	fprintf(file, "vs_timedelta = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta);
+	fprintf(file, "vs_winsize = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize);
+	fprintf(file, "vs_userdata = %d\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData);
+	fprintf(file, "vs_userdata_x = %f\nvs_userdata_y = %f\nvs_userdata_z = %f\nvs_userdata_w = %f\n", mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.x, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.y, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.z, mtrl->m_oMainGraphics.m_oDataVS.m_vUserData.w);
+	fprintf(file, "vs_userdata_trans_ps = %d\n\n", mtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader);
+
+	fprintf(file, "ps_world = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld);
+	fprintf(file, "ps_view = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransView);
+	fprintf(file, "ps_projection = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection);
+	fprintf(file, "ps_worldview = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView);
+	fprintf(file, "ps_worldviewprojection = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection);
+
+	fprintf(file, "ps_poscam = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam);
+	fprintf(file, "ps_timedelta = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta);
+	fprintf(file, "ps_winsize = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize);
+	fprintf(file, "ps_userdata = %d\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData);
+	fprintf(file, "ps_userdata_x = %f\nps_userdata_y = %f\nps_userdata_z = %f\nps_userdata_w = %f\n", mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.x, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.y, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.z, mtrl->m_oMainGraphics.m_oDataPS.m_vUserData.w);
+	fprintf(file, "ps_userdata_trans_vs = %d\n\n", mtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader);
+
+	if (mtrl->m_oLightParam.m_idTexParam == -1)
 	{
-		ArrMaterials.push_back(umtl);
-		CurrFirstFree = tmpid = ArrMaterials.size() - 1;
+		tmpPathMaskName[0] = '0';
+		tmpPathMaskName[1] = 0;
 	}
 	else
-	{
-		if (CurrFirstFree < 0 || ArrMaterials[CurrFirstFree] != 0)
-		{
-			if (CurrFirstFree < 0)
-				CurrFirstFree = 0;
+		SGCore_LoadTexGetName(mtrl->m_oLightParam.m_idTexParam, tmpPathMaskName);
 
-			for (int i = CurrFirstFree; i < ArrMaterials.size(); ++i)
-			{
-				if (ArrMaterials[i] == 0)
-				{
-					CurrFirstFree = i;
-					break;
-				}
-			}
-		}
+	if (tmpPathMaskName[0] == MTL_VIRTUAL_DIR_HAND_MTL)
+		sprintf(tmpPathMaskName, "0");
+	//else
+		fprintf(file, "use_texparamlight = %d\n", mtrl->m_oLightParam.m_isTextureParam);
 
-		ArrMaterials[CurrFirstFree] = umtl;
-		tmpid = CurrFirstFree;
-		++CurrFirstFree;
-	}
+	fprintf(file, "texparamligth = %s\n", tmpPathMaskName);
 
-	return tmpid;
+	fprintf(file, "roughness = %f\n", mtrl->m_oLightParam.m_fRoughness);
+	fprintf(file, "f0 = %f\n", mtrl->m_oLightParam.m_fF0);
+	fprintf(file, "thickness = %f\n", mtrl->m_oLightParam.m_fThickness);
+	fprintf(file, "durability = %f\n", mtrl->m_oPhysics.m_fDurability);
+	fprintf(file, "hit_chance = %f\n", mtrl->m_oPhysics.m_fHitChance);
+	fprintf(file, "density = %f\n\n", mtrl->m_oPhysics.m_fDensity);
+
+	fprintf(file, "transparent = %d\n", mtrl->m_oLightParam.m_isTransparent);
+	fprintf(file, "reflection = %d\n", mtrl->m_oLightParam.m_type_reflect);
+
+	fclose(file);
 }
 
-ID Materials::AddMaterial(Material* mtl)
+//##########################################################################
+
+int CMaterials::delRefCount()
 {
-	ArrMtrls.push_back(mtl);
-	return ArrMtrls.size() - 1;
+	return m_aReflections.size();
 }
 
-void Materials::AddName(const char* name, ID id)
+ID CMaterials::delRefGetIDArr(ID key, ID inid, int cube)
 {
-	char tmp_path[MTL_MAX_SIZE_DIR];//папка
-	char tmp_name[MTL_MAX_SIZE_NAME];//само имя текстыр с расширением
+	if (!(key >= 0 && key < m_aReflections.size()))
+		return -1;
 
-	bool IsTruePath = false;
-	//обрезаем имя текстуры и папку
-	for (int i = 0; i<strlen(name); i++)
+	return m_aReflections[key]->getIDArr(inid, cube);
+}
+
+void CMaterials::delRefAllDel()
+{
+	for (int i = 0; i < m_aReflections.size(); ++i)
 	{
-		if (name[i] == '_')
-		{
-			memcpy(tmp_path, name, sizeof(char)*i);
-			tmp_path[i] = 0;
-			sprintf(tmp_name, "%s", name + i + 1);
-			IsTruePath = true;
-			break;
-		}
+		mem_delete(m_aReflections[i]);
 	}
 
-	long tmpkey = -1;	//переменная в которой храним ключ от массива в который записываем
-	for (long i = 0; i<ArrHMtls.size(); ++i)
+	m_aReflections.clear();
+}
+
+//##########################################################################
+
+void CMaterials::clear(bool isClearRefDel)
+{
+	int tmpcountdel = 0;
+	
+	for (int i = 0; i < m_aMtrlPathes.size(); ++i)
 	{
-		if (ArrHMtls[i] && strcmp(ArrHMtls[i]->Path.c_str(), tmp_path) == 0)
+		if (strcmp(m_aMtrlPathes[i]->m_sPath.c_str(), MTL_VIRTUAL_DIR_STD_MTL) != 0)
 		{
-			tmpkey = i;
-			break;
-		}
-	}
+			for (int k = 0; k < m_aMtrlPathes[i]->m_aObjects.size(); ++k)
+			{
+				mem_delete(m_aMtrlPathes[i]->m_aObjects[k]);
+				m_aMtrlPathes[i]->m_aObjects.erase(k);
+				--k;
+				++tmpcountdel;
+			}
 
-	//если мы не нашли совпадений значит путь уникален ...
-	if (tmpkey == -1)
-	{
-		tmpkey = ArrHMtls.size();
-		TLPath* tmpntlp = new TLPath();
-		ArrHMtls.push_back(tmpntlp);
-		ArrHMtls[tmpkey]->Path = tmp_path;
+			if (m_aMtrlPathes.size() <= 0)
+			{
+				mem_delete(m_aMtrlPathes[i]);
+				m_aMtrlPathes.erase(i);
+				--i;
+			}
+		}
 	}
 
-	ArrHMtls[tmpkey]->ArrTex.push_back(new TLPath::TLTex(id, tmp_name));
-	//ArrHMtls[tmpkey]->ArrTex.push_back(tmp_name);
-	//ArrHMtls[tmpkey]->ArrID.push_back(id);
-}
-
-bool Materials::LoadMtl(const char* name, Material** mtl)
-{
-	char* ArrRGBA[4] = { "r", "g", "b", "a" };
+	tmpcountdel = 0;
 
-	char tmpVS[256];
-	char tmpPS[256];
+	for (int i = BeginNonDef; i < m_aUnitMtrls.size(); ++i)
+	{
+		//если есть отражения, то записываем в очередь на удаление
+		if (m_aUnitMtrls[i]->m_pReflect)
+			m_aReflections.push_back(m_aUnitMtrls[i]->m_pReflect);
 
-	char tmpMask[256];
-	char tmpMicroDiff[4][256];
-	char tmpDetail[4][256];
+		mem_delete(m_aUnitMtrls[i]);
+		++tmpcountdel;
+	}
 
-	char tmpParamLigth[256];
+	CurrFirstFree = BeginNonDef;
 
-	char tmp_path[256];//папка
-	char tmp_name[256];//само им¤ текстыр с расширением
+	tmpcountdel = 0;
 
-	bool IsTruePath = false;
-	//обрезаем им¤ текстуры и папку
-	for (long k = 0; k< strlen(name); k++)
+	for (int i = 0; i < m_aMtrls.size(); ++i)
 	{
-		if (name[k] == '_')
+		if (m_aMtrls[i]->m_isDelete)
 		{
-			memcpy(tmp_path, name, sizeof(char)*k);
-			tmp_path[k] = 0;
-			sprintf(tmp_name, "%s", name + k + 1);
-			IsTruePath = true;
-			break;
+			mem_delete(m_aMtrls[i]);
+			m_aMtrls.erase(i);
+			--i;
+			++tmpcountdel;
 		}
 	}
 
-	char path[1024];
+	if (isClearRefDel)
+		delRefAllDel();
+}
 
-	for (DWORD k = 0; k<strlen(name); k++)
+//##########################################################################
+
+void CMaterials::onLostDevice()
+{
+	for (int i = 0; i < m_aUnitMtrls.size(); ++i)
 	{
-		if (name[k] == '.')
-		{
-			sprintf(tmp_name, "%s", name);
-			tmp_name[k] = 0;
-			IsTruePath = true;
-			break;
-		}
+		if (m_aUnitMtrls[i] && m_aUnitMtrls[i]->m_pReflect)
+			m_aUnitMtrls[i]->m_pReflect->onLostDevice();
 	}
+}
 
-	Material* tmpMtl = *mtl;
-
-	sprintf(path, "%s%s\\%s.mtl", Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS), tmp_path, tmp_name);
-	if (FileExistsFile(path))
+void CMaterials::onResetDevice()
+{
+	for (int i = 0; i < m_aUnitMtrls.size(); ++i)
 	{
-		ISXConfig* config = Core_OpConfig(path);
-
-		//если в конфиге указана текстура то берем ее
-		if (config->keyExists(tmp_name, "texture"))
-			tmpMtl->MainTexture = SGCore_LoadTexAddName(config->getKey(tmp_name, "texture"), LOAD_TEXTURE_TYPE_LOAD);
-		else //если нет то тогда берем имя материала, может быть он имя текстуры, иначе будет -1
-			tmpMtl->MainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD);
-
-		sprintf(tmpMtl->Name, "%s", tmp_name);
+		if (m_aUnitMtrls[i] && m_aUnitMtrls[i]->m_pReflect)
+			m_aUnitMtrls[i]->m_pReflect->onResetDevice();
+	}
+}
 
-		tmpVS[0] = 0;
-		if (config->keyExists(tmp_name, "vs"))
-			sprintf(tmpVS, "%s", config->getKey(tmp_name, "vs"));
+//##########################################################################
 
-		tmpPS[0] = 0;
-		if (config->keyExists(tmp_name, "ps"))
-			sprintf(tmpPS, "%s", config->getKey(tmp_name, "ps"));
+ID CMaterials::getStdMtl(MTLTYPE_MODEL type_model)
+{
+	if (type_model == MTLTYPE_MODEL_STATIC)
+	{
+		return MtrlDefStatic;
+	}
+	else if (type_model == MTLTYPE_MODEL_GRASS)
+	{
+		return MtrlDefGrass;
+	}
+	else if (type_model == MTLTYPE_MODEL_TREE)
+	{
+		return MtrlDefTree;
+	}
+	else if (type_model == MTLTYPE_MODEL_SKIN)
+	{
+		return MtrlDefSkin;
+	}
+	return(-1);
+}
 
+MTLTYPE_MODEL CMaterials::getTypeModel(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_MODEL_STATIC);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.type_model;
+}
 
-		if (config->keyExists(tmp_name, "is_unlit"))
-			tmpMtl->IsUnlit = String(config->getKey(tmp_name, "is_unlit")).toBool();
-		else
-			tmpMtl->IsUnlit = false;
+void CMaterials::setTypeModel(ID id, MTLTYPE_MODEL type_model)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.type_model = type_model;
+}
 
-		if (config->keyExists(tmp_name, "type"))
-			tmpMtl->Type = (MTLTYPE_MODEL)String(config->getKey(tmp_name, "type")).toInt();
-		else
-			tmpMtl->Type = MTLTYPE_MODEL_DEFAULT;
+void CMaterials::update(UINT timeDelta)
+{
+	m_uiCurrTimeDelta = timeDelta;
+	m_uiCountTimeDelta += timeDelta;
+}
 
-		if (config->keyExists(tmp_name, "physmaterial"))
-			tmpMtl->PhysicsMaterial = (MTLTYPE_PHYSIC)String(config->getKey(tmp_name, "physmaterial")).toInt();
-		else
-			tmpMtl->PhysicsMaterial = MTLTYPE_PHYSIC_DEFAULT;
+void CMaterials::setMainTexture(ID slot, ID id)
+{
+	if (id >= 0 && id < m_aUnitMtrls.size() && m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture != -1)
+		MLSet::DXDevice->SetTexture(slot, SGCore_LoadTexGetTex(m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture));
+	else
+		MLSet::DXDevice->SetTexture(slot, 0);
+}
 
+ID CMaterials::getID(const char* name)
+{
+	for (int i = 0; i < m_aUnitMtrls.size(); i++)
+	{
+		if (strcmp(m_aUnitMtrls[i]->m_pMtrl->m_sName.c_str(), name) == 0)
+			return i;
+	}
+	return -1;
+}
 
-		if (STR_VALIDATE(tmpVS))
-			tmpMtl->PreShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, tmpVS, tmpVS, SHADER_CHECKDOUBLE_PATH);
-		else
-			tmpMtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
+int CMaterials::getCount()
+{
+	return m_aUnitMtrls.size();
+}
 
-		if (STR_VALIDATE(tmpPS))
-			tmpMtl->PreShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, tmpPS, tmpPS, SHADER_CHECKDOUBLE_PATH);
-		else
-			tmpMtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
 
-		tmpMicroDiff[0][0] = 0;
-		if (config->keyExists(tmp_name, "mirco_diff_r"))
-			sprintf(tmpMicroDiff[0], "%s", config->getKey(tmp_name, "mirco_diff_r"));
+void CMaterials::setForceblyAlphaTest(bool isat)
+{
+	m_useForceblyAlphaTest = isat;
+	if (!isat)
+		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+}
 
-		if (tmpMicroDiff[0][0] != '0' && tmpMicroDiff[0][0] != 0)
-			tmpMtl->MicroDetail.ArrMicroDiffuse[0] = SGCore_LoadTexAddName(tmpMicroDiff[0], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrMicroDiffuse[0] = -1;
+bool CMaterials::getForceblyAlphaTest()
+{
+	return m_useForceblyAlphaTest;
+}
 
-		tmpMicroDiff[1][0] = 0;
-		if (config->keyExists(tmp_name, "mirco_diff_g"))
-			sprintf(tmpMicroDiff[1], "%s", config->getKey(tmp_name, "mirco_diff_g"));
-		if (tmpMicroDiff[1][0] != '0' && tmpMicroDiff[1][0] != 0)
-			tmpMtl->MicroDetail.ArrMicroDiffuse[1] = SGCore_LoadTexAddName(tmpMicroDiff[1], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrMicroDiffuse[1] = -1;
+//##########################################################################
 
-		tmpMicroDiff[2][0] = 0;
-		if (config->keyExists(tmp_name, "mirco_diff_b"))
-			sprintf(tmpMicroDiff[2], "%s", config->getKey(tmp_name, "mirco_diff_b"));
-		if (tmpMicroDiff[2][0] != '0' && tmpMicroDiff[2][0] != 0)
-			tmpMtl->MicroDetail.ArrMicroDiffuse[2] = SGCore_LoadTexAddName(tmpMicroDiff[2], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrMicroDiffuse[2] = -1;
+bool CMaterials::mtlGetUsingAlphaTest(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_useAlphaTest;
+}
 
-		tmpMicroDiff[3][0] = 0;
-		if (config->keyExists(tmp_name, "mirco_diff_a"))
-		sprintf(tmpMicroDiff[3], "%s", config->getKey(tmp_name, "mirco_diff_a"));
-		if (tmpMicroDiff[3][0] != '0' && tmpMicroDiff[3][0] != 0)
-			tmpMtl->MicroDetail.ArrMicroDiffuse[3] = SGCore_LoadTexAddName(tmpMicroDiff[3], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrMicroDiffuse[3] = -1;
+void CMaterials::mtlSetUsingAlphaTest(ID id, bool is_using)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_useAlphaTest = is_using;
+}
 
+MTLTYPE_REFLECT CMaterials::mtlTypeReflection(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect;
+}
 
-		tmpDetail[0][0] = 0;
-		if (config->keyExists(tmp_name, "detail_r"))
-			sprintf(tmpDetail[0], "%s", config->getKey(tmp_name, "detail_r"));
-		if (tmpDetail[0][0] != '0' && tmpMicroDiff[0][0] != 0)
-			tmpMtl->MicroDetail.ArrDeatail[0] = SGCore_LoadTexAddName(tmpDetail[0], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrDeatail[0] = -1;
+//**************************************************************************
 
-		tmpDetail[1][0] = 0;
-		if (config->keyExists(tmp_name, "detail_g"))
-			sprintf(tmpDetail[1], "%s", config->getKey(tmp_name, "detail_g"));
-		if (tmpDetail[1][0] != '0' && tmpMicroDiff[1][0] != 0)
-			tmpMtl->MicroDetail.ArrDeatail[1] = SGCore_LoadTexAddName(tmpDetail[1], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrDeatail[1] = -1;
+void CMaterials::mtlRefSetIDArr(ID id, ID inid, int cube, ID idarr)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->setIDArr(inid, cube, idarr);
+}
 
-		tmpDetail[2][0] = 0;
-		if (config->keyExists(tmp_name, "detail_b"))
-			sprintf(tmpDetail[2], "%s", config->getKey(tmp_name, "detail_b"));
-		if (tmpDetail[2][0] != '0' && tmpMicroDiff[2][0] != 0)
-			tmpMtl->MicroDetail.ArrDeatail[2] = SGCore_LoadTexAddName(tmpDetail[2], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrDeatail[2] = -1;
+ID CMaterials::mtlRefGetIDArr(ID id, ID inid, int cube)
+{
+	MTL_REF_PRE_COND_ID(id,- 1);
+	return m_aUnitMtrls[id]->m_pReflect->getIDArr(inid, cube);
+}
 
-		tmpDetail[3][0] = 0;
-		if (config->keyExists(tmp_name, "detail_a"))
-			sprintf(tmpDetail[3], "%s", config->getKey(tmp_name, "detail_a"));
-		if (tmpDetail[3][0] != '0' && tmpMicroDiff[3][0] != 0)
-			tmpMtl->MicroDetail.ArrDeatail[3] = SGCore_LoadTexAddName(tmpDetail[3], LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.ArrDeatail[3] = -1;
+/*void CMaterials::mtlRefSetPlane(ID id, D3DXPLANE* plane)
+{
+	MTL_REF_PRE_COND_ID(id);
+	m_aUnitMtrls[id]->m_pReflect->Plane = *plane;
+}*/
 
-		tmpMask[0] = 0;
-		if (config->keyExists(tmp_name, "mask"))
-			sprintf(tmpMask, "%s", config->getKey(tmp_name, "mask"));
-		if (tmpMask[0] != '0' && tmpMask[0] != 0)
-			tmpMtl->MicroDetail.Mask = SGCore_LoadTexAddName(tmpMask, LOAD_TEXTURE_TYPE_LOAD);
-		else
-			tmpMtl->MicroDetail.Mask = -1;
+/*void CMaterials::mtlRefSetCenter(ID id, float3_t* center)
+{
+	MTL_REF_PRE_COND_ID(id);
+	m_aUnitMtrls[id]->m_pReflect->Position = *center;
+}*/
 
+void CMaterials::mtlRefPreRenderPlane(ID id, D3DXPLANE* plane)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->preRenderRefPlane(plane);
+}
 
-		tmpMtl->LightParam.RoughnessValue = MTL_LIGHTING_DEFAULT_ROUGHNESS;
-		tmpMtl->LightParam.F0Value = MTL_LIGHTING_DEFAULT_F0;
-		tmpMtl->LightParam.ThicknessValue = MTL_LIGHTING_DEFAULT_THICKNESS;
+const IFrustum* CMaterials::mtlRefGetfrustum(ID id, int cube)
+{
+	MTL_REF_PRE_COND_ID(id, 0);
+	if (cube == 0 || (cube > 0 && (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC)))
+		return m_aUnitMtrls[id]->m_pReflect->getFrustum(cube);
+	return 0;
+}
 
-		if (config->keyExists(tmp_name, "roughness"))
-			tmpMtl->LightParam.RoughnessValue = String(config->getKey(tmp_name, "roughness")).toDouble();
+void CMaterials::mtlRefPostRenderPlane(ID id)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->postRenderRefPlane();
+}
 
-		if (config->keyExists(tmp_name, "f0"))
-			tmpMtl->LightParam.F0Value = String(config->getKey(tmp_name, "f0")).toDouble();
+IDirect3DTexture9* CMaterials::mtlRefPlaneGetTex(ID id)
+{
+ 	MTL_REF_PRE_COND_ID(id, 0);
+	return m_aUnitMtrls[id]->m_pReflect->getRefPlaneTex();
+}
 
-		if (config->keyExists(tmp_name, "thickness"))
-			tmpMtl->LightParam.ThicknessValue = String(config->getKey(tmp_name, "thickness")).toDouble();
 
-		if (config->keyExists(tmp_name, "penetration"))
-			tmpMtl->Penetration = String(config->getKey(tmp_name, "penetration")).toDouble();
+void CMaterials::mtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->setMinMax(pMin, pMax);
+}
 
-		if (config->keyExists(tmp_name, "hit_chance"))
-			tmpMtl->HitChance = String(config->getKey(tmp_name, "hit_chance")).toDouble();
+bool CMaterials::mtlRefIsAllowedRender(ID  id)
+{
+	MTL_REF_PRE_COND_ID(id, false);
+	if (m_aUnitMtrls[id]->m_pReflect)
+		return m_aUnitMtrls[id]->m_pReflect->allowedRender();
 
-		if (config->keyExists(tmp_name, "density"))
-			tmpMtl->Density = String(config->getKey(tmp_name, "density")).toDouble();
+	return false;
+}
 
-		tmpMtl->LightParam.ParamTexHand = CreateTexParamLighting(tmpMtl->LightParam.RoughnessValue, tmpMtl->LightParam.F0Value, tmpMtl->LightParam.ThicknessValue);
 
-		//говорим что не установлено использовать ли текстуру или нет
-		int istexparam = -1;
+void CMaterials::mtlRefCubeBeginRender(ID id, const float3_t *pCenter)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->beginRenderRefCube(pCenter);
+}
 
-		//если есть ключ использования текстуры то грузим
-		if (config->keyExists(tmp_name, "is_texture_param"))
-			istexparam = String(config->getKey(tmp_name, "is_texture_param")).toBool();
+void CMaterials::mtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->preRenderRefCube(iCube, pWorld);
+}
 
-		tmpParamLigth[0] = 0;
-		if (config->keyExists(tmp_name, "param_ligth"))
-			sprintf(tmpParamLigth, "%s", config->getKey(tmp_name, "param_ligth"));
+void CMaterials::mtlRefCubePostRender(ID id, int iCube)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->postRenderRefCube(iCube);
+}
 
-		//если текстура с параметрами освещения была определена
-		if (tmpParamLigth[0] != '0' && tmpParamLigth[0] != 0)
-		{
-			tmpMtl->LightParam.ParamTex = SGCore_LoadTexAddName(tmpParamLigth, LOAD_TEXTURE_TYPE_LOAD);
-			//если использование параметров освещения из текстуры не было определено
-			if (istexparam == -1)
-				tmpMtl->LightParam.IsTextureParam = true;
-			else
-				tmpMtl->LightParam.IsTextureParam = istexparam;
-		}
-		//если использование параметров освещения из текстуры не было определено
-		else if (istexparam == -1)
-		{
-			tmpMtl->LightParam.IsTextureParam = false;
-		}
-		
+void CMaterials::mtlRefCubeEndRender(ID id, const float3_t *pViewPos)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->endRenderRefCube(pViewPos);
+}
 
-		if (config->keyExists(tmp_name, "refraction"))
-			tmpMtl->LightParam.TypeRefraction = (MTLTYPE_TRANSPARENCY)String(config->getKey(tmp_name, "refraction")).toInt();
-		else
-			tmpMtl->LightParam.TypeRefraction = MTLTYPE_TRANSPARENCY_NONE;
+bool CMaterials::mtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos)
+{
+	MTL_REF_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pReflect->updateCountUpdate(pViewPos);
+}
 
+void CMaterials::mtlRefNullingCountUpdate(ID id)
+{
+	MTL_REF_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pReflect->nullingCountUpdate();
+}
 
-		tmpMtl->VS.IsTransWorld = tmpMtl->VS.IsTransView = tmpMtl->VS.IsTransProjection = 
-			tmpMtl->VS.IsTransWorldView = tmpMtl->VS.IsTransWorldViewProjection = tmpMtl->VS.IsTransPosCam = 
-			tmpMtl->VS.IsTransTimeDelta = tmpMtl->VS.IsTransWinSize = tmpMtl->VS.IsTransUserData = false;
+IDirect3DCubeTexture9* CMaterials::refCubeGetTex(ID id)
+{
+	MTL_REF_PRE_COND_ID(id, 0);
+	return m_aUnitMtrls[id]->m_pReflect->getRefCubeTex();
+}
 
-		if (config->keyExists(tmp_name, "vs_world"))
-			tmpMtl->VS.IsTransWorld = String(config->getKey(tmp_name, "vs_world")).toInt();
+//**************************************************************************
 
-		if (config->keyExists(tmp_name, "vs_view"))
-			tmpMtl->VS.IsTransView = String(config->getKey(tmp_name, "vs_view")).toInt();
+UINT CMaterials::mtlGetSort(ID id)
+{
+	MTL_PRE_COND_ID(id, 0);
+	
+	UINT uiSort = 0;
+	uiSort |= (m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTransparent ? MTLTYPE_TRANSPARENCY : MTLSORT_OPAQUE);
+	uiSort |= (m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit ? MTLTYPE_ULIT : MTLSORT_LIGHTED);
+	return uiSort;
+}
 
-		if (config->keyExists(tmp_name, "vs_projection"))
-			tmpMtl->VS.IsTransProjection = String(config->getKey(tmp_name, "vs_projection")).toInt();
+void CMaterials::mtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type)
+{
+	MTL_PRE_COND_ID(id);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.type_physics = type;
+}
 
-		if (config->keyExists(tmp_name, "vs_worldview"))
-			tmpMtl->VS.IsTransWorldView = String(config->getKey(tmp_name, "vs_worldview")).toInt();
+MTLTYPE_PHYSIC CMaterials::mtlGetPhysicMaterial(ID id)
+{
+	MTL_PRE_COND_ID(id, MTLTYPE_PHYSIC_CONCRETE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.type_physics;
+}
 
-		if (config->keyExists(tmp_name, "vs_worldviewprojection"))
-			tmpMtl->VS.IsTransWorldViewProjection = String(config->getKey(tmp_name, "vs_worldviewprojection")).toInt();
+void CMaterials::mtlSetTexture(ID id, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
 
-		if (config->keyExists(tmp_name, "vs_poscam"))
-			tmpMtl->VS.IsTransPosCam = String(config->getKey(tmp_name, "vs_poscam")).toInt();
+void CMaterials::mtlGetTexture(ID id, char* name)
+{
+	MTL_PRE_COND_ID(id, _VOID);
 
-		if (config->keyExists(tmp_name, "vs_timedelta"))
-			tmpMtl->VS.IsTransTimeDelta = String(config->getKey(tmp_name, "vs_timedelta")).toInt();
+	if (name && m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture, name);
+}
 
-		if (config->keyExists(tmp_name, "vs_winsize"))
-			tmpMtl->VS.IsTransWinSize = String(config->getKey(tmp_name, "vs_winsize")).toInt();
+ID CMaterials::mtlGetTextureID(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
 
-		if (config->keyExists(tmp_name, "vs_userdata"))
-			tmpMtl->VS.IsTransUserData = String(config->getKey(tmp_name, "vs_userdata")).toInt();
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idMainTexture;
+}
 
+void CMaterials::mtlSetVS(ID id, const char* path_vs)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderVS = SGCore_ShaderLoad(SHADER_TYPE_VERTEX, path_vs, path_vs, SHADER_CHECKDOUBLE_PATH);
+}
 
-		tmpMtl->VS.Param = float4(0, 0, 0, 0);
-		if (config->keyExists(tmp_name, "vs_userdata_value_x"))
-			tmpMtl->VS.Param.x = String(config->getKey(tmp_name, "vs_userdata_value_x")).toDouble();
+void CMaterials::mtlGetVS(ID id, char* name)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderVS, name);
+}
 
-		if (config->keyExists(tmp_name, "vs_userdata_value_y"))
-			tmpMtl->VS.Param.y = String(config->getKey(tmp_name, "vs_userdata_value_y")).toDouble();
+void CMaterials::mtlSetPS(ID id, const char* path_ps)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderPS = SGCore_ShaderLoad(SHADER_TYPE_PIXEL, path_ps, path_ps, SHADER_CHECKDOUBLE_PATH);
+}
 
-		if (config->keyExists(tmp_name, "vs_userdata_value_z"))
-			tmpMtl->VS.Param.z = String(config->getKey(tmp_name, "vs_userdata_value_z")).toDouble();
+void CMaterials::mtlGetPS(ID id, char* name)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_idShaderPS, name);
+}
 
-		if (config->keyExists(tmp_name, "vs_userdata_value_w"))
-			tmpMtl->VS.Param.w = String(config->getKey(tmp_name, "vs_userdata_value_w")).toDouble();
 
-		if (config->keyExists(tmp_name, "vs_userdata_trans_in_ps"))
-			tmpMtl->TransVSDataInPS = String(config->getKey(tmp_name, "vs_userdata_trans_in_ps")).toBool();
-		else
-			tmpMtl->TransVSDataInPS = false;
+void CMaterials::mtlSetLighting(ID id, bool is_lighting)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit = !is_lighting;
+}
 
+bool CMaterials::mtlGetLighting(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return !m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_isUnlit;
+}
 
-		tmpMtl->PS.IsTransWorld = tmpMtl->PS.IsTransView = tmpMtl->PS.IsTransProjection =
-			tmpMtl->PS.IsTransWorldView = tmpMtl->PS.IsTransWorldViewProjection = tmpMtl->PS.IsTransPosCam =
-			tmpMtl->PS.IsTransTimeDelta = tmpMtl->PS.IsTransWinSize = tmpMtl->PS.IsTransUserData = false;
 
-		if (config->keyExists(tmp_name, "ps_world"))
-			tmpMtl->PS.IsTransWorld = String(config->getKey(tmp_name, "ps_world")).toInt();
+void CMaterials::mtlSetIsTextureLighting(ID id, bool is_tex_lighting)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTextureParam = is_tex_lighting;
+}
 
-		if (config->keyExists(tmp_name, "ps_view"))
-			tmpMtl->PS.IsTransView = String(config->getKey(tmp_name, "ps_view")).toInt();
+bool CMaterials::mtlGetIsTextureLighting(ID id)
+{
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTextureParam;
+}
 
-		if (config->keyExists(tmp_name, "ps_projection"))
-			tmpMtl->PS.IsTransProjection = String(config->getKey(tmp_name, "ps_projection")).toInt();
 
-		if (config->keyExists(tmp_name, "ps_worldview"))
-			tmpMtl->PS.IsTransWorldView = String(config->getKey(tmp_name, "ps_worldview")).toInt();
+void CMaterials::mtlSetTextureLighting(ID id, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
 
-		if (config->keyExists(tmp_name, "ps_worldviewprojection"))
-			tmpMtl->PS.IsTransWorldViewProjection = String(config->getKey(tmp_name, "ps_worldviewprojection")).toInt();
+void CMaterials::mtlGetTextureLighting(ID id, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam >= 0)
+	{
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_idTexParam, path_tex);
+		if (path_tex[0] == MTL_VIRTUAL_DIR_HAND_MTL)
+			path_tex[0] = 0;
+	}
+	else if (path_tex)
+		path_tex[0] = 0;
+}
 
-		if (config->keyExists(tmp_name, "ps_poscam"))
-			tmpMtl->PS.IsTransPosCam = String(config->getKey(tmp_name, "ps_poscam")).toInt();
 
-		if (config->keyExists(tmp_name, "ps_timedelta"))
-			tmpMtl->PS.IsTransTimeDelta = String(config->getKey(tmp_name, "ps_timedelta")).toInt();
+void CMaterials::mtlSetRoughness(ID id, float roughness)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fRoughness = roughness;
+}
 
-		if (config->keyExists(tmp_name, "ps_winsize"))
-			tmpMtl->PS.IsTransWinSize = String(config->getKey(tmp_name, "ps_winsize")).toInt();
+float CMaterials::mtlGetRoughness(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fRoughness;
+}
 
-		if (config->keyExists(tmp_name, "ps_userdata"))
-			tmpMtl->PS.IsTransUserData = String(config->getKey(tmp_name, "ps_userdata")).toInt();
 
-		tmpMtl->PS.Param = float4(0, 0, 0, 0);
+void CMaterials::mtlSetF0(ID id, float f0)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fF0 = f0;
+}
 
-		if (config->keyExists(tmp_name, "ps_userdata_value_x"))
-			tmpMtl->PS.Param.x = String(config->getKey(tmp_name, "ps_userdata_value_x")).toDouble();
+float CMaterials::mtlGetF0(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fF0;
+}
 
-		if (config->keyExists(tmp_name, "ps_userdata_value_y"))
-			tmpMtl->PS.Param.y = String(config->getKey(tmp_name, "ps_userdata_value_y")).toDouble();
 
-		if (config->keyExists(tmp_name, "ps_userdata_value_z"))
-			tmpMtl->PS.Param.z = String(config->getKey(tmp_name, "ps_userdata_value_z")).toDouble();
+void CMaterials::mtlSetThickness(ID id, float thickness)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fThickness = thickness;
+}
 
-		if (config->keyExists(tmp_name, "ps_userdata_value_w"))
-			tmpMtl->PS.Param.w = String(config->getKey(tmp_name, "ps_userdata_value_w")).toDouble();
+float CMaterials::mtlGetThickness(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_fThickness;
+}
 
-		if (config->keyExists(tmp_name, "ps_userdata_trans_in_vs"))
-			tmpMtl->TransPSDataInVS = String(config->getKey(tmp_name, "ps_userdata_trans_in_vs")).toBool();
 
-		if (config->keyExists(tmp_name, "type_reflect"))
-			tmpMtl->LightParam.TypeReflect = (MTLTYPE_REFLECT)String(config->getKey(tmp_name, "type_reflect")).toInt();
+void CMaterials::mtlSetDurability(ID id, float fDurability)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDurability = fDurability;
+}
 
-		if (config->keyExists(tmp_name, "alpha_test"))
-			tmpMtl->IsAlphaTest = String(config->getKey(tmp_name, "alpha_test")).toBool();
-		else
-			tmpMtl->IsAlphaTest = false;
+float CMaterials::mtlGetDurability(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDurability;
+}
 
-		return true;
-	}
 
-	return false;
+void CMaterials::mtlSetHitChance(ID id, float fHitChance)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fHitChance = fHitChance;
 }
 
-ID Materials::CreateTexParamLighting(float roughness, float f0, float thickness)
+float CMaterials::mtlGetHitChance(ID id)
 {
-	IDirect3DTexture9* TexMaterial;
-	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &TexMaterial, NULL);
-	D3DLOCKED_RECT LockedRect;
-	uint32_t tmpColor = D3DCOLOR_ARGB(0, DWORD(roughness*255.f), DWORD(f0*255.f), DWORD(thickness*255.f));
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fHitChance;
+}
 
-	TexMaterial->LockRect(0, &LockedRect, 0, 0);
 
-	uint32_t* tmpOldColor = (uint32_t*)LockedRect.pBits + 0 * LockedRect.Pitch + 0 * sizeof(uint32_t);
-	memcpy(tmpOldColor, &tmpColor, sizeof(uint32_t));
+void CMaterials::mtlSetDensity(ID id, float fDensity)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDensity = fDensity;
+}
 
-	TexMaterial->UnlockRect(0);
+float CMaterials::mtlGetDensity(ID id)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oPhysics.m_fDensity;
+}
 
-	//SGCore_LoadTexLoadTextures();
 
-	char nametex[64];
-	sprintf(nametex, "%c_%d_%d_%d", MTL_VIRTUAL_DIR_HAND_MTL, ArrMaterials.size(), rand() % 9999, rand() % 9999);
 
-	return SGCore_LoadTexCreate(nametex, TexMaterial);
+void CMaterials::mtlSetTransparency(ID id, bool isTransparent)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTransparent = isTransparent;
 }
 
-void Materials::CreateMtl(const char* name, Material** mtl, MTLTYPE_MODEL type)
+bool CMaterials::mtlGetTransparency(ID id)
 {
-	Material* tmpMtl = *mtl;
-	new(tmpMtl)Material*;
-	//если такого материала не существует, то мы должны были задать примерный тип материала
-	tmpMtl->Type = type;
-	//обычна¤ геометри¤
-	if (type == MTLTYPE_MODEL_STATIC)
-	{
-		tmpMtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgeom_base.vs");
-		tmpMtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgeom_base.ps");
-		tmpMtl->VS.IsTransWorld = true;
-	}
-	//деревь¤
-	else if (type == MTLTYPE_MODEL_TREE)
-	{
-		tmpMtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_tree_base.vs");
-		tmpMtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
-		//tmpMtl->RenderStates.IsAlphaTest = true;
-	}
-	//трава
-	else if (type == MTLTYPE_MODEL_GRASS)
-	{
-		tmpMtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlgreen_grass_base.vs");
-		tmpMtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlgreen_base.ps");
-		//tmpMtl->RenderStates.IsAlphaTest = true;
-	}
-	//анимационная модель
-	else if (type == MTLTYPE_MODEL_SKIN)
-	{
-		tmpMtl->PreShaderVS = SGCore_ShaderGetID(SHADER_TYPE_VERTEX, "mtrlskin_base.vs");
-		tmpMtl->PreShaderPS = SGCore_ShaderGetID(SHADER_TYPE_PIXEL, "mtrlskin_base.ps");
-		tmpMtl->VS.IsTransWorld = true;
-	}
-	//источник света
-	/*else if (type == MTL_LIGHT)
-	{
-	tmpMtl->PreShaderVS = SGCore_ShaderGetID(0, "mtrlgeom_base.vs");
-	tmpMtl->PreShaderPS = SGCore_ShaderGetID(1, "mtrlgeom_light.ps");
-	tmpMtl->IsForwardRender = true;
-	tmpMtl->PS.IsTransUserData = true;
-	tmpMtl->PS.Param = float4(0, 0, 0, 0);
-	}*/
-
-	tmpMtl->MainTexture = SGCore_LoadTexAddName(name, LOAD_TEXTURE_TYPE_LOAD);
-	tmpMtl->VS.IsTransWorldViewProjection = true;
-
-	tmpMtl->LightParam.RoughnessValue = MTL_LIGHTING_DEFAULT_ROUGHNESS;
-	tmpMtl->LightParam.F0Value = MTL_LIGHTING_DEFAULT_F0;
-	tmpMtl->LightParam.ThicknessValue = MTL_LIGHTING_DEFAULT_THICKNESS;
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_isTransparent;
+}
 
-	tmpMtl->LightParam.ParamTex = -1;
-	tmpMtl->LightParam.ParamTexHand = CreateTexParamLighting(tmpMtl->LightParam.RoughnessValue, tmpMtl->LightParam.F0Value, tmpMtl->LightParam.ThicknessValue);
 
-	//char path[1024];
-	char tmp_name[256];
-	bool IsTruePath = false;
+void CMaterials::mtlSetTypeReflection(ID id, MTLTYPE_REFLECT type)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect = type;
 
-	for (DWORD k = 0; k<strlen(name); k++)
+	if (m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect != MTLTYPE_REFLECT_NONE)
 	{
-		if (name[k] == '.')
-		{
-			sprintf(tmp_name, "%s", name);
-			tmp_name[k] = 0;
-			IsTruePath = true;
-			break;
-		}
-	}
+		if (!m_aUnitMtrls[id]->m_pReflect)
+			m_aUnitMtrls[id]->m_pReflect = new CReflection();
 
-	sprintf(tmpMtl->Name, "%s", tmp_name);
+		m_aUnitMtrls[id]->m_pReflect->init(m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect);
+	}
 }
 
-ID Materials::MtlLoad(const char* name, MTLTYPE_MODEL type)
+MTLTYPE_REFLECT CMaterials::mtlGetTypeReflection(ID id)
 {
-	ID IsLoad = IsExists(name);
-
-	if (IsLoad >= 0)
-	{
-		UnitMaterial* tmpumtl = new UnitMaterial();
-		tmpumtl->mtl = ArrMaterials[IsLoad]->mtl;
+	MTL_PRE_COND_ID(id, MTLTYPE_REFLECT_NONE);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oLightParam.m_type_reflect;
+}
 
-		if (ArrMaterials[IsLoad]->Reflect){
-			UnitMaterial* tmpmtl = ArrMaterials[IsLoad];
-			tmpumtl->Reflect = new CReflection();
-			tmpumtl->Reflect->init(ArrMaterials[IsLoad]->Reflect->getTypeReflect());
-		}
 
-		return AddUnitMaterial(tmpumtl);
-	}
-	else
-	{
-		UnitMaterial* tmpumtl = new UnitMaterial();
-		tmpumtl->mtl = new Material();
-		AddMaterial(tmpumtl->mtl);
-		if (!LoadMtl(name, &(tmpumtl->mtl)))
-		{
-			CreateMtl(name, &(tmpumtl->mtl), type);
-		}
-		else
-		{
-			if (tmpumtl->mtl->LightParam.TypeReflect != MTLTYPE_REFLECT_NONE)
-			{
-				tmpumtl->Reflect = new CReflection();
-				tmpumtl->Reflect->init(tmpumtl->mtl->LightParam.TypeReflect);
-			}
-		}
+void CMaterials::mtlSetMaskTex(ID id, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
 
-		ID tmpid = AddUnitMaterial(tmpumtl);
+void CMaterials::mtlGetMaskTex(ID id, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_idMask, path_tex);
+	else if (path_tex)
+		path_tex[0] = 0;
+}
 
-		AddName(name, tmpid);
-		return tmpid;
-	}
+void CMaterials::mtlSetMRTex(ID id, int channel, const char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
 }
 
-void Materials::MtlReLoad(ID id, const char* name)
+void CMaterials::mtlGetMRTex(ID id, int channel, char* path_tex)
 {
-	MTL_PRE_COND_ID(id);
-	UnitMaterial* tmpumtl = ArrMaterials[id];
-	char tmpname[1024];
-	if (name == 0)
-		sprintf(tmpname, "%s.dds", tmpumtl->mtl->Name);
-	else
-		sprintf(tmpname, "%s", name);
-	
-	tmpumtl->mtl->Nulling();
-	if(!LoadMtl(tmpname, &(tmpumtl->mtl)))
-	{
-		CreateMtl(name, &(tmpumtl->mtl), tmpumtl->mtl->Type);
-	}
-	else
-	{
-		if (tmpumtl->mtl->LightParam.TypeReflect != MTLTYPE_REFLECT_NONE)
-		{
-			tmpumtl->Reflect = new CReflection();
-			tmpumtl->Reflect->init(tmpumtl->mtl->LightParam.TypeReflect);
-		}
-	}
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel] >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aMicroRelief[channel], path_tex);
+	else if (path_tex)
+		path_tex[0] = 0;
 }
 
-void Materials::MtlSave(ID id)
+
+void CMaterials::mtlSetDTex(ID id, int channel, const char* path_tex)
 {
 	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel] = SGCore_LoadTexAddName(path_tex, LOAD_TEXTURE_TYPE_LOAD);
+}
 
-	char tmp_path[256];//папка
-	char tmp_name[256];//само им¤ текстыр с расширением
-	bool IsTruePath = false;
-	char tmppath[1024];
-	char* ArrRGBA[4] = { "r", "g", "b", "a" };
+void CMaterials::mtlGetDTex(ID id, int channel, char* path_tex)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (path_tex && m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel] >= 0)
+		SGCore_LoadTexGetName(m_aUnitMtrls[id]->m_pMtrl->m_oMicroDetail.m_aDetail[channel], path_tex);
+	else if (path_tex)
+		path_tex[0] = 0;
+}
 
-	Material* mtrl = ArrMaterials[id]->mtl;
 
-	IsTruePath = false;
-	//обрезаем им¤ текстуры и папку
-	for (DWORD k = 0; k<strlen(mtrl->Name); k++)
-	{
-		if (mtrl->Name[k] == '_')
-		{
-			memcpy(tmp_path, mtrl->Name, sizeof(char)*k);
-			tmp_path[k] = 0;
-			sprintf(tmp_name, "%s", mtrl->Name + k + 1);
-			IsTruePath = true;
-			break;
-		}
-	}
+void CMaterials::mtlSetStdVS(ID id, MTL_SHADERSTD type, bool is_send)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection = is_send;
 
-	for (DWORD k = 0; k<strlen(mtrl->Name); k++)
-	{
-		if (mtrl->Name[k] == '.')
-		{
-			sprintf(tmp_name, "%s", mtrl->Name);
-			tmp_name[k] = 0;
-			IsTruePath = true;
-			break;
-		}
-	}
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam = is_send;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta = is_send;
 
-	tmppath[0] = 0;
-	_mkdir(Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS));
-	sprintf(tmppath, "%s%s\\", Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS), tmp_path);
-	_mkdir(tmppath);
-	sprintf(tmppath, "%s%s.mtl", tmppath, mtrl->Name);
-	FILE* file = 0;
-	file = fopen(tmppath, "w");
+	else if (type == MTL_SHADERSTD_USERDATA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData = is_send;
 
-	fprintf(file, "[%s]\n", mtrl->Name);
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize = is_send;
+}
 
-	char tmpPathVSName[1024];
-	char tmpPathPSName[1024];
+bool CMaterials::mtlGetStdVS(ID id, MTL_SHADERSTD type)
+{
+	MTL_PRE_COND_ID(id, false);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection;
 
-	char tmpPathMaskName[1024];
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta;
 
-	SGCore_ShaderGetPath(SHADER_TYPE_VERTEX, mtrl->PreShaderVS, tmpPathVSName);
-	SGCore_ShaderGetPath(SHADER_TYPE_PIXEL, mtrl->PreShaderPS, tmpPathPSName);
+	else if (type == MTL_SHADERSTD_USERDATA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData;
 
-	fprintf(file, "type = %d\n", mtrl->Type);
-	fprintf(file, "is_unlit = %d\n", mtrl->IsUnlit);
-	fprintf(file, "%s%d%s", "physmaterial = ", mtrl->PhysicsMaterial, "\n");
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize;
 
-	fprintf(file, "%s%s%s", "vs = ", tmpPathVSName, "\n");
-	fprintf(file, "%s%s%s", "ps = ", tmpPathPSName, "\n");
+	return(false);
+}
 
-	fprintf(file, "%s%d%s", "alpha_test = ", mtrl->IsAlphaTest, "\n");
+void CMaterials::mtlSetStdPS(ID id, MTL_SHADERSTD type, bool is_send)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView = is_send;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection = is_send;
 
-	char namebasetex[256];
-	namebasetex[0] = '0';
-	namebasetex[1] = '\0';
-	SGCore_LoadTexGetName(mtrl->MainTexture, namebasetex);
-	fprintf(file, "%s%s%s", "texture = ", namebasetex, "\n");
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam = is_send;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta = is_send;
 
-	if (mtrl->MicroDetail.Mask == -1)
-	{
-		tmpPathMaskName[0] = '0';
-		tmpPathMaskName[1] = 0;
-	}
-	else
-		SGCore_LoadTexGetName(mtrl->MicroDetail.Mask, tmpPathMaskName);
+	else if (type == MTL_SHADERSTD_USERDATA)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData = is_send;
 
-	fprintf(file, "%s%s%s", "mask = ", tmpPathMaskName, "\n");
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize = is_send;
+}
 
-	for (int k = 0; k<4; k++)
-	{
-		if (mtrl->MicroDetail.ArrMicroDiffuse[k] == -1)
-		{
-			tmpPathMaskName[0] = '0';
-			tmpPathMaskName[1] = 0;
-		}
-		else
-			SGCore_LoadTexGetName(mtrl->MicroDetail.ArrMicroDiffuse[k], tmpPathMaskName);
+bool CMaterials::mtlGetStdPS(ID id, MTL_SHADERSTD type)
+{
+	MTL_PRE_COND_ID(id, false);
+	if (type == MTL_SHADERSTD_MATRIX_WORLD)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld;
+	else if (type == MTL_SHADERSTD_MATRIX_VIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView;
+	else if (type == MTL_SHADERSTD_MATRIX_PROJECTION)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEW)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView;
+	else if (type == MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection;
 
-		fprintf(file, "mirco_diff_%s = %s\n", ArrRGBA[k], tmpPathMaskName);
-	}
+	else if (type == MTL_SHADERSTD_CAMPOS)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam;
+	else if (type == MTL_SHADERSTD_TIMEDELTA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta;
 
-	for (int k = 0; k<4; k++)
-	{
-		if (mtrl->MicroDetail.ArrDeatail[k] == -1)
-		{
-			tmpPathMaskName[0] = '0';
-			tmpPathMaskName[1] = 0;
-		}
-		else
-			SGCore_LoadTexGetName(mtrl->MicroDetail.ArrDeatail[k], tmpPathMaskName);
+	else if (type == MTL_SHADERSTD_USERDATA)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData;
 
-		fprintf(file, "detail_%s = %s\n", ArrRGBA[k], tmpPathMaskName);
-	}
+	else if (type == MTL_SHADERSTD_WINSIZE)
+		return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize;
+	return(false);
+}
 
-	if (mtrl->LightParam.ParamTex == -1)
-	{
-		tmpPathMaskName[0] = '0';
-		tmpPathMaskName[1] = 0;
-	}
-	else
-		SGCore_LoadTexGetName(mtrl->LightParam.ParamTex, tmpPathMaskName);
 
-	if (tmpPathMaskName[0] == MTL_VIRTUAL_DIR_HAND_MTL)
-		sprintf(tmpPathMaskName,"0");
-	else
-		fprintf(file, "is_texture_param = %d\n", mtrl->LightParam.IsTextureParam);
-
-	fprintf(file, "param_ligth = %s\n", tmpPathMaskName);
-
-	fprintf(file, "roughness = %f\n", mtrl->LightParam.RoughnessValue);
-	fprintf(file, "f0 = %f\n", mtrl->LightParam.F0Value);
-	fprintf(file, "thickness = %f\n", mtrl->LightParam.ThicknessValue);
-	fprintf(file, "penetration = %f\n", mtrl->Penetration);
-	fprintf(file, "hit_chance = %f\n", mtrl->HitChance);
-	fprintf(file, "density = %f\n", mtrl->Density);
-
-	fprintf(file, "refraction = %d\n", mtrl->LightParam.TypeRefraction);
-
-	fprintf(file, "vs_world = %d\n", mtrl->VS.IsTransWorld);
-	fprintf(file, "vs_view = %d\n", mtrl->VS.IsTransView);
-	fprintf(file, "vs_projection = %d\n", mtrl->VS.IsTransProjection);
-	fprintf(file, "vs_worldview = %d\n", mtrl->VS.IsTransWorldView);
-	fprintf(file, "vs_worldviewprojection = %d\n", mtrl->VS.IsTransWorldViewProjection);
-
-	fprintf(file, "vs_poscam = %d\n", mtrl->VS.IsTransPosCam);
-	fprintf(file, "vs_timedelta = %d\n", mtrl->VS.IsTransTimeDelta);
-	fprintf(file, "vs_winsize = %d\n", mtrl->VS.IsTransWinSize);
-	fprintf(file, "vs_userdata = %d\n", mtrl->VS.IsTransUserData);
-	fprintf(file, "vs_userdata_value_x = %f\nvs_userdata_value_y = %f\nvs_userdata_value_z = %f\nvs_userdata_value_w = %f\n", mtrl->VS.Param.x, mtrl->VS.Param.y, mtrl->VS.Param.z, mtrl->VS.Param.w);
-	fprintf(file, "vs_userdata_trans_in_ps = %d\n", mtrl->TransVSDataInPS);
-
-	fprintf(file, "ps_world = %d\n", mtrl->PS.IsTransWorld);
-	fprintf(file, "ps_view = %d\n", mtrl->PS.IsTransView);
-	fprintf(file, "ps_projection = %d\n", mtrl->PS.IsTransProjection);
-	fprintf(file, "ps_worldview = %d\n", mtrl->PS.IsTransWorldView);
-	fprintf(file, "ps_worldviewprojection = %d\n", mtrl->PS.IsTransWorldViewProjection);
-
-	fprintf(file, "ps_poscam = %d\n", mtrl->PS.IsTransPosCam);
-	fprintf(file, "ps_timedelta = %d\n", mtrl->PS.IsTransTimeDelta);
-	fprintf(file, "ps_winsize = %d\n", mtrl->PS.IsTransWinSize);
-	fprintf(file, "ps_userdata = %d\n", mtrl->PS.IsTransUserData);
-	fprintf(file, "ps_userdata_value_x = %f\nps_userdata_value_y = %f\nps_userdata_value_z = %f\nps_userdata_value_w = %f\n", mtrl->PS.Param.x, mtrl->PS.Param.y, mtrl->PS.Param.z, mtrl->PS.Param.w);
-	fprintf(file, "ps_userdata_trans_in_vs = %d\n", mtrl->TransPSDataInVS);
-
-	fprintf(file, "type_reflect = %d\n", mtrl->LightParam.TypeReflect);
+void CMaterials::mtlSetUserDataVS(ID id, int component, float val)
+{
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData[component] = val;
+}
 
-	fprintf(file, "\n");
-	fclose(file);
+float CMaterials::mtlGetUserDataVS(ID id, int component)
+{
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData[component];
 }
 
-void Materials::Update(DWORD timeDelta)
+void CMaterials::mtlSetUserDataVS_InPS(ID id, bool is_send_ps)
 {
-	CurrTimeDelta = timeDelta;
-	CountTimeDelta += timeDelta;
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader = is_send_ps;
 }
 
-void Materials::SetMainTexture(ID slot, ID id)
+bool CMaterials::mtlGetUserDataVS_InPS(ID id)
 {
-	if (id >= 0 && id < ArrMaterials.size() && ArrMaterials[id]->mtl->MainTexture != -1)
-		MLSet::DXDevice->SetTexture(slot, SGCore_LoadTexGetTex(ArrMaterials[id]->mtl->MainTexture));
-	else
-		MLSet::DXDevice->SetTexture(slot, 0);
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader;
 }
 
-ID Materials::GetID(const char* name)
+
+void CMaterials::mtlSetUserDataPS(ID id, int component, float val)
 {
-	for (long i = 0; i<ArrMaterials.size(); i++)
-	{
-		if (strcmp(ArrMaterials[i]->mtl->Name, name) == 0)
-			return i;
-	}
-	return -1;
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData[component] = val;
 }
 
-long Materials::GetCount()
+float CMaterials::mtlGetUserDataPS(ID id, int component)
 {
-	return ArrMaterials.size();
+	MTL_PRE_COND_ID(id, -1);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData[component];
 }
 
-void Materials::SetForceblyAlphaTest(bool isat)
+void CMaterials::mtlSetUserDataPS_InPS(ID id, bool is_send_vs)
 {
-	IsForceblyAlphaTest = isat;
-	if (!isat)
-		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+	MTL_PRE_COND_ID(id, _VOID);
+	m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader = is_send_vs;
 }
 
-bool Materials::GetForceblyAlphaTest()
+bool CMaterials::mtlGetUserDataPS_InPS(ID id)
 {
-	return IsForceblyAlphaTest;
+	MTL_PRE_COND_ID(id, false);
+	return m_aUnitMtrls[id]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader;
 }
 
-void Materials::SetIsIncrCountSurf(bool bf)
+//##########################################################################
+
+void CMaterials::setIsIncrCountSurf(bool bf)
 {
-	IsIncrCountSurf = bf;
+	m_useCountSurface = bf;
 }
 
-bool Materials::GetIsIncrCountSurf()
+bool CMaterials::getIsIncrCountSurf()
 {
-	return IsIncrCountSurf;
+	return m_useCountSurface;
 }
 
-void Materials::NullingCurrCountSurf()
+void CMaterials::nullingCurrCountSurf()
 {
-	CurrIdSurf = 0;
+	m_idCurrIdSurface = 0;
 }
 
-int Materials::GetCurrCountSurf()
+int CMaterials::getCurrCountSurf()
 {
-	return CurrIdSurf;
+	return m_idCurrIdSurface;
 }
 
-void Materials::SetCurrCountSurf(int count)
+void CMaterials::setCurrCountSurf(int count)
 {
-	CurrIdSurf = count;
+	m_idCurrIdSurface = count;
 }
 
-void Materials::RenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mtl)
+//##########################################################################
+
+void CMaterials::renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl)
 {
 	//может быть случай когда текстура в которую сейчас рисуем еще стоит в текстурных слотах
 	//из-за этого может быть необъяснимое поводенеие и как результат непонятные артефакты в самой текстуре в которую сейчас рисуем
@@ -1841,14 +1810,14 @@ void Materials::RenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mt
 	//такое явление может быть в случае когда в кадре только один материал который отражает
 	MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, 0);
 
-	if (id_mtl >= 0 && id_mtl < ArrMaterials.size())
-		this->SetMainTexture(slot, id_mtl);
+	if (idMtl >= 0 && idMtl < m_aUnitMtrls.size())
+		setMainTexture(idSlot, idMtl);
 
 	if (type == MTLTYPE_MODEL_STATIC)
 	{
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdGeom);
 
-		float4x4 wmat = (world ? (*world) : SMMatrixIdentity());
+		float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity());
 		float4x4 wvpmat;
 		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat);
 		wvpmat = SMMatrixTranspose(wmat * wvpmat);
@@ -1877,7 +1846,7 @@ void Materials::RenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mt
 		ID tmpvs = (type == MTLTYPE_MODEL_GRASS ? MLSet::IDsShaders::VS::StdGrass : MLSet::IDsShaders::VS::StdTree);
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, tmpvs);
 
-		float4x4 wmat = (world ? (*world) : SMMatrixIdentity());
+		float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity());
 		float4x4 wvpmat;
 		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat);
 		wvpmat = SMMatrixTranspose(wmat * wvpmat);
@@ -1905,7 +1874,7 @@ void Materials::RenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mt
 	{
 		SGCore_ShaderBind(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::StdSkin);
 
-		float4x4 wmat = (world ? (*world) : SMMatrixIdentity());
+		float4x4 wmat = (pWorld ? (*pWorld) : SMMatrixIdentity());
 		float4x4 wvpmat;
 		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &wvpmat);
 		wvpmat = SMMatrixTranspose(wmat * wvpmat);
@@ -1931,7 +1900,7 @@ void Materials::RenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mt
 	}
 }
 
-void Materials::Render(ID id, float4x4* world)
+void CMaterials::render(ID id, const float4x4 *pWorld)
 {
 	MTL_PRE_COND_ID(id, _VOID);
 
@@ -1941,196 +1910,193 @@ void Materials::Render(ID id, float4x4* world)
 	static const float *r_near = GET_PCVAR_FLOAT("r_near");
 	static const float *r_far = GET_PCVAR_FLOAT("r_far");
 
-	if (!world)
-		world = &(SMMatrixIdentity());
+	m_mWorld = (pWorld ? (*pWorld) : SMMatrixIdentity());
 
-	Material* tmpmaterial = ArrMaterials[id]->mtl;
+	CMaterial *pMtrl = m_aUnitMtrls[id]->m_pMtrl;
 
 	//если есть то устанавливаем текстуру материала
-	if (tmpmaterial->MainTexture != -1)
-		MLSet::DXDevice->SetTexture(MTL_TEX_R_MAIN, SGCore_LoadTexGetTex(tmpmaterial->MainTexture));
+	if (pMtrl->m_oMainGraphics.m_idMainTexture != -1)
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_MAIN, SGCore_LoadTexGetTex(pMtrl->m_oMainGraphics.m_idMainTexture));
 
 	//если нет отражени¤ то отправл¤ем 0
-	if (tmpmaterial->LightParam.TypeReflect == 0)
+	if (pMtrl->m_oLightParam.m_type_reflect == 0)
 		MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, 0);
 	else
 	{
-		if (ArrMaterials[id]->Reflect->getTypeReflect() == MTLTYPE_REFLECT_PLANE)
-			MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, ArrMaterials[id]->Reflect->getRefPlaneTex());
-		else if (ArrMaterials[id]->Reflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || ArrMaterials[id]->Reflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC)
-			MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, ArrMaterials[id]->Reflect->getRefCubeTex());
+		if (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_PLANE)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefPlaneTex());
+		else if (m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_STATIC || m_aUnitMtrls[id]->m_pReflect->getTypeReflect() == MTLTYPE_REFLECT_CUBE_DYNAMIC)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_REFLECTION, m_aUnitMtrls[id]->m_pReflect->getRefCubeTex());
 	}
 
 	MLSet::DXDevice->SetTexture(MTL_TEX_R_CURR_DEPTH, SGCore_RTGetTexture(MLSet::IDsRenderTargets::DepthScene0));
 
 	//если есть рефаркци¤, а она идет вторым проходом, то отправл¤ем, иначе посылаем 0
-	/*if (tmpmaterial->LightParam.TypeRefraction)
+	/*if (pMtrl->m_oLightParam.m_type_transparency)
 		MLSet::DXDevice->SetTexture(MTL_TEX_R_REFRACTION, SGCore_RTGetTexture(SML_DSGetRT_ID(DS_RT_SCENE_LIGHT_COM_REF)));
 	else
 		MLSet::DXDevice->SetTexture(MTL_TEX_R_REFRACTION, 0);*/
 
-	if (tmpmaterial->MicroDetail.Mask != -1)
-		MLSet::DXDevice->SetTexture(MTL_TEX_R_MASK, SGCore_LoadTexGetTex(tmpmaterial->MicroDetail.Mask));
+	if (pMtrl->m_oMicroDetail.m_idMask != -1)
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_MASK, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_idMask));
 
 	for (int k = 0; k<4; k++)
 	{
-		if (tmpmaterial->MicroDetail.ArrDeatail[k] != -1)
-			MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, SGCore_LoadTexGetTex(tmpmaterial->MicroDetail.ArrDeatail[k]));
+		if (pMtrl->m_oMicroDetail.m_aDetail[k] != -1)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_aDetail[k]));
 		else
 			MLSet::DXDevice->SetTexture(MTL_TEX_R_DETAIL + k, 0);
 
-		if (tmpmaterial->MicroDetail.ArrMicroDiffuse[k] != -1)
-			MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, SGCore_LoadTexGetTex(tmpmaterial->MicroDetail.ArrMicroDiffuse[k]));
+		if (pMtrl->m_oMicroDetail.m_aMicroRelief[k] != -1)
+			MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, SGCore_LoadTexGetTex(pMtrl->m_oMicroDetail.m_aMicroRelief[k]));
 		else
 			MLSet::DXDevice->SetTexture(MTL_TEX_R_MICRO + k, 0);
 	}
 
 	//если есть текстура с параметрами освещени¤ и установлено что берем параметры из текстуры, то отправл¤ем текстуру с параметрами
-	if (tmpmaterial->LightParam.ParamTex != -1 && tmpmaterial->LightParam.IsTextureParam)
+	if (pMtrl->m_oLightParam.m_idTexParam != -1 && pMtrl->m_oLightParam.m_isTextureParam)
 	{
-		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(tmpmaterial->LightParam.ParamTex));
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParam));
 	}
 	//иначе если берем параметры из ... редактора
-	else if (!tmpmaterial->LightParam.IsTextureParam)
+	else if (!pMtrl->m_oLightParam.m_isTextureParam)
 	{
-		if (tmpmaterial->LightParam.OldRoughnessValue != tmpmaterial->LightParam.RoughnessValue || tmpmaterial->LightParam.OldF0Value != tmpmaterial->LightParam.F0Value || tmpmaterial->LightParam.OldThicknessValue != tmpmaterial->LightParam.ThicknessValue)
+		if (pMtrl->m_oLightParam.m_fOldRoughness != pMtrl->m_oLightParam.m_fRoughness || pMtrl->m_oLightParam.m_fOldF0 != pMtrl->m_oLightParam.m_fF0 || pMtrl->m_oLightParam.m_fOldThickness != pMtrl->m_oLightParam.m_fThickness)
 		{
 			//блокируем текстуру 1х1 котора¤ есть параметры освещени¤, и запсиываем туда то что настроили
 			D3DLOCKED_RECT LockedRect;
-			IDirect3DTexture9* ParamLightModelTex = SGCore_LoadTexGetTex(tmpmaterial->LightParam.ParamTexHand);
+			IDirect3DTexture9* ParamLightModelTex = SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand);
 			ParamLightModelTex->LockRect(0, &LockedRect, 0, 0);
 			DWORD *param = (DWORD*)LockedRect.pBits;
 			//DWORD param = D3DCOLOR_ARGB(0,0,0,0);
-			param[0] = D3DCOLOR_ARGB(0, DWORD(tmpmaterial->LightParam.RoughnessValue*255.f), DWORD(tmpmaterial->LightParam.F0Value*255.f), DWORD(tmpmaterial->LightParam.ThicknessValue*255.f));
+			param[0] = D3DCOLOR_ARGB(255, DWORD(pMtrl->m_oLightParam.m_fRoughness*255.f), DWORD(pMtrl->m_oLightParam.m_fF0*255.f), DWORD(pMtrl->m_oLightParam.m_fThickness*255.f));
 			ParamLightModelTex->UnlockRect(0);
 
-			tmpmaterial->LightParam.OldRoughnessValue = tmpmaterial->LightParam.RoughnessValue;
-			tmpmaterial->LightParam.OldF0Value = tmpmaterial->LightParam.F0Value;
-			tmpmaterial->LightParam.OldThicknessValue = tmpmaterial->LightParam.ThicknessValue;
+			pMtrl->m_oLightParam.m_fOldRoughness = pMtrl->m_oLightParam.m_fRoughness;
+			pMtrl->m_oLightParam.m_fOldF0 = pMtrl->m_oLightParam.m_fF0;
+			pMtrl->m_oLightParam.m_fOldThickness = pMtrl->m_oLightParam.m_fThickness;
 		}
 
-		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(tmpmaterial->LightParam.ParamTexHand));
+		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(pMtrl->m_oLightParam.m_idTexParamHand));
 	}
 	else
 		MLSet::DXDevice->SetTexture(MTL_TEX_R_PARAM_LIGHT, SGCore_LoadTexGetTex(MLSet::IDsTexs::NullMaterial));
 
 
-	if (tmpmaterial->PreShaderVS != -1)
-		SGCore_ShaderBind(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS);
+	if (pMtrl->m_oMainGraphics.m_idShaderVS != -1)
+		SGCore_ShaderBind(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS);
 
-	if (tmpmaterial->PreShaderPS != -1)
-		SGCore_ShaderBind(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS);
+	if (pMtrl->m_oMainGraphics.m_idShaderPS != -1)
+		SGCore_ShaderBind(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS);
 
-	if (tmpmaterial->VS.IsTransWorld || tmpmaterial->PS.IsTransWorld || tmpmaterial->VS.IsTransWorldView || tmpmaterial->PS.IsTransWorldView || tmpmaterial->VS.IsTransWorldViewProjection || tmpmaterial->PS.IsTransWorldViewProjection)
-		worldtrans = SMMatrixTranspose(*world);
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
+		m_mWorldTrans = SMMatrixTranspose(m_mWorld);
 
-	if (tmpmaterial->VS.IsTransWorldView || tmpmaterial->PS.IsTransWorldView || tmpmaterial->VS.IsTransWorldViewProjection || tmpmaterial->PS.IsTransWorldViewProjection)
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
 	{
-		float4x4 view;
-		Core_RMatrixGet(G_RI_MATRIX_VIEW, &view);
+		//float4x4 view;
+		Core_RMatrixGet(G_RI_MATRIX_VIEW, &m_mViewTrans);
 		//MLSet::DXDevice->GetTransform(D3DTS_VIEW, &tmpView);
 		//view = float4x4(tmpView);
-		viewtrans = SMMatrixTranspose(view);
+		m_mViewTrans = SMMatrixTranspose(m_mViewTrans);
 
-		float4x4 proj;
-		Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &proj);
+		//float4x4 proj;
+		Core_RMatrixGet(G_RI_MATRIX_PROJECTION, &m_mProjTrans);
 		//MLSet::DXDevice->GetTransform(D3DTS_PROJECTION, &tmpProjection);
 		//proj = float4x4(tmpProjection);
-		projtrans = SMMatrixTranspose(proj);
+		m_mProjTrans = SMMatrixTranspose(m_mProjTrans);
 	}
 
-	if (tmpmaterial->VS.IsTransWorld)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "World", &worldtrans);
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorld)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "World", &m_mWorldTrans);
 
-	if (tmpmaterial->PS.IsTransWorld)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "World", &worldtrans);
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorld)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "World", &m_mWorldTrans);
 
-	if (tmpmaterial->VS.IsTransView)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "View", &viewtrans);
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransView)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "View", &m_mViewTrans);
 
-	if (tmpmaterial->PS.IsTransView)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "View", &viewtrans);
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransView)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "View", &m_mViewTrans);
 
-	if (tmpmaterial->VS.IsTransProjection)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "Projection", &projtrans);
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransProjection)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Projection", &m_mProjTrans);
 
-	if (tmpmaterial->PS.IsTransProjection)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "Projection", &projtrans);
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransProjection)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Projection", &m_mProjTrans);
 
 
-	if (tmpmaterial->VS.IsTransWorldView || tmpmaterial->PS.IsTransWorldView)
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView)
 	{
-		float4x4 wv = viewtrans * worldtrans;
+		float4x4 wv = m_mViewTrans * m_mWorldTrans;
 
-		if (tmpmaterial->VS.IsTransWorldView)
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "WorldView", &wv);
+		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldView)
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldView", &wv);
 
-		if (tmpmaterial->PS.IsTransWorldView)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "WorldView", &wv);
+		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldView)
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldView", &wv);
 	}
 
-	if (tmpmaterial->VS.IsTransWorldViewProjection || tmpmaterial->PS.IsTransWorldViewProjection)
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
 	{
-		float4x4 tmpVP;
-		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &tmpVP);
-		//MLSet::DXDevice->GetTransform(D3DTS_WORLD1, &tmpVP);
-
-		float4x4 wvp = (*world) * tmpVP;
-		wvp = SMMatrixTranspose(wvp);
+		Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &m_mViewProj);
+		
+		float4x4 mWVP = m_mWorld * m_mViewProj;
+		mWVP = SMMatrixTranspose(mWVP);
 
-		if (tmpmaterial->VS.IsTransWorldViewProjection)
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "WorldViewProjection", &wvp);
+		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWorldViewProjection)
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WorldViewProjection", &mWVP);
 
-		if (tmpmaterial->PS.IsTransWorldViewProjection)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "WorldViewProjection", &wvp);
+		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWorldViewProjection)
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WorldViewProjection", &mWVP);
 	}
 
-	if (tmpmaterial->VS.IsTransPosCam || tmpmaterial->PS.IsTransPosCam)
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam || pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam)
 	{
-		float3 observerpos;
-		Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &observerpos);
+		float3 vObserverPos;
+		Core_RFloat3Get(G_RI_FLOAT3_OBSERVER_POSITION, &vObserverPos);
 
-		if (tmpmaterial->VS.IsTransPosCam)
-			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "PosCam", &observerpos);
+		if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransPosCam)
+			SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "PosCam", &vObserverPos);
 
-		if (tmpmaterial->PS.IsTransPosCam)
-			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "PosCam", &observerpos);
+		if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransPosCam)
+			SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "PosCam", &vObserverPos);
 	}
 
 
-	if (tmpmaterial->VS.IsTransUserData)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "Param", &(tmpmaterial->VS.Param));
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserData)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "Param", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
 
-	if (tmpmaterial->TransVSDataInPS)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "ParamVS", &(tmpmaterial->VS.Param));
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransUserDataInOtherShader)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "ParamVS", &(pMtrl->m_oMainGraphics.m_oDataVS.m_vUserData));
 
-	if (tmpmaterial->PS.IsTransUserData)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "Param", &(tmpmaterial->PS.Param));
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserData)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "Param", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
 
-	if (tmpmaterial->TransPSDataInVS)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "ParamPS", &(tmpmaterial->PS.Param));
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransUserDataInOtherShader)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "ParamPS", &(pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData));
 
-	if (tmpmaterial->VS.IsTransTimeDelta)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "TimeDelta", &float2(CountTimeDelta, float(CurrTimeDelta) * 0.001f));
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransTimeDelta)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
 
-	if (tmpmaterial->PS.IsTransTimeDelta)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "TimeDelta", &float2(CountTimeDelta, float(CurrTimeDelta) * 0.001f));
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransTimeDelta)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "TimeDelta", &float2(m_uiCountTimeDelta, float(m_uiCurrTimeDelta) * 0.001f));
 
-	if (tmpmaterial->VS.IsTransWinSize)
-		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, tmpmaterial->PreShaderVS, "WinSize", &float2_t(*r_win_width, *r_win_height));
+	if (pMtrl->m_oMainGraphics.m_oDataVS.m_isTransWinSize)
+		SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, pMtrl->m_oMainGraphics.m_idShaderVS, "WinSize", &float2_t(*r_win_width, *r_win_height));
 
-	if (tmpmaterial->PS.IsTransWinSize)
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "WinSize", &float2_t(*r_win_width, *r_win_height));
+	if (pMtrl->m_oMainGraphics.m_oDataPS.m_isTransWinSize)
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "WinSize", &float2_t(*r_win_width, *r_win_height));
 
 	//если материалом назначен альфа тест и не включен принудительный
-	if (tmpmaterial->IsAlphaTest && !IsForceblyAlphaTest)
+	if (pMtrl->m_oMainGraphics.m_useAlphaTest && !m_useForceblyAlphaTest)
 	{
 		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, TRUE);
 		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAREF, MTL_ALPHATEST_FREE_VALUE);
 		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
 	}
 	//если не включен принудительный альфа тест
-	else if (!IsForceblyAlphaTest)
+	else if (!m_useForceblyAlphaTest)
 	{
 		MLSet::DXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
 	}
@@ -2142,41 +2108,39 @@ void Materials::Render(ID id, float4x4* world)
 		MLSet::DXDevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
 	}
 
-	
-
 	//почти во всех пиксельных шейдерах материалов есть данна¤ NearFar, необходима¤ д¤л записи глубины
-	if (tmpmaterial->PreShaderPS != -1)
+	if (pMtrl->m_oMainGraphics.m_idShaderPS != -1)
 	{	
 		//освещаемый ли тип материала или нет? Ппрозрачный освещаемый?
 		//0,0.33,0.66,1
-		float zz;
-		if (tmpmaterial->IsUnlit)
+		float fLayer;
+		if (pMtrl->m_oMainGraphics.m_isUnlit)
 		{
-			if (tmpmaterial->LightParam.TypeRefraction == MTLTYPE_TRANSPARENCY_NONE)
-				zz = 0.0;
+			if (!(pMtrl->m_oLightParam.m_isTransparent))
+				fLayer = MTLTYPE_LAYER_OPAQUE_UNLIT;
 			else
-				zz = 0.66;
+				fLayer = MTLTYPE_LAYER_TRANSPARENT_UNLIT;
 		}
 		else
 		{
-			if (tmpmaterial->LightParam.TypeRefraction == MTLTYPE_TRANSPARENCY_NONE)
-				zz = 0.33;
+			if (!(pMtrl->m_oLightParam.m_isTransparent))
+				fLayer = MTLTYPE_LAYER_OPAQUE_LIGHT;
 			else
-				zz = 1;
+				fLayer = MTLTYPE_LAYER_TRANSPARENT_LIGHT;
 		}
 
-		if (tmpmaterial->LightParam.TypeRefraction == MTLTYPE_TRANSPARENCY_ALPHA_LIGHT)
-			++(CurrIdSurf);
+		if (m_useCountSurface && pMtrl->m_oLightParam.m_isTransparent)
+			++(m_idCurrIdSurface);
 
-		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, tmpmaterial->PreShaderPS, "NearFarIsUnlit", &float4_t(*r_near, *r_far, zz, float(CurrIdSurf) / 255.f));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, pMtrl->m_oMainGraphics.m_idShaderPS, "NearFarIsUnlit", &float4_t(*r_near, *r_far, fLayer, float(m_idCurrIdSurface) / 255.f));
 	}
 }
 
-void Materials::RenderLight(float4_t* color, float4x4* world)
+void CMaterials::renderLight(const float4_t *pColor, const float4x4 *pWorld)
 {
 	MTL_PRE_COND_ID(MtrlDefLight, _VOID);
 
-	ArrMaterials[MtrlDefLight]->mtl->PS.Param = *color;
-	Render(MtrlDefLight, world);
-	ArrMaterials[MtrlDefLight]->mtl->PS.Param = float4(0, 0, 0, 0);
+	m_aUnitMtrls[MtrlDefLight]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData = *pColor;
+	render(MtrlDefLight, pWorld);
+	m_aUnitMtrls[MtrlDefLight]->m_pMtrl->m_oMainGraphics.m_oDataPS.m_vUserData = float4(0, 0, 0, 0);
 }
\ No newline at end of file
diff --git a/source/mtllight/material.h b/source/mtllight/material.h
index 1ca4ec226..7a5617d86 100644
--- a/source/mtllight/material.h
+++ b/source/mtllight/material.h
@@ -14,307 +14,410 @@ See the license in LICENSE
 #include <direct.h>
 
 #define MTL_PRE_COND_ID(id,stdval) \
-if (!(id >= 0 && id < ArrMaterials.size()))\
+if (!(id >= 0 && id < m_aUnitMtrls.size()))\
 {LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: unresolved index of access '%d'", GEN_MSG_LOCATION, id); return stdval; }\
-else if (!ArrMaterials[id])\
+else if (!m_aUnitMtrls[id])\
 {LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material '%d' is not init", GEN_MSG_LOCATION, id); return stdval; }
 
 #define MTL_REF_PRE_COND_ID(id,stdval) \
 MTL_PRE_COND_ID(id, stdval)\
-if (!(ArrMaterials[id]->Reflect))\
-{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material id = '%d', name = '%s' unsupported reflection", GEN_MSG_LOCATION, id, ArrMaterials[id]->mtl->Name); return stdval; }
+if (!(m_aUnitMtrls[id]->m_pReflect))\
+{LibReport(REPORT_MSG_LEVEL_ERROR, "%s - material: material id = '%d', name = '%s' unsupported reflection", GEN_MSG_LOCATION, id, m_aUnitMtrls[id]->m_pMtrl->m_sName.c_str()); return stdval; }
 
-class Materials
+class CMaterials
 {
 public:
-	Materials();
-	~Materials();
+	CMaterials();
+	~CMaterials();
 
-	void OnLostDevice();
-	void OnResetDevice();
+	void onLostDevice();
+	void onResetDevice();
 
 	SX_ALIGNED_OP_MEM
 
-	void Clear(bool clear_del);
-	void Update(DWORD timeDelta);
-	void SetMainTexture(ID slot, ID id);
-	void Render(ID id, float4x4* world);
-	void RenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mtl);
-	void RenderLight(float4_t* color, float4x4* world);
-	long GetCount();
+	void clear(bool isClearRefDel);
+	void update(UINT timeDelta);
+	void setMainTexture(ID idSlot, ID idTexure);
+	void render(ID id, const float4x4 *pWorld);
+	void renderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl);
+	void renderLight(const float4_t *pColor, const float4x4 *pWorld);
+	int getCount();
 
-	void SetForceblyAlphaTest(bool isat);
-	bool GetForceblyAlphaTest();
+	void setForceblyAlphaTest(bool useAlphaTest);
+	bool getForceblyAlphaTest();
 
-	void SetIsIncrCountSurf(bool bf);
-	bool GetIsIncrCountSurf();
-	void NullingCurrCountSurf();
-	int GetCurrCountSurf();
-	void SetCurrCountSurf(int count);
+	void setIsIncrCountSurf(bool bf);
+	bool getIsIncrCountSurf();
+	void nullingCurrCountSurf();
+	int getCurrCountSurf();
+	void setCurrCountSurf(int iCount);
 
+	ID mtlLoad(const char *szName, MTLTYPE_MODEL type = MTLTYPE_MODEL_STATIC);
+	void mtlReLoad(ID id, const char *szName = 0);
+	void mtlSave(ID id);
 
-	ID MtlLoad(const char* name, MTLTYPE_MODEL type = MTLTYPE_MODEL_STATIC);
-	void MtlReLoad(ID id, const char* name = 0);
-	void MtlSave(ID id);
-	
-	bool MtlGetUsingAlphaTest(ID id);
-	void MtlSetUsingAlphaTest(ID id, bool is_using);
-	MTLTYPE_REFLECT MtlTypeReflection(ID id);
+	ID getStdMtl(MTLTYPE_MODEL type_model);
+	ID exists(const char *szName);
+	MTLTYPE_MODEL getTypeModel(ID id);
+	void setTypeModel(ID id, MTLTYPE_MODEL type_model);
+	ID getID(const char *szName);
 
-	ID GetStdMtl(MTLTYPE_MODEL type_model);
-	ID IsExists(const char* name);
-	MTLTYPE_MODEL GetTypeModel(ID id);
-	void SetTypeModel(ID id, MTLTYPE_MODEL type_model);
-	ID GetID(const char* name);
+	//######################################################################
 
-	
+	bool mtlGetUsingAlphaTest(ID id);
+	void mtlSetUsingAlphaTest(ID id, bool isUsing);
+	MTLTYPE_REFLECT mtlTypeReflection(ID id);
 
-	///////
+	UINT mtlGetSort(ID id);
 
-	void MtlRefSetIDArr(ID id, ID inid, int cube, ID idarr);
-	ID MtlRefGetIDArr(ID id, ID inid, int cube);
+	void mtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type);
+	MTLTYPE_PHYSIC mtlGetPhysicMaterial(ID id);
 
-	//void MtlRefSetPlane(ID id, D3DXPLANE* plane);
-	//void MtlRefSetCenter(ID id, float3_t* center);
-	void MtlRefPreRenderPlane(ID id, D3DXPLANE* plane);
-	const IFrustum* MtlRefGetfrustum(ID id, int cube);
-	void MtlRefPostRenderPlane(ID id);
-	IDirect3DTexture9* MtlRefPlaneGetTex(ID id);
+	void mtlSetTexture(ID id, const char *szTexture);
+	void mtlGetTexture(ID id, char *szName);
+	ID mtlGetTextureID(ID id);
+	void mtlSetVS(ID id, const char *szNameVS);
+	void mtlGetVS(ID id, char *szNamePS);
+	void mtlSetPS(ID id, const char *szNamePS);
+	void mtlGetPS(ID id, char *szNamePS);
 
-	void MtlRefSetMinMax(ID id, float3_t* min, float3_t* max);
-	bool MtlRefIsAllowedRender(ID id);
 
-	void MtlRefCubeBeginRender(ID id, float3_t* center);
-	void MtlRefCubePreRender(ID id, int cube, float4x4* world);
-	void MtlRefCubePostRender(ID id, int cube);
-	void MtlRefCubeEndRender(ID id, float3_t* viewpos);
-	bool MtlRefUpdateCountUpdate(ID id, float3_t* viewpos);
-	void MtlRefNullingCountUpdate(ID id);
-	IDirect3DCubeTexture9* RefCubeGetTex(ID id);
+	void mtlSetLighting(ID id, bool isLighting);
+	bool mtlGetLighting(ID id);
 
-	//////
+	void mtlSetIsTextureLighting(ID id, bool isTexLighting);
+	bool mtlGetIsTextureLighting(ID id);
 
-	void MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type);
-	MTLTYPE_PHYSIC MtlGetPhysicMaterial(ID id);
+	void mtlSetTextureLighting(ID id, const char *szTex);
+	void mtlGetTextureLighting(ID id, char *szTex);
 
-	void MtlSetTexture(ID id, const char* path_tex);
-	void MtlGetTexture(ID id, char* name);
-	ID MtlGetTextureID(ID id);
-	void MtlSetVS(ID id, const char* path_vs);
-	void MtlGetVS(ID id, char* name);
-	void MtlSetPS(ID id, const char* path_vs);
-	void MtlGetPS(ID id, char* name);
+	void mtlSetRoughness(ID id, float fRroughness);
+	float mtlGetRoughness(ID id);
 
+	void mtlSetF0(ID id, float fF0);
+	float mtlGetF0(ID id);
 
-	void MtlSetLighting(ID id, bool is_lighting);
-	bool MtlGetLighting(ID id);
+	void mtlSetThickness(ID id, float fThickness);
+	float mtlGetThickness(ID id);
 
-	void MtlSetIsTextureLighting(ID id, bool is_tex_lighting);
-	bool MtlGetIsTextureLighting(ID id);
+	void mtlSetDurability(ID id, float fDurability);
+	float mtlGetDurability(ID id);
 
-	void MtlSetTextureLighting(ID id, const char* path_tex);
-	void MtlGetTextureLighting(ID id, char* path_tex);
+	void mtlSetHitChance(ID id, float fHitChance);
+	float mtlGetHitChance(ID id);
 
-	void MtlSetRoughness(ID id, float roughness);
-	float MtlGetRoughness(ID id);
+	void mtlSetDensity(ID id, float fDensity);
+	float mtlGetDensity(ID id);
 
-	void MtlSetF0(ID id, float f0);
-	float MtlGetF0(ID id);
+	void mtlSetTransparency(ID id, bool isTransparent);
+	bool mtlGetTransparency(ID id);
 
-	void MtlSetThickness(ID id, float thickness);
-	float MtlGetThickness(ID id);
+	void mtlSetTypeReflection(ID id, MTLTYPE_REFLECT type);
+	MTLTYPE_REFLECT mtlGetTypeReflection(ID id);
 
-	void MtlSetPenetration(ID id, float penetration);
-	float MtlGetPenetration(ID id);
 
-	void MtlSetHitChance(ID id, float fHitChance);
-	float MtlGetHitChance(ID id);
+	void mtlSetMaskTex(ID id, const char *szTexture);
+	void mtlGetMaskTex(ID id, char *szTexture);
 
-	void MtlSetDensity(ID id, float fDensity);
-	float MtlGetDensity(ID id);
+	void mtlSetMRTex(ID id, int iChannel, const char *szTexture);
+	void mtlGetMRTex(ID id, int iChannel, char *szTexture);
 
-	void MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type);
-	MTLTYPE_TRANSPARENCY MtlGetTypeTransparency(ID id);
+	void mtlSetDTex(ID id, int iChannel, const char *szTexture);
+	void mtlGetDTex(ID id, int iChannel, char *szTexture);
 
-	void MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type);
-	MTLTYPE_REFLECT MtlGetTypeReflection(ID id);
 
+	void mtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend);
+	bool mtlGetStdVS(ID id, MTL_SHADERSTD type);
+	void mtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend);
+	bool mtlGetStdPS(ID id, MTL_SHADERSTD type);
 
-	void MtlSetMaskTex(ID id, const char* path_tex);
-	void MtlGetMaskTex(ID id, char* path_tex);
 
-	void MtlSetMRTex(ID id, int channel, const char* path_tex);
-	void MtlGetMRTex(ID id, int channel, char* path_tex);
+	void mtlSetUserDataVS(ID id, int iComponent, float val);
+	float mtlGetUserDataVS(ID id, int iComponent);
+	void mtlSetUserDataVS_InPS(ID id, bool isSendPS);
+	bool mtlGetUserDataVS_InPS(ID id);
+	void mtlSetUserDataPS(ID id, int iComponent, float fValue);
+	float mtlGetUserDataPS(ID id, int iComponent);
+	void mtlSetUserDataPS_InPS(ID id, bool isSendVS);
+	bool mtlGetUserDataPS_InPS(ID id);
 
-	void MtlSetDTex(ID id, int channel, const char* path_tex);
-	void MtlGetDTex(ID id, int channel, char* path_tex);
+	//**********************************************************************
 
+	void mtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr);
+	ID mtlRefGetIDArr(ID id, ID idOwner, int iCube);
 
-	void MtlSetSTDVS(ID id, MTL_SHADERSTD type, bool is_send);
-	bool MtlGetSTDVS(ID id, MTL_SHADERSTD type);
-	void MtlSetSTDPS(ID id, MTL_SHADERSTD type, bool is_send);
-	bool MtlGetSTDPS(ID id, MTL_SHADERSTD type);
+	void mtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane);
+	const IFrustum* mtlRefGetfrustum(ID id, int iCube);
+	void mtlRefPostRenderPlane(ID id);
+	IDirect3DTexture9* mtlRefPlaneGetTex(ID id);
 
+	void mtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax);
+	bool mtlRefIsAllowedRender(ID id);
 
-	void MtlSetUDVS(ID id, int component, float val);
-	float MtlGetUDVS(ID id, int component);
-	void MtlSetUDVS_InPS(ID id, bool is_send_ps);
-	bool MtlGetUDVS_InPS(ID id);
-	void MtlSetUDPS(ID id, int component, float val);
-	float MtlGetUDPS(ID id, int component);
-	void MtlSetUDPS_InPS(ID id, bool is_send_vs);
-	bool MtlGetUDPS_InPS(ID id);
+	void mtlRefCubeBeginRender(ID id, const float3_t *pCenter);
+	void mtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld);
+	void mtlRefCubePostRender(ID id, int iCube);
+	void mtlRefCubeEndRender(ID id, const float3_t *pViewPos);
+	bool mtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos);
+	void mtlRefNullingCountUpdate(ID id);
+	IDirect3DCubeTexture9* refCubeGetTex(ID id);
 
-	//////
+	//######################################################################
 
-	int DelRefCount();
-	ID DelRefGetIDArr(ID key, ID inid, int cube);
-	void DelRefAllDel();
+	int delRefCount();
+	ID delRefGetIDArr(ID idKey, ID idOwner, int iCube);
+	void delRefAllDel();
 
-	//////
+	//######################################################################
 
-	struct Material
+	struct CMaterial
 	{
-		Material();
-		~Material();
+		CMaterial();
+		~CMaterial();
 
 		SX_ALIGNED_OP_MEM
 
-		void Nulling();
+		//! обнуление всех данных в материале
+		void nulling();
 
-		bool IsDelete;
+		//! удален ли материал
+		bool m_isDelete;
 
-		//структура из материала указывающая на маску и 4 детальных и 4 микрорельефных карты
-		struct MaterialMaskPM
+		//! основные графические свойства
+		struct CMainGraphics
 		{
-			MaterialMaskPM();
-			~MaterialMaskPM();
+			CMainGraphics();
+			~CMainGraphics();
 
-			ID Mask;
-			ID ArrDeatail[4];
-			ID ArrMicroDiffuse[4];
+			//! основная текстура
+			ID m_idMainTexture;
+
+			//! вершинный шейдер
+			ID m_idShaderVS;
+
+			//! пиксельный шейдер
+			ID m_idShaderPS;
+
+			//! неосвещаемый материал
+			bool m_isUnlit;
+
+			//! использовать ли альфа тест
+			bool m_useAlphaTest;
+
+			//! тип модели для рендера
+			MTLTYPE_MODEL type_model;
+
+			//! отправляемые данные в шейдеры
+			struct СDataShader
+			{
+				СDataShader();
+				~СDataShader();
+
+				SX_ALIGNED_OP_MEM
+
+					//! отправлять ли мировую матрицу
+					bool m_isTransWorld;
+
+				//! отправлять ли видову матрицу
+				bool m_isTransView;
+
+				//! отправлять ли проекционную матрицу
+				bool m_isTransProjection;
+
+				//! отправлять ли world * view
+				bool m_isTransWorldView;
+
+				//! отправлять ли world * view * projection
+				bool m_isTransWorldViewProjection;
+
+				//! отправлять ли позицию камеры/наблюдателя
+				bool m_isTransPosCam;
+
+				//! отправлять время кадра
+				bool m_isTransTimeDelta;
+
+				//! отправлять ли пользовательские данные
+				bool m_isTransUserData;
+
+				//! отправлять ли пользовательские данные в другой шейдер
+				bool m_isTransUserDataInOtherShader;
+
+				//! отправлять ли размер окна рендера
+				bool m_isTransWinSize;
+
+				//! пользовательские данные, значения [0, 1]
+				float4 m_vUserData;
+			};
+
+			//! отправляемые данные в вершинный шейдер
+			СDataShader m_oDataVS;
+
+			//! отправляемые данные в пиксельный шейдер
+			СDataShader m_oDataPS;
+		};
+
+		//! детализированные свойства, маска и 4 детальных и 4 микрорельефных карты
+		struct CMaskDetailMicroRelief
+		{
+			CMaskDetailMicroRelief();
+			~CMaskDetailMicroRelief();
+
+			//! идентификатор текстуры маски, где к каждому каналу привязаны 4 детальных и микрорельефных текстуры
+			ID m_idMask;
+
+			//! массив идентификаторов детальных текстур, для каждого канала маски
+			ID m_aDetail[4];
+
+			//! массив идентификаторов микрорельефных текстур (normal map), для каждого канала маски
+			ID m_aMicroRelief[4];
 		};
 
-		//структура из материала определяющая основные характеристики просчета освещения
-		struct MaterialLightParam
+		//! световые свойсвта, основные характеристики просчета освещения
+		struct CLightParam
 		{
-			MaterialLightParam();
-			~MaterialLightParam();
+			CLightParam();
+			~CLightParam();
+
+			//! текстура с параметрами материала (созданная пользователем)
+			ID m_idTexParam;
+
+			//! текстура с параметрами материала, размер 1х1, параметры взяты из текущей структуры
+			ID m_idTexParamHand;
 
-			ID ParamTex;
-			ID ParamTexHand;
+			//! назначена ли (true) текстура для параметров материала (или данные берем из параметров и кладем в рабочую текстуру)
+			bool m_isTextureParam;
 
-			//FOR EDITORS
-			bool IsTextureParam;
+			//! шероховатость [0 - гладкий, 1 - полностью шершавый]
+			float m_fRoughness;
 
-			float RoughnessValue;
-			float F0Value;
-			float ThicknessValue;
+			//! отражательная способность [0 - ничего не отражает, 1 - все отражает]
+			float m_fF0;
 
-			float OldRoughnessValue;
-			float OldF0Value;
-			float OldThicknessValue;
+			//! толщина/просвечиваемость [0 - просвечивается, 1 - не просвечивается]
+			float m_fThickness;
 
-			MTLTYPE_REFLECT TypeReflect;
-			MTLTYPE_TRANSPARENCY TypeRefraction;
+			float m_fOldRoughness;
+			float m_fOldF0;
+			float m_fOldThickness;
+
+			//! тип отражений
+			MTLTYPE_REFLECT m_type_reflect;
+
+			//! прозрачный ли материал
+			bool m_isTransparent;
 		};
 
-		struct MaterialDataShader
+		//! физические свойства
+		struct CPhysics
 		{
-			MaterialDataShader();
-			~MaterialDataShader();
-
-			SX_ALIGNED_OP_MEM
-
-			bool IsTransWorld;
-			bool IsTransView;
-			bool IsTransProjection;
-			bool IsTransWorldView;
-			bool IsTransWorldViewProjection;
-			bool IsTransPosCam;
-			bool IsTransTimeDelta;
-			bool IsTransUserData;
-			bool IsTransWinSize;
-			float4 Param;
-		};
+			CPhysics();
+			~CPhysics();
 
-		MTLTYPE_PHYSIC PhysicsMaterial;
+			//! тип физического материала
+			MTLTYPE_PHYSIC type_physics;
 
-		char Name[64];
-		ID MainTexture;
-		ID PreShaderVS;
-		ID PreShaderPS;
-		
-		MaterialMaskPM MicroDetail;
-		MaterialLightParam LightParam;
+			//! коэффициент пробиваемости [0, ], чем больше тем сложнее пробить
+			float m_fDurability;
+
+			//! шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется]
+			float m_fHitChance;
 
-		MaterialDataShader VS;
-		MaterialDataShader PS;
+			//! плотность материала кг/м3
+			float m_fDensity;
+		};
 
-		bool TransVSDataInPS;
-		bool TransPSDataInVS;
+		//! имя материала
+		String m_sName;
 
-		bool IsUnlit;
-		bool IsAlphaTest;
+		//! основные графические свойства
+		CMainGraphics m_oMainGraphics;
+		
+		//! параметры детальности
+		CMaskDetailMicroRelief m_oMicroDetail;
 
-		float Penetration;
-		float HitChance;
-		float Density;
+		//! параметры освещения
+		CLightParam m_oLightParam;
 
-		MTLTYPE_MODEL Type;
+		//! физические свойства
+		CPhysics m_oPhysics;
 	};
 
-	struct UnitMaterial
+	//! юнит материала
+	struct CUnitMaterial
 	{
-		UnitMaterial();
-		~UnitMaterial();
+		CUnitMaterial();
+		~CUnitMaterial();
+
+		//! указатель материала
+		CMaterial *m_pMtrl;
 
-		Material* mtl;
-		CReflection* Reflect;
+		//! объект отражений
+		CReflection *m_pReflect;
 	};
 
 protected:
 
-	bool IsForceblyAlphaTest;
+	//! использовать ли принудительный альфа тест
+	bool m_useForceblyAlphaTest;
 
-	bool LoadMtl(const char* name, Material** mtl);
-	void CreateMtl(const char* name, Material** mtl, MTLTYPE_MODEL type);
-	ID CreateTexParamLighting(float roughness, float f0, float thickness);
+	bool loadMtl(const char *szName, CMaterial **ppMtrl);
+	void createMtl(const char *szName, CMaterial **ppMtrl, MTLTYPE_MODEL type);
+	ID createTexParamLighting(float fRoughness, float fF0, float fThickness);
 
-	//структура описывающая папку и все текстуры в ней, у каждой свой id для доступа
-	struct TLPath
+	void addName(const char *szName, ID id);
+	ID addUnitMaterial(CUnitMaterial *pUnitMtrl);
+	ID addMaterial(CMaterial *pMtrl);
+
+	//! структура описывающая папку и все текстуры в ней, у каждой свой id для доступа
+	struct CPath
 	{
-		TLPath(){}
+		CPath(){}
 
-		String Path;
+		//! путь
+		String m_sPath;
 
-		struct TLTex
+		struct CObject
 		{
-			TLTex(){ id = -1; }
-			TLTex(ID _id, const char* _name){ id = _id; name = _name; }
-			ID id;
-			String name;
+			CObject(){ m_id = -1; }
+			CObject(ID id, const char *szName){ m_id = id; m_sName = szName; }
+
+			//! идентификатор
+			ID m_id;
+
+			//! имя
+			String m_sName;
 		};
 
-		Array<TLTex*> ArrTex;
+		//! массив CObject
+		Array<CObject*> m_aObjects;
 	};
-	Array<TLPath*> ArrHMtls;
 
-	void AddName(const char* name, ID id);
-	ID AddUnitMaterial(UnitMaterial* umtl);
-	ID AddMaterial(Material* mtl);
+	//! массив путей до текстур/материалов
+	Array<CPath*> m_aMtrlPathes;
 
-	Array<UnitMaterial*> ArrMaterials;
-	Array<Material*> ArrMtrls;
-	Array<CReflection*> ArrDelRefMtrls;
+	//! массив юнитов материалов
+	Array<CUnitMaterial*> m_aUnitMtrls;
 
-	bool IsIncrCountSurf;
-	int CurrIdSurf;
+	//! массив материалов
+	Array<CMaterial*> m_aMtrls;
+
+	//! массив отражений
+	Array<CReflection*> m_aReflections;
+
+	//! использовать ли подсчет поверхностей
+	bool m_useCountSurface;
+
+	//! текущий индентификатор поверхности
+	ID m_idCurrIdSurface;
 
 	int CurrFirstFree;
 
-	DWORD CurrTimeDelta;
-	DWORD CountTimeDelta;
+	//! текущее время кадра в млсек
+	UINT m_uiCurrTimeDelta;
+
+	//! общее время кадров в млсек
+	UINT m_uiCountTimeDelta;
+
 	ID MtrlDefLight;
 	ID MtrlDefTree;
 	ID MtrlDefGrass;
@@ -322,7 +425,7 @@ protected:
 	ID MtrlDefSkin;
 	ID BeginNonDef;
 
-	float4x4 view, proj, worldtrans, viewtrans, projtrans;
+	float4x4 m_mWorld, m_mViewProj, m_mWorldTrans, m_mViewTrans, m_mProjTrans;
 };
 
 #endif
\ No newline at end of file
diff --git a/source/mtllight/ml_data.cpp b/source/mtllight/ml_data.cpp
index d4a6567fb..36a2a5fd6 100644
--- a/source/mtllight/ml_data.cpp
+++ b/source/mtllight/ml_data.cpp
@@ -10,11 +10,6 @@ namespace MLSet
 {
 	void MLInit();
 	IDirect3DDevice9* DXDevice = 0;
-	//float3 ConstCurrCamPos;
-	//float2_t WinSize = float2_t(1024, 768);
-	//DWORD CountTimeDelta = 0;
-	//char StdPathMaterial[1024];
-	//char StdPathMesh[1024];
 
 	//размер текстуры глубины дл¤ локальных источников света
 	float2_t SizeTexDepthGlobal = float2_t(1024, 768);
@@ -47,15 +42,6 @@ namespace MLSet
 
 	void GetArrDownScale4x4(DWORD width, DWORD height, float2 arr[]);
 
-	//fov and ration esesno
-	//float ProjFov = SM_PI * 0.25f;
-	//float ProjRatio = WinSize.x / WinSize.y;
-
-	//ближн¤¤ и дальн¤¤ плоскости
-	//float2_t NearFar = float2_t(0.25f, 400.f);
-
-	//float4x4 MCamView;
-
 	bool IsHalfGenPCFShadowLocal = false;
 
 	//ориентаци¤ и верхний вектор дл¤ рендера в кубическую текстуру
@@ -181,15 +167,8 @@ void MLSet::MLInit()
 
 	const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
-	/*sprintf(MLSet::StdPathMaterial, "%s", Core_RStringGet(G_RI_STRING_PATH_GS_MTRLS));
-	sprintf(MLSet::StdPathMesh, "%s", Core_RStringGet(G_RI_STRING_PATH_GS_MESHES));
-
-	MLSet::WinSize = *winsize;
-	MLSet::ProjFov = projfov;*/
 	MLSet::IDsTexs::Tex_NoiseTex = SGCore_LoadTexAddName("noise_rottex.dds", LOAD_TEXTURE_TYPE_CONST);
 
-
-
 	IDirect3DTexture9* NullMaterial;
 	MLSet::DXDevice->CreateTexture(1, 1, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &NullMaterial, NULL);
 	D3DLOCKED_RECT LockedRect;
@@ -331,7 +310,7 @@ void MLSet::MLInit()
 	//цвет (текстуры)
 	MLSet::IDsRenderTargets::ColorScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_color", tmpcoefsizert);
 	//номрали + микрорельеф
-	MLSet::IDsRenderTargets::NormalScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_normal", tmpcoefsizert);
+	MLSet::IDsRenderTargets::NormalScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A2R10G10B10, D3DPOOL_DEFAULT, "ds_normal", tmpcoefsizert);
 	//параметры освещени¤
 	MLSet::IDsRenderTargets::ParamsScene = SGCore_RTAdd(tmp_sizert.x, tmp_sizert.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, "ds_param", tmpcoefsizert);
 	
diff --git a/source/mtllight/shadow.cpp b/source/mtllight/shadow.cpp
index 4302a2a8c..66926c6dd 100644
--- a/source/mtllight/shadow.cpp
+++ b/source/mtllight/shadow.cpp
@@ -14,9 +14,9 @@ PSSM::PSSM()
 		for(int i=0;i<5;i++)
 		{
 			DepthSurfaces[i] = 0;
-			DepthMaps[i] = 0;
-			Frustums[i] = 0;
-			IsUpdate[i] = 0;
+			m_aDepthMaps[i] = 0;
+			m_aFrustums[i] = 0;
+			m_aIsUpdate[i] = 0;
 
 			//IDArr[i] = -1;
 		}
@@ -31,9 +31,9 @@ PSSM::~PSSM()
 {
 	for(int i=0;i<5;i++)
 	{
-		mem_release_del(DepthMaps[i]);
+		mem_release_del(m_aDepthMaps[i]);
 		mem_release_del(DepthSurfaces[i]);
-		mem_release_del(Frustums[i]);
+		mem_release_del(m_aFrustums[i]);
 	}
 
 	for (int i = 0; i < IDArr.size(); i++)
@@ -48,37 +48,37 @@ PSSM::~PSSM()
 	mem_release_del(OldColorSurface);
 }
 
-void PSSM::SetPosition(float3* pos)
+void PSSM::setPosition(const float3* pos)
 { 
 	Position = *pos; 
 }
 
-void PSSM::GetPosition(float3* pos)
+void PSSM::getPosition(float3* pos)
 { 
 	*pos = Position; 
 }
 
-void PSSM::Set4Or3Splits(bool is4)
+void PSSM::set4Or3Splits(bool is4)
 { 
 	Generating4Slits = is4; 
 }
 
-bool PSSM::Get4Or3Splits()
+bool PSSM::get4Or3Splits()
 { 
 	return Generating4Slits; 
 }
 
-void PSSM::SetBlurPixel(float blur_pixel)
+void PSSM::setBlurPixel(float blur_pixel)
 {
 	BlurPixel = blur_pixel;
 }
 
-bool PSSM::GetBlurPixel()
+bool PSSM::getBlurPixel()
 {
 	return BlurPixel;
 }
 
-void PSSM::SetIDArr(ID id, int split, ID idarr)
+void PSSM::setIDArr(ID id, int split, ID idarr)
 {
 	if (id < 0 || !(split >= 0 && split < 5))
 		return;
@@ -94,12 +94,12 @@ void PSSM::SetIDArr(ID id, int split, ID idarr)
 	IDArr[id][split] = idarr;
 }
 
-long PSSM::GetCountIDArrs()
+long PSSM::getCountIDArrs()
 {
 	return IDArr.size();
 }
 
-ID PSSM::GetIDArr(ID id, int split)
+ID PSSM::getIDArr(ID id, int split)
 {
 	if (id < 0 || !(split >= 0 && split < 5) || !(id < IDArr.size()))
 		return -2;
@@ -107,18 +107,18 @@ ID PSSM::GetIDArr(ID id, int split)
 	return IDArr[id][split];
 }
 
-void PSSM::OnLostDevice()
+void PSSM::onLostDevice()
 {
 		for(int i=0;i<5;i++)
 		{
-			mem_release_del(DepthMaps[i]);
+			mem_release_del(m_aDepthMaps[i]);
 			mem_release_del(DepthSurfaces[i]);
 		}
 
 	mem_release_del(DepthStencilSurface);
 }
 
-void PSSM::OnResetDevice()
+void PSSM::onResetDevice()
 {
 	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
 	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
@@ -127,9 +127,9 @@ void PSSM::OnResetDevice()
 
 		for(int i=0;i<5;i++)
 		{
-			IsUpdate[i] = 0;
+			m_aIsUpdate[i] = 0;
 
-			HRESULT hr = MLSet::DXDevice->CreateTexture(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F,D3DPOOL_DEFAULT, &(DepthMaps[i]), NULL);
+			HRESULT hr = MLSet::DXDevice->CreateTexture(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F,D3DPOOL_DEFAULT, &(m_aDepthMaps[i]), NULL);
 
 				/*if(FAILED(hr))
 					LibReport(REPORT_MSG_LEVEL_ERROR,"Ќе удалось создать текстуру глубины PSSM");*/
@@ -151,7 +151,7 @@ void PSSM::OnResetDevice()
 								fOffset.x,	fOffset.y,	fBias,		1.0f);
 }
 
-void PSSM::Init()
+void PSSM::init()
 {
 	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
 	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
@@ -166,30 +166,30 @@ void PSSM::Init()
 
 		for(int i=0;i<5;i++)
 		{
-			IsUpdate[i] = 0;
+			m_aIsUpdate[i] = 0;
 
-			MLSet::DXDevice->CreateTexture(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F,D3DPOOL_DEFAULT, &(DepthMaps[i]), NULL);
+			MLSet::DXDevice->CreateTexture(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F,D3DPOOL_DEFAULT, &(m_aDepthMaps[i]), NULL);
 
 			DepthSurfaces[i] = 0;
 
-			Frustums[i] = SGCore_CrFrustum();
+			m_aFrustums[i] = SGCore_CrFrustum();
 		}
 
-	NearFar[0].x = *r_near;
-	NearFar[0].y = MLSet::DistForPSSM.x;
+	m_aNearFar[0].x = *r_near;
+	m_aNearFar[0].y = MLSet::DistForPSSM.x;
 
-	NearFar[1].x = MLSet::DistForPSSM.x;
-	NearFar[1].y = MLSet::DistForPSSM.y;
+	m_aNearFar[1].x = MLSet::DistForPSSM.x;
+	m_aNearFar[1].y = MLSet::DistForPSSM.y;
 
-	NearFar[2].x = MLSet::DistForPSSM.y;
-	NearFar[2].y = MLSet::DistForPSSM.z;
+	m_aNearFar[2].x = MLSet::DistForPSSM.y;
+	m_aNearFar[2].y = MLSet::DistForPSSM.z;
 
-	NearFar[3].x = MLSet::DistForPSSM.z;
-	NearFar[3].y = MLSet::DistForPSSM.w;
+	m_aNearFar[3].x = MLSet::DistForPSSM.z;
+	m_aNearFar[3].y = MLSet::DistForPSSM.w;
 
 
-	NearFar[4].x = *r_near;
-	NearFar[4].y = *r_far;
+	m_aNearFar[4].x = *r_near;
+	m_aNearFar[4].y = *r_far;
 
 	MLSet::DXDevice->CreateDepthStencilSurface(MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y, D3DFMT_D24X8,D3DMULTISAMPLE_NONE, 0, TRUE, &DepthStencilSurface, NULL);
 	
@@ -203,7 +203,7 @@ void PSSM::Init()
 }
 
 
-void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
+void PSSM::updateFrustums(int split, const float3* poscam, const float3* dircam)
 {
 	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
 	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
@@ -213,40 +213,40 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
 	FovRatio.x = *r_default_fov;
 	FovRatio.y = float(*r_win_width) / float(*r_win_height);
 
-	Frustums[split]->update(&(Views[split]), &(Projs[split]));
+	m_aFrustums[split]->update(&(Views[split]), &(Projs[split]));
 
 	float3 up(0.0f, 1.0f, 0.0f);
 	float3 right = SMVector3Normalize(SMVector3Cross((*dircam), up));
 
-	float3 fc = (*poscam) + (*dircam)*NearFar[split].y;
-	float3 nc = (*poscam) + (*dircam)*NearFar[split].x;
+	float3 fc = (*poscam) + (*dircam)*m_aNearFar[split].y;
+	float3 nc = (*poscam) + (*dircam)*m_aNearFar[split].x;
 
 	up = SMVector3Normalize(SMVector3Cross(right, (*dircam)));
 
-	float near_height = tan(FovRatio.x / 2.f) * NearFar[split].x;
+	float near_height = tan(FovRatio.x / 2.f) * m_aNearFar[split].x;
 	float near_width = near_height * FovRatio.y;
-	float far_height = tan(FovRatio.x / 2.f) * NearFar[split].y;
+	float far_height = tan(FovRatio.x / 2.f) * m_aNearFar[split].y;
 	float far_width = far_height * FovRatio.y;
 
-	Frustums[split]->setPoint(0, &float3(nc - up*near_height - right*near_width));
-	Frustums[split]->setPoint(1, &float3(nc + up*near_height - right*near_width));
-	Frustums[split]->setPoint(2, &float3(nc + up*near_height + right*near_width));
-	Frustums[split]->setPoint(3, &float3(nc - up*near_height + right*near_width));
+	m_aFrustums[split]->setPoint(0, &float3(nc - up*near_height - right*near_width));
+	m_aFrustums[split]->setPoint(1, &float3(nc + up*near_height - right*near_width));
+	m_aFrustums[split]->setPoint(2, &float3(nc + up*near_height + right*near_width));
+	m_aFrustums[split]->setPoint(3, &float3(nc - up*near_height + right*near_width));
 
-	Frustums[split]->setPoint(4, &float3(fc - up*far_height - right*far_width));
-	Frustums[split]->setPoint(5, &float3(fc + up*far_height - right*far_width));
-	Frustums[split]->setPoint(6, &float3(fc + up*far_height + right*far_width));
-	Frustums[split]->setPoint(7, &float3(fc - up*far_height + right*far_width));
+	m_aFrustums[split]->setPoint(4, &float3(fc - up*far_height - right*far_width));
+	m_aFrustums[split]->setPoint(5, &float3(fc + up*far_height - right*far_width));
+	m_aFrustums[split]->setPoint(6, &float3(fc + up*far_height + right*far_width));
+	m_aFrustums[split]->setPoint(7, &float3(fc - up*far_height + right*far_width));
 
 	float3 vCenter(0, 0, 0);
 	for (int i = 0; i < 8; i++)
-		vCenter += Frustums[split]->getPoint(i);
+		vCenter += m_aFrustums[split]->getPoint(i);
 	vCenter /= 8;
-	Frustums[split]->setCenter(&vCenter);
+	m_aFrustums[split]->setCenter(&vCenter);
 
 	float dist = 1;
 	float3 DirL = Position;
-	float3 TarG = float3(Frustums[split]->getCenter());
+	float3 TarG = float3(m_aFrustums[split]->getCenter());
 
 	float3 LightPos = TarG + DirL*dist;
 	float3 LightPos2 = DirL;
@@ -262,7 +262,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
 	float maxZ = 0;
 
 	float4 trans0;
-	float4 transform0(Frustums[split]->getPoint(0), 1);
+	float4 transform0(m_aFrustums[split]->getPoint(0), 1);
 	trans0 = SMVector4Transform(transform0, Views[split]);
 
 	minX = trans0.x; maxX = trans0.x;
@@ -272,7 +272,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
 	for (int i = 0; i<8; i++)
 	{
 		float4 trans;
-		float4 transform(Frustums[split]->getPoint(i), 1);
+		float4 transform(m_aFrustums[split]->getPoint(i), 1);
 
 		trans = SMVector4Transform(transform, Views[split]);
 
@@ -294,7 +294,7 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
 	float2 OrtMax = float2(maxX, maxY);
 	float2 OrtMin = float2(minX, minY);
 
-	float3 Diagonal = Frustums[split]->getPoint(0) - Frustums[split]->getPoint(6);
+	float3 Diagonal = m_aFrustums[split]->getPoint(0) - m_aFrustums[split]->getPoint(6);
 	float LengthDiagonal = SMVector3Length(Diagonal);
 
 	float2 BoarderOffset = (float2(LengthDiagonal, LengthDiagonal) - (OrtMax - OrtMin)) * 0.5;
@@ -319,10 +319,10 @@ void PSSM::UpdateFrustums(int split, const float3* poscam, const float3* dircam)
 	Projs[split] = float4x4(tmpproj);
 
 	ViewProj[split] = Views[split] * Projs[split];
-	Flickering(&ViewProj[split], MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y);
+	flickering(&ViewProj[split], MLSet::SizeTexDepthGlobal.x, MLSet::SizeTexDepthGlobal.y);
 }
 
-void PSSM::PreRender(int split)
+void PSSM::preRender(int split)
 {
 	/*MLSet::DXDevice->SetTransform(D3DTS_WORLD1,&(ViewProj[split].operator D3DXMATRIX()));
 	MLSet::DXDevice->SetTransform(D3DTS_VIEW,&(Views[split].operator D3DXMATRIX()));
@@ -337,14 +337,14 @@ void PSSM::PreRender(int split)
 	SGCore_ShaderBind(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::SMDepthGeomPSSMDirect);
 
 	mem_release_del(DepthSurfaces[split]);
-	DepthMaps[split]->GetSurfaceLevel(0, &(DepthSurfaces[split]));
+	m_aDepthMaps[split]->GetSurfaceLevel(0, &(DepthSurfaces[split]));
 	
 	MLSet::DXDevice->SetRenderTarget(0, DepthSurfaces[split]);
 	
 	MLSet::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255,255,255,255), 1.0f, 0);
 }
 
-void PSSM::Begin()
+void PSSM::begin()
 {
 	MLSet::DXDevice->GetDepthStencilSurface(&OldDepthStencilSurface);
 	MLSet::DXDevice->SetDepthStencilSurface(DepthStencilSurface);
@@ -359,7 +359,7 @@ void PSSM::Begin()
 	Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &OldViewProj);
 }
 
-void PSSM::End()
+void PSSM::end()
 {
 	MLSet::DXDevice->SetDepthStencilSurface(OldDepthStencilSurface);
 	MLSet::DXDevice->SetRenderTarget(0, OldColorSurface);
@@ -377,15 +377,15 @@ void PSSM::End()
 
 	/*if (GetAsyncKeyState(VK_NUMPAD1))
 	{
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow0.bmp", D3DXIFF_PNG, DepthMaps[0], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow1.bmp", D3DXIFF_PNG, DepthMaps[1], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow2.bmp", D3DXIFF_PNG, DepthMaps[2], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow3.bmp", D3DXIFF_PNG, DepthMaps[3], NULL);
-		D3DXSaveTextureToFile("C:\\1\\depthmapshadow4.bmp", D3DXIFF_PNG, DepthMaps[4], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow0.bmp", D3DXIFF_PNG, m_aDepthMaps[0], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow1.bmp", D3DXIFF_PNG, m_aDepthMaps[1], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow2.bmp", D3DXIFF_PNG, m_aDepthMaps[2], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow3.bmp", D3DXIFF_PNG, m_aDepthMaps[3], NULL);
+		D3DXSaveTextureToFile("C:\\1\\depthmapshadow4.bmp", D3DXIFF_PNG, m_aDepthMaps[4], NULL);
 	}*/
 }
 
-void PSSM::Flickering(float4x4 *matLVP,float size_x,float size_y)
+void PSSM::flickering(float4x4 *matLVP,float size_x,float size_y)
 {
 	float3 ptOriginShadow(0,0,0);
 	ptOriginShadow = SMVector3Transform(ptOriginShadow,*matLVP);
@@ -417,7 +417,7 @@ void PSSM::Flickering(float4x4 *matLVP,float size_x,float size_y)
 	*matLVP = SMMatrixMultiply(*matLVP,xRounding);
 }
 
-void PSSM::GenShadow2(IDirect3DTexture9* shadowmap)
+void PSSM::genShadow(IDirect3DTexture9* shadowmap)
 {
 	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
 	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
@@ -446,7 +446,7 @@ void PSSM::GenShadow2(IDirect3DTexture9* shadowmap)
 	char mattex[16];
 	for (int i = 0; i<5; i++)
 	{
-		MLSet::DXDevice->SetTexture(1 + i, DepthMaps[i]);
+		MLSet::DXDevice->SetTexture(1 + i, m_aDepthMaps[i]);
 		sprintf(mattex, "MatrixTexture%d", 1 + i);
 		MatrixTexture = ViewProj[i] * ScaleBiasMat;
 		MatrixTexture = SMMatrixTranspose(MatrixTexture);
@@ -485,14 +485,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(*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));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM4, "DistSplit", &float4(m_aNearFar[0].y, m_aNearFar[1].y, m_aNearFar[2].y, m_aNearFar[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(*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));
+		SGCore_ShaderSetVRF(SHADER_TYPE_PIXEL, MLSet::IDsShaders::PS::PSSM3, "DistSplit", &float4(m_aNearFar[0].y, m_aNearFar[1].y, m_aNearFar[2].y, m_aNearFar[3].y));
 	}
 
 	SGCore_ScreenQuadDraw();
@@ -506,7 +506,7 @@ void PSSM::GenShadow2(IDirect3DTexture9* shadowmap)
 	mem_release_del(BackBuf);
 }
 
-void PSSM::GenShadowAll(IDirect3DTexture9* shadowmap)
+void PSSM::genShadowAll(IDirect3DTexture9* shadowmap)
 {
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 
@@ -522,16 +522,16 @@ void PSSM::GenShadowAll(IDirect3DTexture9* shadowmap)
 	mem_release_del(BackBuf);
 }
 
-///////////////////////////////
+//##########################################################################
 
-void ShadowMapTech::OnLostDevice()
+void ShadowMapTech::onLostDevice()
 {
 	mem_release_del(DepthMap);
 	mem_release_del(DepthStencilSurface);
 	mem_release_del(DepthSurface);
 }
 
-void ShadowMapTech::OnResetDevice()
+void ShadowMapTech::onResetDevice()
 {
 	MLSet::DXDevice->CreateTexture(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.y, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, &(DepthMap), NULL);
 	MLSet::DXDevice->CreateDepthStencilSurface(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.y, D3DFMT_D24X8,D3DMULTISAMPLE_NONE, 0, TRUE, &DepthStencilSurface, NULL);
@@ -567,58 +567,58 @@ ShadowMapTech::~ShadowMapTech()
 	mem_release_del(OldColorSurface);
 }
 
-void ShadowMapTech::SetPosition(const float3* pos)
+void ShadowMapTech::setPosition(const float3* pos)
 {
 	Position = *pos;
 }
 
-void ShadowMapTech::GetPosition(float3* pos)
+void ShadowMapTech::getPosition(float3* pos)
 {
 	*pos = Position;
 }
 
-void ShadowMapTech::SetDirection(const float3* dir)
+void ShadowMapTech::setDirection(const float3* dir)
 {
 	Direction = *dir;
 }
 
-void ShadowMapTech::GetDirection(float3* dir)
+void ShadowMapTech::getDirection(float3* dir)
 {
 	*dir = Direction;
 }
 
-void ShadowMapTech::SetAngleNearFar(const float3* anf)
+void ShadowMapTech::setAngleNearFar(const float3* anf)
 {
 	AngleNearFar = *anf;
 }
 
-void ShadowMapTech::GetAngleNearFar(float3* anf)
+void ShadowMapTech::getAngleNearFar(float3* anf)
 {
 	*anf = AngleNearFar;
 }
 
-void ShadowMapTech::SetBias(float bias)
+void ShadowMapTech::setBias(float bias)
 {
 	Bias = bias;
 }
 
-float ShadowMapTech::GetBias()
+float ShadowMapTech::getBias()
 {
 	return Bias;
 }
 
 
-void ShadowMapTech::SetBlurPixel(float blur_pixel)
+void ShadowMapTech::setBlurPixel(float blur_pixel)
 {
 	BlurPixel = blur_pixel;
 }
 
-float ShadowMapTech::GetBlurPixel()
+float ShadowMapTech::getBlurPixel()
 {
 	return BlurPixel;
 }
 
-void ShadowMapTech::Init()
+void ShadowMapTech::init()
 {
 	Frustum = SGCore_CrFrustum();
 	
@@ -635,37 +635,37 @@ void ShadowMapTech::Init()
 								fOffset,	fOffset,	fBias,		1.0f);
 }
 
-void ShadowMapTech::SetFar(float sfar)
+void ShadowMapTech::setFar(float sfar)
 {
 	AngleNearFar.z = sfar;
 }
 
-float ShadowMapTech::GetFar()
+float ShadowMapTech::getFar()
 {
 	return AngleNearFar.z;
 }
 
-void ShadowMapTech::SetNear(float snear)
+void ShadowMapTech::setNear(float snear)
 {
 	AngleNearFar.y = snear;
 }
 
-float ShadowMapTech::GetNear()
+float ShadowMapTech::getNear()
 {
 	return AngleNearFar.y;
 }
 
-void ShadowMapTech::SetAngle(float sangle)
+void ShadowMapTech::setAngle(float sangle)
 {
 	AngleNearFar.x = sangle;
 }
 
-float ShadowMapTech::GetAngle()
+float ShadowMapTech::getAngle()
 {
 	return AngleNearFar.x;
 }
 
-void ShadowMapTech::SetIDArr(long id, long idarr)
+void ShadowMapTech::setIDArr(long id, long idarr)
 {
 	if (id < 0)
 		return;
@@ -673,12 +673,12 @@ void ShadowMapTech::SetIDArr(long id, long idarr)
 	IDArr[id] = idarr;
 }
 
-long ShadowMapTech::GetCountIDArrs()
+long ShadowMapTech::getCountIDArrs()
 {
 	return IDArr.size();
 }
 
-long ShadowMapTech::GetIDArr(long id)
+long ShadowMapTech::getIDArr(long id)
 {
 	if (id < 0 || !(id < IDArr.size()))
 		return -2;
@@ -686,7 +686,7 @@ long ShadowMapTech::GetIDArr(long id)
 	return IDArr[id];
 }
 
-void ShadowMapTech::Begin()
+void ShadowMapTech::begin()
 {
 	MLSet::DXDevice->GetDepthStencilSurface(&OldDepthStencilSurface);
 	MLSet::DXDevice->SetDepthStencilSurface(DepthStencilSurface);
@@ -730,7 +730,7 @@ void ShadowMapTech::Begin()
 	MLSet::DXDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(255,255,255,255), 1.0f, 0);
 }
 
-void ShadowMapTech::End()
+void ShadowMapTech::end()
 {
 	MLSet::DXDevice->SetDepthStencilSurface(OldDepthStencilSurface);
 	MLSet::DXDevice->SetRenderTarget(0, OldColorSurface);
@@ -747,7 +747,7 @@ void ShadowMapTech::End()
 	Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &OldViewProj);
 }
 
-void ShadowMapTech::GenShadow2(IDirect3DTexture9* shadowmap)
+void ShadowMapTech::genShadow(IDirect3DTexture9* shadowmap)
 {
 	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
 	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
@@ -834,9 +834,9 @@ void ShadowMapTech::GenShadow2(IDirect3DTexture9* shadowmap)
 	mem_release_del(BackBuf);
 }
 
-///////////////////////////////
+//##########################################################################
 
-void ShadowMapCubeTech::OnLostDevice()
+void ShadowMapCubeTech::onLostDevice()
 {
 	mem_release_del(DepthMap);
 	mem_release_del(DepthStencilSurface);
@@ -852,7 +852,7 @@ void ShadowMapCubeTech::OnLostDevice()
 	mem_release_del(OldColorSurface);
 }
 
-void ShadowMapCubeTech::OnResetDevice()
+void ShadowMapCubeTech::onResetDevice()
 {
 	D3DXCreateCubeTexture(MLSet::DXDevice, MLSet::SizeTexDepthLocal.x, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R32F, D3DPOOL_DEFAULT, &DepthMap);
 	MLSet::DXDevice->CreateDepthStencilSurface(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.x, D3DFMT_D24X8,D3DMULTISAMPLE_NONE, 0, TRUE, &DepthStencilSurface, NULL);
@@ -862,7 +862,7 @@ ShadowMapCubeTech::~ShadowMapCubeTech()
 {
 	for (int i = 0; i < 6; ++i)
 	{
-		mem_release_del(Frustums[i]);
+		mem_release_del(m_aFrustums[i]);
 		mem_release_del(DepthSurface[i]);
 	}
 
@@ -882,7 +882,7 @@ ShadowMapCubeTech::ShadowMapCubeTech()
 {
 	for (int i = 0; i < 6; ++i)
 	{
-		Frustums[i] = 0;
+		m_aFrustums[i] = 0;
 		DepthSurface[i] = 0;
 		//IDArr[i] = -1;
 	}
@@ -899,7 +899,7 @@ ShadowMapCubeTech::ShadowMapCubeTech()
 	OldDepthStencilSurface = 0;
 }
 
-void ShadowMapCubeTech::SetEnableCubeEdge(int edge,bool enable)
+void ShadowMapCubeTech::setEnableCubeEdge(int edge,bool enable)
 {
 	if (edge >= 0 && edge <= 5)
 	{
@@ -910,80 +910,80 @@ void ShadowMapCubeTech::SetEnableCubeEdge(int edge,bool enable)
 	}
 }
 
-bool ShadowMapCubeTech::GetEnableCubeEdge(int edge)
+bool ShadowMapCubeTech::getEnableCubeEdge(int edge)
 {
 		if(edge >= 0 && edge <= 5)
 			return EnableEdge[edge];
 		return(false);
 }
 
-void ShadowMapCubeTech::SetBias(float bias)
+void ShadowMapCubeTech::setBias(float bias)
 { 
 	Bias = bias; 
 }
 
-float ShadowMapCubeTech::GetBias()
+float ShadowMapCubeTech::getBias()
 { 
 	return Bias; 
 }
 
-void ShadowMapCubeTech::SetBlurPixel(float blur_pixel)
+void ShadowMapCubeTech::setBlurPixel(float blur_pixel)
 { 
 	BlurPixel = blur_pixel; 
 }
 
-bool ShadowMapCubeTech::GetBlurPixel()
+bool ShadowMapCubeTech::getBlurPixel()
 { 
 	return BlurPixel; 
 }
 
-void ShadowMapCubeTech::SetPosition(float3* pos)
+void ShadowMapCubeTech::setPosition(float3* pos)
 {
 	Position = *pos;
 }
 
-void ShadowMapCubeTech::GetPosition(float3* pos)
+void ShadowMapCubeTech::getPosition(float3* pos)
 {
 	*pos = Position;
 }
 
-void ShadowMapCubeTech::SetNearFar(float2* nf)
+void ShadowMapCubeTech::setNearFar(float2* nf)
 {
-	NearFar = *nf;
+	m_vNearFar = *nf;
 }
 
-void ShadowMapCubeTech::GetNearFar(float2* nf)
+void ShadowMapCubeTech::getNearFar(float2* nf)
 {
-	*nf = NearFar;
+	*nf = m_vNearFar;
 }
 
-void ShadowMapCubeTech::SetNear(float val)
+void ShadowMapCubeTech::setNear(float val)
 {
-	NearFar.x = val;
+	m_vNearFar.x = val;
 }
 
-float ShadowMapCubeTech::GetNear()
+float ShadowMapCubeTech::getNear()
 {
-	return NearFar.x;
+	return m_vNearFar.x;
 }
 
 
-void ShadowMapCubeTech::SetFar(float val)
+void ShadowMapCubeTech::setFar(float val)
 {
-	NearFar.y = val;
+	m_vNearFar.y = val;
 }
 
-float ShadowMapCubeTech::GetFar()
+float ShadowMapCubeTech::getFar()
 {
-	return NearFar.y;
+	return m_vNearFar.y;
 }
 
 
-void ShadowMapCubeTech::Init()
+void ShadowMapCubeTech::init()
 {
 	for (int i = 0; i < 6; ++i)
 	{
-		Frustums[i] = SGCore_CrFrustum();
+		m_aFrustums[i] = SGCore_CrFrustum();
 	}
 
 	DepthSurface[0] = 0;
@@ -997,7 +997,7 @@ void ShadowMapCubeTech::Init()
 	MLSet::DXDevice->CreateDepthStencilSurface(MLSet::SizeTexDepthLocal.x, MLSet::SizeTexDepthLocal.x, D3DFMT_D24X8,D3DMULTISAMPLE_NONE, 0, TRUE, &DepthStencilSurface, NULL);
 }
 
-void ShadowMapCubeTech::Begin()
+void ShadowMapCubeTech::begin()
 {
 	MLSet::DXDevice->GetDepthStencilSurface(&OldDepthStencilSurface);
 	MLSet::DXDevice->SetDepthStencilSurface(DepthStencilSurface);
@@ -1012,7 +1012,7 @@ void ShadowMapCubeTech::Begin()
 	Core_RMatrixGet(G_RI_MATRIX_VIEWPROJ, &OldViewProj);
 }
 
-void ShadowMapCubeTech::Pre(int cube)
+void ShadowMapCubeTech::pre(int cube)
 {
 	if (!EnableEdge[cube])
 	{
@@ -1031,12 +1031,12 @@ void ShadowMapCubeTech::Pre(int cube)
 
 	View[cube] = SMMatrixLookAtLH(Position, MLSet::OrientedCube[cube] + Position, MLSet::UpVectorsCube[cube]);
 
-	Proj[cube] = SMMatrixPerspectiveFovLH(SM_PI/2.f,1,NearFar.x,NearFar.y);
+	Proj[cube] = SMMatrixPerspectiveFovLH(SM_PI / 2.f, 1, m_vNearFar.x, m_vNearFar.y);
 
 	//MLSet::DXDevice->SetTransform(D3DTS_VIEW,&(View[cube].operator D3DXMATRIX()));
 	//MLSet::DXDevice->SetTransform(D3DTS_PROJECTION,&(Proj[cube].operator D3DXMATRIX()));
 
-	Frustums[cube]->update(&(View[cube]), &(Proj[cube]));
+	m_aFrustums[cube]->update(&(View[cube]), &(Proj[cube]));
 
 	float4x4 vp = View[cube] * Proj[cube];
 
@@ -1062,7 +1062,7 @@ void ShadowMapCubeTech::Pre(int cube)
 	SGCore_ShaderSetVRF(SHADER_TYPE_VERTEX, MLSet::IDsShaders::VS::SMDepthGeomCube, "WorldViewProjection", &vp);
 }
 
-void ShadowMapCubeTech::Post(int cube)
+void ShadowMapCubeTech::post(int cube)
 {
 		if(GetAsyncKeyState(VK_NUMPAD5))
 		{
@@ -1073,7 +1073,7 @@ void ShadowMapCubeTech::Post(int cube)
 	mem_release_del(DepthSurface[cube]);
 }
 
-void ShadowMapCubeTech::End()
+void ShadowMapCubeTech::end()
 {
 	MLSet::DXDevice->SetDepthStencilSurface(OldDepthStencilSurface);
 	MLSet::DXDevice->SetRenderTarget(0, OldColorSurface);
@@ -1089,7 +1089,7 @@ void ShadowMapCubeTech::End()
 	Core_RMatrixSet(G_RI_MATRIX_VIEWPROJ, &OldViewProj);
 }
 
-void ShadowMapCubeTech::GenShadow2(IDirect3DTexture9* shadowmap)
+void ShadowMapCubeTech::genShadow(IDirect3DTexture9* shadowmap)
 {
 	static const int *r_win_width = GET_PCVAR_INT("r_win_width");
 	static const int *r_win_height = GET_PCVAR_INT("r_win_height");
@@ -1167,7 +1167,7 @@ void ShadowMapCubeTech::GenShadow2(IDirect3DTexture9* shadowmap)
 	mem_release_del(BackBuf);
 }
 
-void ShadowMapCubeTech::SetIDArr(long id, int split, long idarr)
+void ShadowMapCubeTech::setIDArr(long id, int split, long idarr)
 {
 	if (id < 0 || !(split >= 0 && split < 6))
 		return;
@@ -1183,12 +1183,12 @@ void ShadowMapCubeTech::SetIDArr(long id, int split, long idarr)
 	IDArr[id][split] = idarr;
 }
 
-long ShadowMapCubeTech::GetCountIDArrs()
+long ShadowMapCubeTech::getCountIDArrs()
 {
 	return IDArr.size();
 }
 
-long ShadowMapCubeTech::GetIDArr(long id, int split)
+long ShadowMapCubeTech::getIDArr(long id, int split)
 {
 	if (id < 0 || !(split >= 0 && split < 6) || !(id < IDArr.size()))
 		return -2;
diff --git a/source/mtllight/shadow.h b/source/mtllight/shadow.h
index db31a11cd..0d0e0f6a8 100644
--- a/source/mtllight/shadow.h
+++ b/source/mtllight/shadow.h
@@ -24,47 +24,46 @@ public:
 	PSSM();
 	~PSSM();
 
-	void OnLostDevice();
-	void OnResetDevice();
+	void onLostDevice();
+	void onResetDevice();
 
 	SX_ALIGNED_OP_MEM
 
-	void Init();
+	void init();
 
-	void UpdateFrustums(int split, const float3* poscam, const float3* dircam);
-	void PreRender(int spilt);
-	void Begin();
-	void End();
+	void updateFrustums(int iSplit, const float3 *pPosCam, const float3 *pDirCam);
+	void preRender(int iSplit);
+	void begin();
+	void end();
 
-	void GenShadow2(IDirect3DTexture9* shadowmap);
-	void GenShadowAll(IDirect3DTexture9* shadowmap);
+	void genShadow(IDirect3DTexture9 *pShadowMap);
+	void genShadowAll(IDirect3DTexture9 *pShadowMap);
 	
-	void SetPosition(float3* pos);
-	void GetPosition(float3* pos);
+	void setPosition(const float3 *pPos);
+	void getPosition(float3 *pPos);
 
-	void SetBlurPixel(float blur_pixel);
-	bool GetBlurPixel();
+	void setBlurPixel(float fBlurPixel);
+	bool getBlurPixel();
 
-	void Set4Or3Splits(bool is4);
-	bool Get4Or3Splits();
+	void set4Or3Splits(bool is4);
+	bool get4Or3Splits();
 
-	void SetIDArr(ID id, int split, ID idarr);
-	long GetCountIDArrs();
-	ID GetIDArr(ID id, int split);
+	void setIDArr(ID id, int iSplit, ID idArr);
+	long getCountIDArrs();
+	ID getIDArr(ID id, int iSplit);
 
-	IFrustum* Frustums[5];
-	//long IDArr[5];
+	IFrustum *m_aFrustums[5];
 
-	int IsUpdate[5];
-	float2 NearFar[5];
-	IDirect3DTexture9*	DepthMaps[5];
+	int m_aIsUpdate[5];
+	float2 m_aNearFar[5];
+	IDirect3DTexture9 *m_aDepthMaps[5];
 
 protected:
 
 	Array<ID*> IDArr;
 	float3 Position;
 
-	void Flickering(float4x4 *matLVP,float size_x,float size_y);
+	void flickering(float4x4 *matLVP,float size_x,float size_y);
 
 	float BlurPixel;
 	
@@ -85,7 +84,7 @@ protected:
 	IDirect3DSurface9* OldColorSurface;
 };
 
-////////////////////////
+//##########################################################################
 
 class ShadowMapTech
 {
@@ -93,48 +92,47 @@ public:
 	ShadowMapTech();
 	~ShadowMapTech();
 
-	void OnLostDevice();
-	void OnResetDevice();
+	void onLostDevice();
+	void onResetDevice();
 
 	SX_ALIGNED_OP_MEM
 
-	void Init();
+	void init();
 
-	void SetBias(float bias);
-	float GetBias();
+	void setBias(float bias);
+	float getBias();
 
-	void SetBlurPixel(float blur_pixel);
-	float GetBlurPixel();
+	void setBlurPixel(float blur_pixel);
+	float getBlurPixel();
 
-	void Begin();
-	void End();
+	void begin();
+	void end();
 
-	void GenShadow2(IDirect3DTexture9* shadowmap);
+	void genShadow(IDirect3DTexture9* shadowmap);
 
-	void SetPosition(const float3* pos);
-	void GetPosition(float3* pos);
+	void setPosition(const float3* pos);
+	void getPosition(float3* pos);
 
-	void SetDirection(const float3* dir);
-	void GetDirection(float3* dir);
+	void setDirection(const float3* dir);
+	void getDirection(float3* dir);
 
-	void SetAngleNearFar(const float3* anf);
-	void GetAngleNearFar(float3* anf);
+	void setAngleNearFar(const float3* anf);
+	void getAngleNearFar(float3* anf);
 
-	void SetFar(float sfar);
-	float GetFar();
+	void setFar(float sfar);
+	float getFar();
 
-	void SetNear(float snear);
-	float GetNear();
+	void setNear(float snear);
+	float getNear();
 
-	void SetAngle(float sangle);
-	float GetAngle();
+	void setAngle(float sangle);
+	float getAngle();
 
-	void SetIDArr(long id, long idarr);
-	long GetCountIDArrs();
-	long GetIDArr(long id);
+	void setIDArr(long id, long idarr);
+	long getCountIDArrs();
+	long getIDArr(long id);
 
 	IFrustum* Frustum;
-	//long IDArr;
 
 	float4x4 View;
 	float4x4 Proj;
@@ -160,6 +158,7 @@ private:
 	IDirect3DSurface9*  OldColorSurface;
 };
 
+//##########################################################################
 
 class ShadowMapCubeTech
 {
@@ -167,47 +166,46 @@ public:
 	ShadowMapCubeTech();
 	~ShadowMapCubeTech();
 
-	void OnLostDevice();
-	void OnResetDevice();
+	void onLostDevice();
+	void onResetDevice();
 
 	SX_ALIGNED_OP_MEM
 
-	void SetEnableCubeEdge(int edge,bool enable);
-	bool GetEnableCubeEdge(int edge);
+	void setEnableCubeEdge(int edge,bool enable);
+	bool getEnableCubeEdge(int edge);
 
-	void SetBias(float bias);
-	float GetBias();
+	void setBias(float bias);
+	float getBias();
 
-	void SetBlurPixel(float blur_pixel);
-	bool GetBlurPixel();
+	void setBlurPixel(float blur_pixel);
+	bool getBlurPixel();
 
-	void Init();
+	void init();
 
-	void SetPosition(float3* pos);
-	void GetPosition(float3* pos);
+	void setPosition(float3* pos);
+	void getPosition(float3* pos);
 
-	void SetNearFar(float2* nf);
-	void GetNearFar(float2* nf);
+	void setNearFar(float2* nf);
+	void getNearFar(float2* nf);
 
-	void SetNear(float val);
-	float GetNear();
+	void setNear(float val);
+	float getNear();
 
-	void SetFar(float val);
-	float GetFar();
+	void setFar(float val);
+	float getFar();
 	
-	void Begin();
-	void Pre(int cube);
-	void Post(int cube);
-	void End();
+	void begin();
+	void pre(int cube);
+	void post(int cube);
+	void end();
 
-	void GenShadow2(IDirect3DTexture9* shadowmap);
+	void genShadow(IDirect3DTexture9* shadowmap);
 
-	void SetIDArr(long id, int split, long idarr);
-	long GetCountIDArrs();
-	long GetIDArr(long id, int split);
+	void setIDArr(long id, int split, long idarr);
+	long getCountIDArrs();
+	long getIDArr(long id, int split);
 
-	IFrustum* Frustums[6];
-	//long IDArr[6];
+	IFrustum *m_aFrustums[6];
 
 private:
 
@@ -229,7 +227,7 @@ private:
 	IDirect3DSurface9*  OldColorSurface;
 
 	float3 Position;
-	float2 NearFar;
+	float2 m_vNearFar;
 };
 
 #endif
\ No newline at end of file
diff --git "a/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp" "b/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp"
new file mode 100644
index 000000000..e632478d2
--- /dev/null
+++ "b/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.cpp"	
@@ -0,0 +1,1170 @@
+
+/***********************************************************
+Copyright � Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
+See the license in LICENSE
+***********************************************************/
+
+#define SXMATERIAL_LIGTH_VERSION 1
+
+#include "sxmtllight.h"
+#include "ml_data.h"
+
+#include "light.h"
+#include "material.h"
+
+#if !defined(DEF_STD_REPORT)
+#define DEF_STD_REPORT
+report_func g_fnReportf = DefReport;
+#endif
+
+CLights* ArrLights = 0;
+CMaterials* ArrMaterials = 0;
+
+#define ML_PRECOND(retval) if(!ArrLights){LibReport(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;}
+
+//##########################################################################
+
+SX_LIB_API long SML_0GetVersion()
+{
+	return SXMATERIAL_LIGTH_VERSION;
+}
+
+SX_LIB_API void SML_Dbg_Set(report_func rf)
+{
+	g_fnReportf = rf;
+}
+
+SX_LIB_API void SML_0Create(const char *szName, bool isUnic)
+{
+	if (szName && strlen(szName) > 1)
+	{
+		if (isUnic)
+		{
+			HANDLE hMutex = CreateMutex(NULL, FALSE, szName);
+			if (GetLastError() == ERROR_ALREADY_EXISTS)
+			{
+				CloseHandle(hMutex);
+				LibReport(REPORT_MSG_LEVEL_ERROR, "%s - none unic name", GEN_MSG_LOCATION);
+			}
+			else
+			{
+				MLSet::MLInit();
+				MLSet::ReCalcSize();
+				ArrLights = new CLights();
+				ArrMaterials = new CMaterials();
+			}
+		}
+		else
+		{
+			MLSet::MLInit();
+			MLSet::ReCalcSize();
+			ArrLights = new CLights();
+			ArrMaterials = new CMaterials();
+		}
+	}
+	else
+		LibReport(REPORT_MSG_LEVEL_ERROR, "%s - not init argument [name]", GEN_MSG_LOCATION);
+}
+
+SX_LIB_API void SML_AKill()
+{
+	mem_delete(ArrLights)
+	mem_delete(ArrMaterials);
+}
+
+SX_LIB_API void SML_OnLostDevice()
+{
+	ML_PRECOND(_VOID);
+	ArrLights->onLostDevice();
+	ArrMaterials->onLostDevice();
+}
+
+SX_LIB_API void SML_OnResetDevice()
+{
+	ML_PRECOND(_VOID);
+
+	MLSet::ReCalcSize();
+	ArrLights->onResetDevice();
+	ArrMaterials->onResetDevice();
+
+	MLSet::IDsRenderTargets::HowAdaptedLum = 0;
+}
+
+SX_LIB_API void SML_Update(DWORD timeDelta)
+{
+	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(*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);
+}
+
+SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef)
+{
+	ML_PRECOND(_VOID);
+
+	MLSet::CoefSizeDepthMapForLocal = fCoef;
+	MLSet::ReCalcSize();
+	SML_OnLostDevice();
+	SML_OnResetDevice();
+}
+
+SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef)
+{
+	ML_PRECOND(_VOID);
+
+	MLSet::CoefSizeDepthMapForGlobal = fCoef;
+	MLSet::ReCalcSize();
+	SML_OnLostDevice();
+	SML_OnResetDevice();
+	
+}
+
+SX_LIB_API float SML_LigthsGettLCoefSizeDepth()
+{
+	ML_PRECOND(-1);
+
+	return MLSet::CoefSizeDepthMapForLocal;
+}
+
+SX_LIB_API float SML_LigthsGettGCoefSizeDepth()
+{
+	ML_PRECOND(-1);
+	return MLSet::CoefSizeDepthMapForGlobal;
+}
+
+//#############################################################################
+
+SX_LIB_API void SML_LigthsClear()
+{
+	ML_PRECOND(_VOID);
+
+	ArrLights->clear();
+}
+
+SX_LIB_API void SML_LigthsClearIDArr()
+{
+	ML_PRECOND(_VOID);
+
+	ArrLights->clearIDArr();
+}
+
+SX_LIB_API int SML_LigthsGetCount()
+{
+	ML_PRECOND(-1);
+
+	return ArrLights->getCountLights();
+}
+
+SX_LIB_API bool SML_LigthsGetExists(ID id)
+{
+	ML_PRECOND(false);
+
+	return ArrLights->getExists(id);
+}
+
+
+SX_LIB_API ID SML_LigthsCreatePoint(const float3 *pCenter, float fDist, const float3 *pColor, bool isGlobal, bool isShadowed/*, const char* bound_volume*/)
+{
+	ML_PRECOND(-1);
+	return ArrLights->createPoint(-1, pCenter, fDist, pColor, isGlobal, isShadowed/*, 0*/);
+}
+
+SX_LIB_API ID SML_LigthsCreateDirection(const float3 *pPos, float fDist, const float3 *pColor, const SMQuaternion *qOrient, float fTopRadius, float fAngle, bool isShadow/*, const char* bound_volume*/)
+{
+	ML_PRECOND(-1);
+	return ArrLights->createDirection(-1, pPos, fDist, pColor, qOrient, fTopRadius, fAngle, isShadow/*, 0*/);
+}
+
+SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->render(id, timeDelta);
+}
+
+SX_LIB_API ID SML_LigthsGetGlobal()
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightGlobal();
+}
+
+SX_LIB_API bool SML_LigthsGetCastGlobalShadow()
+{
+	ML_PRECOND(false);
+	return ArrLights->getCastGlobalShadow();
+}
+
+SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed)
+{
+	ML_PRECOND(_VOID);
+	return ArrLights->setCastGlobalShadow(isShadowed);
+}
+
+SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->getLightColor(id, pColor);
+}
+
+SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightColor(id, pColor);
+}
+
+SX_LIB_API void SML_LigthsGetPos(ID id, float3 *pPos, bool isGreal)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->getLightPos(id, pPos, isGreal);
+}
+
+SX_LIB_API float SML_LigthsGetPower(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightPower(id);
+}
+
+SX_LIB_API float SML_LigthsGetDist(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightDist(id);
+}
+
+SX_LIB_API void SML_LigthsSetPos(ID id, const float3 *pPos, bool isGreal)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightPos(id, pPos, isGreal);
+}
+
+SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->getLightOrient(id, pQ);
+}
+
+SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightOrient(id, pQ);
+}
+
+SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id)
+{
+	ML_PRECOND(LTYPE_LIGHT_NONE);
+	return ArrLights->getLightType(id);
+}
+
+SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum)
+{
+	ML_PRECOND(-1);
+	return ArrLights->comVisibleForFrustum(id, pFrustum);
+}
+
+SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id)
+{
+	ML_PRECOND(false);
+	return ArrLights->getVisibleForFrustum(id);
+}
+
+SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pPos)
+{
+	ML_PRECOND(-1);
+	return ArrLights->comDistFor(id, pPos);
+}
+
+SX_LIB_API float SML_LigthsGetDistFor(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getDistFor(id);
+}
+
+SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pPos)
+{
+	ML_PRECOND(_VOID);
+	return ArrLights->comVisibleFrustumDistFor(pFrustum, pPos);
+}
+
+SX_LIB_API bool SML_LigthsGetEnable(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightEnable(id);
+}
+
+SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable)
+{
+	ML_PRECOND(_VOID);
+	return ArrLights->setLightEnable(id, isEnable);
+}
+
+SX_LIB_API bool SML_LigthsGetShadowed(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightShadowed(id);
+}
+
+SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id)
+{
+	ML_PRECOND(0);
+	return ArrLights->get4Or3Splits(id);
+}
+
+SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3)
+{
+	ML_PRECOND(_VOID);
+
+	ArrLights->set4Or3Splits(id, is4or3);
+}
+
+SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow()
+{
+	ML_PRECOND(0);
+	return ArrLights->getShadow2();
+}
+
+SX_LIB_API void SML_LigthsShadowNull()
+{
+	ML_PRECOND(_VOID);
+	return ArrLights->shadowNull();
+}
+
+SX_LIB_API void SML_LigthsShadowRenderBegin(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->shadowRenderBegin(id);
+}
+
+SX_LIB_API void SML_LigthsShadowRenderEnd(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->shadowRenderEnd(id);
+}
+
+SX_LIB_API void SML_LigthsShadowRenderPre(ID id, int iCube)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->shadowRenderPre(id, iCube);
+}
+
+SX_LIB_API void SML_LigthsShadowRenderPost(ID id, int iCube)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->shadowRenderPost(id, iCube);
+}
+
+SX_LIB_API IFrustum* SML_LigthsGetFrustum(ID id, int iHow)
+{
+	ML_PRECOND(0);
+	return ArrLights->getLightFrustum(id, iHow);
+}
+
+SX_LIB_API void SML_LigthsUpdateGFrustums(ID id, int iSplit, const float3 *pPos, const float3 *pDir)
+{
+	ML_PRECOND(_VOID);
+	return ArrLights->updateLightGFrustums(id, iSplit, pPos, pDir);
+}
+
+SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int iTypeMaterial, const float4x4 *pWorld)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->initShaderOfTypeMaterial(id, iTypeMaterial, pWorld);
+}
+
+SX_LIB_API void SML_LigthsShadowGen(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->shadowGen2(id);
+}
+
+SX_LIB_API void SML_LigthsShadowSoft(bool isRandom, float fSize, bool isFirst)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->shadowSoft(isRandom, fSize, isFirst);
+}
+
+
+
+SX_LIB_API ID SML_LigthsCreateCopy(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->createCopy(id);
+}
+
+SX_LIB_API void SML_LigthsDeleteLight(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->deleteLight(id);
+}
+
+SX_LIB_API char* SML_LigthsGetName(ID id)
+{
+	ML_PRECOND(0);
+	return ArrLights->getLightName(id);
+}
+
+SX_LIB_API void SML_LigthsSetName(ID id, const char *szName)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightName(id, szName);
+}
+
+
+SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightAngle(id, fAngle, true);
+}
+
+SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightTopRadius(id, fTopRadius);
+}
+
+SX_LIB_API void SML_LigthsSetDist(ID id, float fRadiusHeight, bool isCreate)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightDist(id, fRadiusHeight, isCreate);
+}
+
+
+SX_LIB_API float SML_LigthsGetShadowBias(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getShadowBias(id);
+}
+
+SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias)
+{
+	ML_PRECOND(_VOID);
+	return ArrLights->setShadowBias(id, fBias);
+}
+
+SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setShadowBlurPixel(id, fBlurPixel);
+}
+
+SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getShadowBlurPixel(id);
+}
+SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setShadowLocalNear(id, fNear);
+}
+
+SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getShadowLocalNear(id);
+}
+
+SX_LIB_API void SML_LigthsSetShadowLocalFar(ID id, float fFar)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setShadowLocalFar(id, fFar);
+}
+
+SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getShadowLocalFar(id);
+}
+
+SX_LIB_API void SML_LigthsSetCubeEdgeEnable(ID id, int iEdge, bool isEnable)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightCubeEdgeEnable(id, iEdge, isEnable);
+}
+
+SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(ID id, int iEdge)
+{
+	ML_PRECOND(false);
+	return ArrLights->getLightCubeEdgeEnable(id, iEdge);
+}
+
+
+SX_LIB_API float SML_LigthsGetAngle(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightAngle(id);
+}
+
+SX_LIB_API float SML_LigthsGetTopRadius(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightTopRadius(id);
+}
+
+SX_LIB_API ID SML_LigthsGetIDArr(ID id, ID idOwner, int iHow)
+{
+	ML_PRECOND(-1);
+	return ArrLights->getLightIDArr(id, idOwner, iHow);
+}
+
+SX_LIB_API void SML_LigthsSetIDArr(ID id, ID idOwner, int iHow, ID idArr)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightIDArr(id, idOwner, iHow, idArr);
+}
+
+SX_LIB_API void SML_LigthsSetTypeShadowed(ID id, LTYPE_SHADOW type)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->setLightTypeShadowed(id, type);
+}
+
+SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id)
+{
+	ML_PRECOND(LTYPE_SHADOW_NONE);
+	return ArrLights->getLightTypeShadowed(id);
+}
+
+SX_LIB_API bool SML_LigthsCountUpdateUpdate(ID id, const float3 *pViewPos, int iHow)
+{
+	ML_PRECOND(false);
+	return ArrLights->lightCountUpdateUpdate(id, pViewPos, iHow);
+}
+
+SX_LIB_API bool SML_LigthsCountUpdateAllowed(ID id, int iHow)
+{
+	ML_PRECOND(false);
+	return ArrLights->lightCountUpdateAllowed(id, iHow);
+}
+
+SX_LIB_API void SML_LigthsCountUpdateNull(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->lightCountUpdateNull(id);
+}
+
+SX_LIB_API void SML_LigthsToneMappingCom(DWORD timeDelta, float fAdapted)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->toneMappingCom(timeDelta, fAdapted);
+}
+
+SX_LIB_API int SML_LigthsDelGetCount()
+{
+	ML_PRECOND(-1);
+	return ArrLights->delGetCount();
+}
+
+SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID idKey)
+{
+	ML_PRECOND(LTYPE_LIGHT_NONE);
+	return ArrLights->delGetType(idKey);
+}
+
+SX_LIB_API void SML_LigthsDelDel(ID idKey)
+{
+	ML_PRECOND(_VOID);
+	ArrLights->delDel(idKey);
+}
+
+SX_LIB_API ID SML_LigthsDelGetIDArr(ID idKey, ID idOwner, int iHow)
+{
+	ML_PRECOND(-1);
+	return ArrLights->delGetIDArr(idKey, idOwner, iHow);
+}
+
+//#############################################################################
+
+SX_LIB_API ID SML_DSGetRT_ID(DS_RT type)
+{
+	ML_PRECOND(-1);
+	if (type == DS_RT_COLOR)
+		return MLSet::IDsRenderTargets::ColorScene;
+	else if (type == DS_RT_NORMAL)
+		return MLSet::IDsRenderTargets::NormalScene;
+	else if (type == DS_RT_PARAM)
+		return MLSet::IDsRenderTargets::ParamsScene;
+	else if (type == DS_RT_DEPTH)
+		return MLSet::IDsRenderTargets::DepthScene;
+	else if (type == DS_RT_DEPTH0)
+		return MLSet::IDsRenderTargets::DepthScene0;
+	else if (type == DS_RT_DEPTH1)
+		return MLSet::IDsRenderTargets::DepthScene1;
+
+	else if (type == DS_RT_AMBIENTDIFF)
+		return MLSet::IDsRenderTargets::LightAmbientDiff;
+	else if (type == DS_RT_SPECULAR)
+		return MLSet::IDsRenderTargets::LightSpecular;
+
+	else if (type == DS_RT_SCENELIGHT)
+		return MLSet::IDsRenderTargets::LigthCom;
+	else if (type == DS_RT_SCENELIGHT2)
+		return MLSet::IDsRenderTargets::LigthCom2;
+
+	else if (type == DS_RT_ADAPTEDLUM)
+		return MLSet::IDsRenderTargets::GetCurrAdaptedLum();
+
+	return -1;
+}
+
+SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type)
+{
+	ML_PRECOND(0);
+
+	ID tmpid = SML_DSGetRT_ID(type);
+	if (tmpid >= 0)
+		return SGCore_RTGetTexture(tmpid);
+	else
+		return 0;
+}
+
+//#############################################################################
+
+SX_LIB_API ID SML_MtlLoad(const char *szName, MTLTYPE_MODEL mtl_type)
+{
+	ML_PRECOND(-1);
+
+	return ArrMaterials->mtlLoad(szName, mtl_type);
+}
+
+SX_LIB_API void SML_MtlSave(ID id)
+{
+	ML_PRECOND(_VOID);
+
+	ArrMaterials->mtlSave(id);
+}
+
+SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id)
+{
+	ML_PRECOND(MTLTYPE_MODEL_STATIC);
+
+	return ArrMaterials->getTypeModel(id);
+}
+
+SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model)
+{
+	ML_PRECOND(_VOID);
+
+	ArrMaterials->setTypeModel(id, type_model);
+}
+
+SX_LIB_API long SML_MtlGetCount()
+{
+	ML_PRECOND(-1);
+
+	return ArrMaterials->getCount();
+}
+
+SX_LIB_API void SML_MtlRender(ID id, const float4x4 *pWorld)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->render(id, pWorld);
+}
+
+SX_LIB_API void SML_MtlRenderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->renderStd(type, pWorld, idSlot, idMtl);
+}
+
+SX_LIB_API void SML_MtlRenderLight(const float4_t *pColor, const float4x4 *pWorld)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->renderLight(pColor, pWorld);
+}
+
+SX_LIB_API void SML_MtlSetMainTexture(ID slot, ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->setMainTexture(slot, id);
+}
+
+SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->setIsIncrCountSurf(bf);
+}
+
+SX_LIB_API bool SML_MtlGetIsIncrCountSurf()
+{
+	ML_PRECOND(false);
+	return ArrMaterials->getIsIncrCountSurf();
+}
+
+SX_LIB_API void SML_MtlNullingCurrCountSurf()
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->nullingCurrCountSurf();
+}
+
+SX_LIB_API int SML_MtlGetCurrCountSurf()
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->getCurrCountSurf();
+}
+
+SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->setCurrCountSurf(iCount);
+}
+
+SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isAlphaTest)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->setForceblyAlphaTest(isAlphaTest);
+}
+
+SX_LIB_API bool SML_MtlGetForceblyAlphaTest()
+{
+	ML_PRECOND(false);
+	return ArrMaterials->getForceblyAlphaTest();
+}
+
+
+SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->getStdMtl(type_model);
+}
+
+
+SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetPhysicMaterial(id, type);
+}
+
+SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id)
+{
+	ML_PRECOND(MTLTYPE_PHYSIC_DEFAULT);
+	return ArrMaterials->mtlGetPhysicMaterial(id);
+}
+
+SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetUsingAlphaTest(id);
+}
+
+SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetUsingAlphaTest(id, isUsing);
+}
+
+
+
+SX_LIB_API void SML_MtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefSetIDArr(id, idOwner, iCube, idArr);
+}
+
+SX_LIB_API ID SML_MtlRefGetIDArr(ID id, ID idOwner, int iCube)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlRefGetIDArr(id, idOwner, iCube);
+}
+
+SX_LIB_API int SML_MtlDelRefGetCount()
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->delRefCount();
+}
+
+SX_LIB_API ID SML_MtlDelRefGetIDArr(ID idKey, ID idOwner, int iCube)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->delRefGetIDArr(idKey, idOwner, iCube);
+}
+
+SX_LIB_API void SML_MtlDelRefClear()
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->delRefAllDel();
+}
+
+SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefSetMinMax(id, pMin, pMax);
+}
+
+SX_LIB_API void SML_MtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefPreRenderPlane(id, pPlane);
+}
+
+SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(ID id, int iCube)
+{
+	ML_PRECOND(0);
+	return ArrMaterials->mtlRefGetfrustum(id, iCube);
+}
+
+SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlRefIsAllowedRender(id);
+}
+
+SX_LIB_API void SML_MtlRefPostRenderPlane(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefPostRenderPlane(id);
+}
+
+SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id)
+{
+	ML_PRECOND(0);
+	return ArrMaterials->mtlRefPlaneGetTex(id);
+}
+
+
+
+SX_LIB_API void SML_MtlRefCubeBeginRender(ID id, const float3_t *pCenter)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefCubeBeginRender(id, pCenter);
+}
+
+SX_LIB_API void SML_MtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefCubePreRender(id, iCube, pWorld);
+}
+
+SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefCubePostRender(id, iCube);
+}
+
+SX_LIB_API void SML_MtlRefCubeEndRender(ID id, const float3_t *pViewPos)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefCubeEndRender(id, pViewPos);
+}
+
+SX_LIB_API bool SML_MtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlRefUpdateCountUpdate(id, pViewPos);
+}
+
+SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlRefNullingCountUpdate(id);
+}
+
+SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id)
+{
+	ML_PRECOND(0);
+	return ArrMaterials->refCubeGetTex(id);
+}
+
+//##########################################################################
+
+SX_LIB_API void SML_MtlReloadMaterial(ID id, const char *szName)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlReLoad(id, szName);
+}
+
+SX_LIB_API void SML_MtlClear(bool isClearRefDel)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->clear(isClearRefDel);
+}
+
+SX_LIB_API void SML_MtlSetTexture(ID id, const char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetTexture(id, szTexture);
+}
+
+SX_LIB_API void SML_MtlGetTexture(ID id, char *szName)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetTexture(id, szName);
+}
+
+SX_LIB_API ID SML_MtlGetTextureID(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetTextureID(id);
+}
+
+SX_LIB_API void SML_MtlSetVS(ID id, const char *szPath)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetVS(id, szPath);
+}
+
+SX_LIB_API void SML_MtlGetVS(ID id, char *szName)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetVS(id, szName);
+}
+
+SX_LIB_API void SML_MtlSetPS(ID id, const char *szPath)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetPS(id, szPath);
+}
+
+SX_LIB_API void SML_MtlGetPS(ID id, char *szName)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetPS(id, szName);
+}
+
+SX_LIB_API float SML_MtlGetDurability(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetDurability(id);
+}
+
+SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetDurability(id, fDurability);
+}
+
+SX_LIB_API float SML_MtlGetHitChance(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetHitChance(id);
+}
+
+SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetHitChance(id, fHitChance);
+}
+
+SX_LIB_API float SML_MtlGetDensity(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetDensity(id);
+}
+
+SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetDensity(id, fDensity);
+}
+
+//##########################################################################
+
+SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetLighting(id, isLighting);
+}
+
+SX_LIB_API bool SML_MtlGetLighting(ID id)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetLighting(id);
+}
+
+SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetIsTextureLighting(id, isTexLighting);
+}
+
+SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetIsTextureLighting(id);
+}
+
+SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetTextureLighting(id, szTexture);
+}
+
+SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetTextureLighting(id, szTexture);
+}
+
+SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetRoughness(id, fRoughness);
+}
+
+SX_LIB_API float SML_MtlGetRoughness(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetRoughness(id);
+}
+
+SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetThickness(id, fThickness);
+}
+
+SX_LIB_API float SML_MtlGetThickness(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetThickness(id);
+}
+
+SX_LIB_API void SML_MtlSetF0(ID id, float fF0)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetF0(id, fF0);
+}
+
+SX_LIB_API float SML_MtlGetF0(ID id)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetF0(id);
+}
+
+SX_LIB_API void SML_MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetTypeTransparency(id, type);
+}
+
+SX_LIB_API MTLTYPE_TRANSPARENCY SML_MtlGetTypeTransparency(ID id)
+{
+	ML_PRECOND(MTLTYPE_TRANSPARENCY_NONE);
+	return ArrMaterials->mtlGetTypeTransparency(id);
+}
+
+SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetTypeReflection(id, type);
+}
+
+SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id)
+{
+	ML_PRECOND(MTLTYPE_REFLECT_NONE);
+	return ArrMaterials->mtlGetTypeReflection(id);
+}
+
+//**************************************************************************
+
+SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetMaskTex(id, szTexture);
+}
+
+SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetMaskTex(id, szTexture);
+}
+
+SX_LIB_API void SML_MtlSetMRTex(ID id, int iChannel, const char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetMRTex(id, iChannel, szTexture);
+}
+
+SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetMRTex(id, iChannel, szTexture);
+}
+
+SX_LIB_API void SML_MtlSetDTex(ID id, int iChannel, const char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetDTex(id, iChannel, szTexture);
+}
+
+SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szTexture)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlGetDTex(id, iChannel, szTexture);
+}
+
+SX_LIB_API void SML_MtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetStdVS(id, type, isSend);
+}
+
+SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetStdVS(id, type);
+}
+
+SX_LIB_API void SML_MtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetStdPS(id, type, isSend);
+}
+
+SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetStdPS(id, type);
+}
+
+
+SX_LIB_API void SML_MtlSetUserDataVS(ID id, int iComponent, float fValue)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetUserDataVS(id, iComponent, fValue);
+}
+
+SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetUserDataVS(id, iComponent);
+}
+
+SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPS)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetUserDataVS_InPS(id, isSendPS);
+}
+
+SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetUserDataVS_InPS(id);
+}
+
+SX_LIB_API void SML_MtlSetUserDataPS(ID id, int iComponent, float fValue)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetUserDataPS(id, iComponent, fValue);
+}
+
+SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent)
+{
+	ML_PRECOND(-1);
+	return ArrMaterials->mtlGetUserDataPS(id, iComponent);
+}
+
+SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVS)
+{
+	ML_PRECOND(_VOID);
+	ArrMaterials->mtlSetUserDataPS_InPS(id, isSendVS);
+}
+
+SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id)
+{
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetUserDataPS_InPS(id);
+}
diff --git "a/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h" "b/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h"
new file mode 100644
index 000000000..6092009aa
--- /dev/null
+++ "b/source/mtllight/sxmtllight - \320\272\320\276\320\277\320\270\321\217.h"	
@@ -0,0 +1,1362 @@
+
+/***********************************************************
+Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
+See the license in LICENSE
+***********************************************************/
+
+/*!
+\file
+Заголовочный файл sxmtllight - библиотеки освещения и материалов
+*/
+
+/*! \defgroup sxmtllight sxmtllight - библиотека освещения и материалов
+@{
+*/
+
+#ifndef __SXMTLLIGHT_H
+#define __SXMTLLIGHT_H
+
+#if defined(_DEBUG)
+#pragma comment(lib, "sxgcore_d.lib")
+#else
+#pragma comment(lib, "sxgcore.lib")
+#endif
+
+#undef SX_LIB_API
+#define SX_LIB_API extern "C" __declspec (dllimport)
+#include <gcore/sxgcore.h>
+
+#ifdef SX_DLL
+#undef SX_LIB_API
+#define SX_LIB_API extern "C" __declspec (dllexport)
+#endif
+
+#include <gdefines.h>
+
+/*! \name Базовые функции библиотеки
+@{*/
+
+//! версия подсистемы
+SX_LIB_API long SML_0GetVersion();			
+
+//! установить функцию обработки сообщений
+SX_LIB_API void SML_Dbg_Set(report_func rf);
+
+//! инициализция подсистемы
+SX_LIB_API void SML_0Create(
+	const char *szName,				//!< присваиваемое имя
+	bool isUnic = true				//!< должна ли подсистема быть уникальной по имени
+	);
+
+//! уничтожить подсистему
+SX_LIB_API void SML_AKill();	
+
+//!@}
+
+/*! \name Обработка потери/восстановления устройства
+@{*/
+
+//! вызывать при потрете устройства
+SX_LIB_API void SML_OnLostDevice();	
+
+//! вызывать при восстановлении устройства
+SX_LIB_API void SML_OnResetDevice();
+
+//!@}
+
+//! обновление данных всей библиотеки
+SX_LIB_API void SML_Update(
+	DWORD timeDelta	//!< время рендера кадра в млсек
+	);
+
+//#############################################################################
+
+/*! \defgroup sxmtllight_light Освещение
+ \ingroup sxmtllight
+ \warning Обращение (идентификация) конкретного света осуществляется посредством идентификатора который выдают создающие функции:
+  - #SML_LigthsCreatePoint
+  - #SML_LigthsCreateDirection
+ Получить идентификатор уже созданного света можно, посредством ключа (key) который лежит в пределах [0, #SML_LigthsGetCount),
+передав этот ключ #SML_LigthsGetIDOfKey, которая в случае успеха вернет идентификатор света.
+@{*/
+
+/*! максимальное количество обновлений статических источников света, в первый момент рендера */
+#define LIGHTS_UPDATE_MAX_COUNT_FOR_STATIC 3	
+
+/*! \name Дистанции (метрах) при которых будет сниженно или повышено количество отрисовок для локальных источников света
+меньше #LIGHTS_UPDATE_L0_DIST - обновление будет каждый кадр\n
+больше #LIGHTS_UPDATE_L2_DIST - обновления не будет
+@{*/
+
+#define LIGHTS_UPDATE_L0_DIST 10	
+#define LIGHTS_UPDATE_L1_DIST 30	
+#define LIGHTS_UPDATE_L2_DIST 70	
+
+//!@}
+
+/*! Коэфициент обновления сплитов глобального света.
+Cчитается: LIGHTS_UPDATE_PSSM_SPLIT*number_split
+ \note Первый сплит обновляется каждый кадр, второй через кадр
+*/
+#define LIGHTS_UPDATE_PSSM_SPLIT 1		
+
+/*! аналогичнен #LIGHTS_UPDATE_PSSM_SPLIT только для 5 сплита (для теней от облаков) */
+#define LIGHTS_UPDATE_PSSM_SPLIT_5 2	
+
+
+/*! стандартное значение верхнего/начального радиуса для направленного света  */
+#define LIGHTS_LOCAL_STD_TOP_RADIUS 0.1	
+
+/*! стандартное значение ближней плоскости отсечения для теней локального света  */
+#define LIGHTS_LOCAL_STD_NEAR 0.1		
+
+/*! максимальная дистанция локального света */
+#define LIGHTS_LOCAL_MAX_DIST 200.f		
+
+
+/*! радиус глобального источника */
+#define LIGHTS_GLOBAL_STD_RADIUS 999999	
+
+/*! отдаленность глобального света (нужно для корректности теней), если не знаете, не трогайте */
+#define LIGHTS_POS_G_MAX 1000	
+
+
+/*! базовое направление направленноого источника света */
+#define LIGHTS_DIR_BASE float3(0, -1, 0)
+
+
+//! типы источников света
+enum LTYPE_LIGHT
+{
+	//! не установленный
+	LTYPE_LIGHT_NONE = -1,	
+
+	//! глобальный
+	LTYPE_LIGHT_GLOBAL,		
+
+	//! точечный
+	LTYPE_LIGHT_POINT,		
+
+	//! направленный
+	LTYPE_LIGHT_DIR			
+};
+
+//! типы теней источников света
+enum LTYPE_SHADOW
+{
+	//! без теней
+	LTYPE_SHADOW_NONE = -1,	
+
+	//! статичные тени, тень обновляется первые несколько кадров (для корректности), далее не обновляется
+	LTYPE_SHADOW_STATIC,	
+
+	//! полностью динамические тени
+	LTYPE_SHADOW_DYNAMIC,	
+};
+
+/*! \name Настройки размеров для теней
+ \note Коэфициента относительно размеров окна рендера, если 1.f то размеры экрана, если 0.5f то размеры экрана * 0.5f
+@{*/
+
+//! установка коэфициента для локального света
+SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef);	
+
+//! установка коэфициента для глобального света
+SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef);	
+
+
+//! возвращение коэфициента для локальный свет
+SX_LIB_API float SML_LigthsGettLCoefSizeDepth();	
+
+//! возвращение коэфициента для глобальный свет
+SX_LIB_API float SML_LigthsGettGCoefSizeDepth();	
+
+//!@}
+
+//! очистить список света
+SX_LIB_API void SML_LigthsClear();		
+
+//! очистка всех идентификаторов просчетов во всех источниках света
+SX_LIB_API void SML_LigthsClearIDArr();	
+
+//! общее количество света
+SX_LIB_API int SML_LigthsGetCount();	
+
+//! возвращает true если свет с id существует
+SX_LIB_API bool SML_LigthsGetExists(ID id);
+
+//! создать точечный свет (светит во все стороны)
+SX_LIB_API ID SML_LigthsCreatePoint(
+	const float3 *pCenter,	//!< центр света (мировая позиция)
+	float fDist,			//!< дистанция, на которую распространяется свет
+	const float3 *pColor,	//!< цвет в пределах 0-1
+	bool isGlobal,			//!< глобальный ли свет (типа солнца)
+	bool isShadowed			//!< отбрасвыает ли тени свет
+	);
+
+//! создать направленный свет
+SX_LIB_API ID SML_LigthsCreateDirection(
+	const float3 *pPos,			//!< позиция света (мировая)
+	float fDist,				//!< дистанция на которую распространяется свет
+	const float3 *pColor,		//!< цвет
+	const SMQuaternion *qOrient,//!< ориентация
+	float fTopRadius,			//!< верхний (начальный) радиус
+	float fAngle,				//!< угол (в радианах)
+	bool isShadow				//!< отбрасвыает ли тени свет
+	);
+
+//! возвращает тип света
+SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id);	
+
+//! создать копию объекта и вернуть на нее id
+SX_LIB_API ID SML_LigthsCreateCopy(ID id);		
+
+//! удаление света
+SX_LIB_API void SML_LigthsDeleteLight(ID id);	
+
+//! возвращает имя света
+SX_LIB_API char* SML_LigthsGetName(ID id);					
+
+//! устанавливает имя света
+SX_LIB_API void SML_LigthsSetName(ID id, const char *szName);	
+
+//! отрисовка ограничивающего объема 
+SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta);
+
+//! в color записывает цвет света
+SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor);		
+
+//! устанавливает цвет света
+SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor);	
+
+//! получить в pos позицию света
+SX_LIB_API void SML_LigthsGetPos(
+	ID id,				//!< идентификатор света
+	float3 *pPos,		//!< инициализированный вектор в который будет записана позиция
+	bool isReal = false	//!< true - нужны реальные координаты, false - нужны углы, только для глобального света, во всех остальных случаях не имеет смысла
+	);
+
+//! установить позицию свету
+SX_LIB_API void SML_LigthsSetPos(
+	ID id,				//!< идентификатор света
+	const float3 *pPos,	//!< позиция в которую будет перемещен свет
+	bool isReal = false	//!< true - установка реальных координат, false - установка углов, только для глобального света, во всех остальных случаях не имеет смысла
+	);
+
+//! возвращает "значение силы света" для отправки в шейдер (максимальная компонента цвет * дистанция покрытия/#LIGHTS_LOCAL_MAX_DIST)
+SX_LIB_API float SML_LigthsGetPower(ID id);	
+
+//! возвращает дистанцию, на которую распространяется свет
+SX_LIB_API float SML_LigthsGetDist(ID id);		
+
+//! установка новой дистанции
+SX_LIB_API void SML_LigthsSetDist(
+	ID id,					//!< идентификатор света
+	float fDist,			//!< новая дистанция(радиус для точечного и высота для направленного)
+	bool isCreate = true	//!< нужно ли пересоздание объема? (если новая дистанция больше чем текущий ограничивающий объем то надо, в других случаях по усмотрению)
+	);
+
+//! записывает в q ориентацию света
+SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ);
+
+//! установка ориентации света
+SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ);
+
+
+//! включен ли свет с идентификатором id
+SX_LIB_API bool SML_LigthsGetEnable(ID id);				
+
+//! установить всключен (true) или отключен (false) свет  с идентификатором id
+SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable);	
+
+//! возвращает идентификатор глобального источника света, если он есть, иначе -1
+SX_LIB_API ID SML_LigthsGetGlobal();					
+
+//! возвращает установлена ли общая тень от глобального источника (все ли в тени)
+SX_LIB_API bool SML_LigthsGetCastGlobalShadow();
+
+//! установить общую тень для всего от глобального источника (все в тень)
+SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed);
+
+//-----------------------------------------------------------------------------
+
+/*! \name Управление видимостью
+ \note Отдельный просчет - считает индивидуально для света и тут же возвращает результат просчетов
+ \note Предварительный просчет - просчет для всего света (к примеру в другом потоке)
+@{*/
+
+//! виден ли свет в данном фрустуме (отдельный просчет)
+SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum);	
+
+//! дистанция от viewpos до начала света (отдельный просчет)
+SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pViewPos);				
+
+//! просчет видимости и расстояния от наблюдателя viewpos до начала света, для каждого света (предварительный просчет)
+SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pViewPos);
+
+
+//! виден ли свет в просчитанном фрустуме
+SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id);	
+
+//! просчитанная дистанция от позиции наблюдателя до начала света
+SX_LIB_API float SML_LigthsGetDistFor(ID id);			
+
+//!@}
+
+//-----------------------------------------------------------------------------
+
+/*! \name Настройки для направленного света
+@{*/
+
+//! возвращает угол, актуально только для направленного и света
+SX_LIB_API float SML_LigthsGetAngle(ID id);				
+
+//! установить угол, актуально только для направленного и света
+SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle);	
+
+//! возвращает верхний радиус, актуально только для направленного и света
+SX_LIB_API float SML_LigthsGetTopRadius(ID id);					
+
+//! устанавливает верхний радиус, актуально только для направленного и света
+SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius);
+
+//!@}
+
+//-----------------------------------------------------------------------------
+
+/*! \name Настройки для точечного света
+@{*/
+
+/*! установить "рисовать ли в указанную грань cubemap тени"
+ \warning Актуально только когда свет может отбрасывать тени
+ */
+SX_LIB_API void SML_LigthsSetCubeEdgeEnable(
+	ID id,			//!< идентификатор света
+	int iEdge,		//!< номер стороны/грани cubemap [0,5]
+	bool iEnable	//!< true - рисовать, false - не рисовать
+	);
+
+//! получить текущее значение "рисовать ли в указанную грань cubemap тени"
+SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(
+	ID id,		//!< идентификатор света
+	int iEdge	//!< номер стороны/грани cubemap [0,5]
+	);
+
+//!@}
+
+//-----------------------------------------------------------------------------
+
+/*! \defgroup sxmtllight_light_shadow Управление тенями
+ \ingroup sxmtllight_light
+ \note Для генерации теней используется один render target full screen
+ \note Для сглаживания используется еще один аналогичный render target и первый render target. При сглаживании внутри меняется только счетчик, который меняет их местами
+ \note Так как используется всего один render target для генерации теней то есесно в текущий момент времени можно сгенерировать и сгладить тень только для одного света
+ \note Для теней от глобального света используется техника PSSM (Parallel-Split Shadow Mapping) на 3/4 сплита для объектов уровня (3 или 4 сплита можно настроить #SML_LigthsSet4Or3SplitsG)
+ \note Для теней от локального света используется техника Shadow Mapping в двух вариациях:
+  - для точечного света используется cubemap
+  - для направленного света - обычная техника Shadow Mapping
+@{*/
+
+//! отбрасывает ли свет тени
+SX_LIB_API bool SML_LigthsGetShadowed(ID id);						
+
+//! возвращает true в случае если установлено 4 сплита для PSSM, иначе (установлено 3 сплита) false
+SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id);				
+
+//! установка количества сплитов (false - 3, true - 4) для PSSM
+SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3);	
+
+/*! устанавливает шейдеры и передает им данные на основании типа материала, поддерживаются все типы MTL_TYPE_*/
+SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, const float4x4 *pWorld);
+
+/*! \name Управление обновлениями теней
+ \note Так как основная задумка это real-time рендер то для этого нужны упрощения, одним из таковых является обновление теней от света, которое может происходить не каждый кадр
+@{*/
+
+//! установка динамики обработки теней
+SX_LIB_API void SML_LigthsSetTypeShadowed(
+	ID id,				//!< идентификатор света
+	LTYPE_SHADOW type	//!< значение из перечисления #LTYPE_SHADOW
+	);
+
+//! возвращает тип динамики теней (одно из значений #LTYPE_SHADOW)
+SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id);	
+
+//! производит обработку данных затем возвращает разрешено ли обновлять тени, увеличивает внутрений счетчик, поэтому необходимо вызывать только когда надо
+SX_LIB_API bool SML_LigthsCountUpdateUpdate(
+	ID id,					//!< идентификатор света
+	const float3 *pViewPos,	//!< позиция камеры для которой обновляем, на основании расстояния будет произведен расчет обновления
+	int iHow = -1			//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	);
+
+//! разрешено ли обновлять тени, в отличии от #SML_LigthsUpdateCountUpdate не увеличивает внутренний счетчик
+SX_LIB_API bool SML_LigthsCountUpdateAllowed(
+	ID id,			//!< идентификатор света
+	int iHow = -1	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	);
+
+//! сбросить счетчик обновлений и обновлять до предела тени
+SX_LIB_API void SML_LigthsCountUpdateNull(ID id);	
+
+//!@}
+
+
+/*! \name Управление циклами рендера в карты глубин
+ Для локального направленного света:
+ \code
+ SML_LigthsShadowRenderBegin(id);
+ //рендер того что должно отбросить тени
+ SML_LigthsShadowRenderEnd(id);
+ \endcode
+ Для глобального и точечного:
+ \code
+ SML_LigthsShadowRenderBegin(id);
+ SML_LigthsShadowRenderPre(id, cube);
+ //рендер того что должно отбросить тени
+ SML_LigthsShadowRenderPost(id, cube);
+ SML_LigthsShadowRenderEnd(id);
+ \endcode
+ Где cube для точечного это номер стороны cubemap [0-5] в которую будет осуществлен рендер, а для глобального это номер сплита.
+@{*/
+
+//! подготовительные процедуры
+SX_LIB_API void SML_LigthsShadowRenderBegin(ID id);	
+
+//! завершающие процедуры
+SX_LIB_API void SML_LigthsShadowRenderEnd(ID id);	
+
+//! подготовительные процедур перед рендером для сплита/стороны
+SX_LIB_API void SML_LigthsShadowRenderPre(
+	ID id,		//!< идентификатор света
+	int iCube	//!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита
+	);	
+
+//! завершающие процедур перед рендером для сплита/стороны
+SX_LIB_API void SML_LigthsShadowRenderPost(
+	ID id,		//!< идентификатор света
+	int iCube	//!< для точечного света - сторона cubemap [0-5] для глобального света номер сплита
+	);
+
+//!@}
+
+//! обнуление карты теней, необходимо вызывать перед генерацией теней посредством функции #SML_LigthsGenShadow
+SX_LIB_API void SML_LigthsShadowNull();			
+
+//! генерация тени на основе уже отработанной информации о затенении, перед вызовов этой функции необходимо вызывать #SML_LigthsShadowNull
+SX_LIB_API void SML_LigthsShadowGen(ID id);		
+
+//! возвращает текстуру с тенями (если вызывались функции сглаживания) то вренутся сглаженная
+SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow();
+
+//! сглаживание текущей тени
+SX_LIB_API void SML_LigthsShadowSoft(
+	bool isRandSam,			//!< использовать ли смещение по случайному направлению
+	float fSize,			//!< коэфициент увеличения размера пикселя для размытия
+	bool isFirst = false	//!< впервые ли вызывается размытие для текущей тени, каждый раз когда тень еще не сглажена, но сгенерирована, нужно указывать false
+	);
+
+//! возвращает указатель фрустума света
+SX_LIB_API IFrustum* SML_LigthsGetFrustum(
+	ID id,		//!< идентификатор света
+	int iHow	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	);
+
+//! обновление фрустума глобального света
+SX_LIB_API void SML_LigthsUpdateGFrustums(
+	ID id,				//!< идентификатор света
+	int iSplit,			//!< номер сплита
+	const float3 *pPos,	//!< позиция наблюдателя
+	const float3 *pDir	//!< направление взгляда наблюдателя
+	);
+
+/*! \name Управление настройками для генерации глубины/тени
+@{*/
+
+//! получить текущее смещение (bias) при генерации глубины
+SX_LIB_API float SML_LigthsGetShadowBias(ID id);				
+
+//! установить текущее смещение (bias) при генерации глубины
+SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias);	
+
+
+//! установить размерность размытия (в пикселя) при геренации тени
+SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel);	
+
+//! получить текущее значение размерности (в пикселях) при генерации тени
+SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id);						
+
+
+//! установить значение ближней плоскостью отсечения для теней (локальный свет)
+SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear);	
+
+//! получить текущее значение ближней плоскостью отсечения для теней (локальный свет)
+SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id);				
+
+/*! установка дальней плоскостью отсечения для теней (локальный свет)
+ \note Иногда возникают артефакты и если отрегулировать это значение то все становится на свои места, тесты показали что в основном при ошибках, увеличение этого значения решало проблемы
+*/
+SX_LIB_API void SML_LigthsSetShadowLocalFar(
+	ID id,		//!< идентификатор света
+	float fFar	//!< значение дальней плоскости отсечения (дальность видимости теней), обычно это значение = дальность света
+	);
+
+//! возвращает значение дальней плоскости отсечения (дальности видимости теней)
+SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id);	
+
+//!@}
+
+//-----------------------------------------------------------------------------
+
+/*! \name Управление массивами обработки данных для рендера (к примеру от геометрии, растительности и прочего)
+ Cделано для того чтобы отделить просчеты видимости (если они нужны) от рендера. 
+ К примеру можно рассчитать видимости в одном потоке а рисовать в основном.
+@{
+*/
+
+//! возвращает идентификатор в случае успеха, иначе <0
+SX_LIB_API ID SML_LigthsGetIDArr(
+	ID id,		//!< идентификатор света
+	ID idOwner,	//!< идентификатор объекта/системы вообще того что выдало идентификатор массива
+	int iHow	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	);
+
+//! установить идентификатор
+SX_LIB_API void SML_LigthsSetIDArr(
+	ID id,		//!< идентификатор света
+	ID idOwner,	//!< идентификатор объекта/системы вообще того что выдало идентификатор массива
+	int iHow,	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	ID idArr	//!< номер массива обработки от объекта который надо будет обрабатывать на видимость
+	);
+
+//!@}
+
+//!@} sxmtllight_light_shadow
+
+//! обработка tone mapping
+SX_LIB_API void SML_LigthsToneMappingCom(
+	DWORD timeDelta,			//!< время рендера кадра в млсек
+	float fFactorAdapted = 0.3	//!< на сколько быстро "глаз" привыкнет к освещению (0,1] (медленно, быстро]
+	);
+
+/*! \name Функции обработки удаленного света
+ При удалении света он помещается в специальный массив удаленных объектов, 
+это связано с тем что свет может содержать в себе данные которые требуют очистки памяти вне данной реализации, 
+к примеру идентификаторы массивов просчетов видимости. \n
+ Поэтому необходимо вручную удалять (уже после удаленяи функцией #SML_LigthsDeleteLight) удаленные объекты света.
+ \note Доступ к элементам массива удаленных объектов света осуществляется посредством порядкового номера в массиве (ключа key), то есть можно пройтись по массиву циклом.
+@{*/
+
+//! возвращает количество удаленных объектов света которые требуют удаления
+SX_LIB_API int SML_LigthsDelGetCount();						
+
+//! возвращает тип удаленного объекта света, значения из #LightsTypeLight
+SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID key);		
+
+//! удаляет (окончательно) удаленный объект света
+SX_LIB_API void SML_LigthsDelDel(ID key);						
+
+//! возвращает идентификатор, если был передан, иначе <0
+SX_LIB_API ID SML_LigthsDelGetIDArr(
+	ID key,		//!< порядковый номер объекта света в массиве удаленного света
+	ID idOwner,	//!< идентификатор того что выдало идентификатор массива
+	int iHow	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	);
+
+//!@}
+
+//!@} sxmtllight_light
+
+//#############################################################################
+
+/*! \defgroup sxmtllight_ds Render targets для deferred shading
+ \ingroup sxmtllight
+@{*/
+
+//! типы render targets
+enum DS_RT
+{
+	//! цвет rgba8
+	DS_RT_COLOR = 0,		
+
+	//! нормали (включая микрорельеф) rfb10a2
+	DS_RT_NORMAL,			
+
+	//! параметры освещения rgba8
+	DS_RT_PARAM,			
+
+	//! глубина r16f, непрозрачные материалы
+	DS_RT_DEPTH,			
+
+	//! глубина r16f, непрозрачные материалы
+	DS_RT_DEPTH0,			
+
+	//! глубина r16f, непрозрачные и полупрозрачные пиксели, однако прозрачные (если есть) будут перекрывать непрозрачные, и в этом случае их глубина будет 1 то есть максимальной(для идентификации)
+	DS_RT_DEPTH1,			
+
+
+	//! эмбиент цвет (цвет света rgb) и диффузное освещение (a) rgba16f
+	DS_RT_AMBIENTDIFF,		
+
+	//! блики r16f
+	DS_RT_SPECULAR,			
+
+	//! освещенная сцена rgba16
+	DS_RT_SCENELIGHT,		
+
+	//! освещенная сцена rgba16
+	DS_RT_SCENELIGHT2,		
+
+	//! текущий rt адаптации глаза к освещению r16f
+	DS_RT_ADAPTEDLUM		
+};
+
+//! id render target по его типу
+SX_LIB_API ID SML_DSGetRT_ID(DS_RT type);				
+
+//! текстура render target по его типу
+SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	
+
+//!@} sxmtllight_ds
+
+//#############################################################################
+
+/*! \defgroup sxmtllight_mtl Система материалов
+ \ingroup sxmtllight
+@{*/
+
+/*! максимальная длина имени директории материала */
+#define MTL_MAX_SIZE_DIR SXGC_LOADTEX_MAX_SIZE_DIR		
+
+/*! максимальная длина имени материала (без директории) */
+#define MTL_MAX_SIZE_NAME SXGC_LOADTEX_MAX_SIZE_NAME	
+
+/*! максимальное количество обновлений статических отражений, в первый момент рендера */
+#define MTL_REF_UPDATE_MAX_COUNT_FOR_STATIC 3	
+
+/*! \name Дистанции при которых будут сниженно или повышено количество отрисовок для отражений
+меньше #MTL_REF_UPDATE_L0_DIST - обновление будет каждый кадр
+больше #MTL_REF_UPDATE_L2_DIST - обновления не будет
+@{*/
+
+#define MTL_REF_UPDATE_L0_DIST 10	
+#define MTL_REF_UPDATE_L1_DIST 30	
+#define MTL_REF_UPDATE_L2_DIST 70	
+
+//!@}
+
+/*! \name Параметры альфа теста
+ В данной реалзиации 2 вида альфа теста, принудительный (#SML_MtlSetForceblyAlphaTest) и назначаемый непосредственно материалом
+ \note функция альфа теста D3DCMP_GREATEREQUAL
+@{*/
+
+/*! значение свободного альфа теста (назначаемого материалом) */
+#define MTL_ALPHATEST_FREE_VALUE 64		
+
+/*! значение принудительного альфа теста */
+#define MTL_ALPHATEST_FORCEBLY_VALUE 8	
+
+//!@}
+
+/*! \name Значения параметров освещения по умолчанию
+ Данные значения по умолчанию будут применены к материалами которые не удалось загрузить, либо к стандартным материалам
+@{*/
+
+//! занчение шероховатости по умолчанию
+#define MTL_LIGHTING_DEFAULT_ROUGHNESS 250.f/255.f
+
+//! значение f0 (отражательной способности поверхности) по умолчанию
+#define MTL_LIGHTING_DEFAULT_F0 2.f/255.f
+
+//! значение thickness (толщина - на сколько будет использована диффузная составляющая, для твердых поверхностей - 1, для листьев деревьев и травы <1) по умолчанию
+#define MTL_LIGHTING_DEFAULT_THICKNESS 255.f/255.f
+
+//!@}
+
+/*! \name Параметры отражений
+@{*/
+
+/*! размер текстур с отражениями */
+#define MTL_REF_TEX_SIZE 512	
+
+/*! ближняя плоскость отсечения */
+#define MTl_REF_PROJ_NEAR 0.25	
+
+/*! дальняя плоскость отсечения, или дистанция на которую будет рендер всего в текстуру отражений */
+#define MTl_REF_PROJ_FAR 100	
+
+//!@}
+
+/*! \name Виртуальные директории
+ \warning Имя виртуальной директории должно быть единичным символом (сделано для простоты сравнения), 
+и как следствие нежелательно использоавть реальную директорию с таким именем для текстур либо материалов, 
+и реальные директории не должны начинаться с данных символов
+@{*/
+
+//! имя виртуальной директории по умолчанию для "ручных" текстур с параметрами освещения
+#define MTL_VIRTUAL_DIR_HAND_MTL '0'
+
+//! имя виртуальной директории по умолчанию для стандартных (встроенных) материалов
+#define MTL_VIRTUAL_DIR_STD_MTL "mtrldef"
+
+//!@}
+
+/*! \name Текстурные регистры
+Распределение регистров между текстурами которые будут отправляться для формирования данных
+@{*/
+
+/*!< основная текстура */
+#define MTL_TEX_R_MAIN		0	
+
+/*!< маска */
+#define MTL_TEX_R_MASK		1	
+
+/*! стартовый регистр для детальных текстур
+ \warning 4 следующих (включая указанный) будует заполнены детальными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL+3] не должны отправляться
+ \note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a -  MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL + 1, MTL_TEX_R_DETAIL + 2, MTL_TEX_R_DETAIL + 3
+*/
+#define MTL_TEX_R_DETAIL	2
+
+/*! стартовый регистр для микрорельефных текстур
+\warning 4 следующих (включая указанный) будует заполнены микрорельефными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_MICRO, MTL_TEX_R_MICRO+3] не должны отправляться
+\note Текстуры для каждого канала будут отправляться последовательно: r, g, b, a -  MTL_TEX_R_MICRO, MTL_TEX_R_MICRO + 1, MTL_TEX_R_MICRO + 2, MTL_TEX_R_MICRO + 3
+*/
+#define MTL_TEX_R_MICRO		6
+
+
+/*! текстура с параметрами освещения */
+#define MTL_TEX_R_PARAM_LIGHT	10	
+
+/*! текстура с отражениями */
+#define MTL_TEX_R_REFLECTION	12	
+
+/*! текстура с преломлениями */
+#define MTL_TEX_R_REFRACTION	13	
+
+/*! текстура с текущей глубиной */
+#define MTL_TEX_R_CURR_DEPTH	14	
+
+//!@}
+
+//! типы отражений
+enum MTLTYPE_REFLECT
+{
+	//! нет отражения
+	MTLTYPE_REFLECT_NONE,			
+
+	//! плоское
+	MTLTYPE_REFLECT_PLANE,			
+
+	//! объемное динамическое
+	MTLTYPE_REFLECT_CUBE_DYNAMIC,	
+
+	//! объемное статическое, обработка идет первые несколько кадров, затем не обновляется
+	MTLTYPE_REFLECT_CUBE_STATIC		
+};
+
+//! типы прозрачности
+enum MTLTYPE_TRANSPARENCY
+{
+	//! нет прозрачности
+	MTLTYPE_TRANSPARENCY_NONE,			
+
+	//! освещаяемая прозрачность
+	MTLTYPE_TRANSPARENCY_ALPHA_LIGHT,	
+
+	//! неосвещаяемая прозрачность
+	MTLTYPE_TRANSPARENCY_ALPHA_UNLIT,
+};
+
+/*! \name Возможные слои
+@{*/
+
+//! непрозрачные неосвещаемые
+#define MTLTYPE_LAYER_OPAQUE_UNLIT		0.0f
+
+//! прозрачные неосвещаемые
+#define MTLTYPE_LAYER_TRANSPARENT_UNLIT	0.66f
+
+//! непрозрачные освещаемые
+#define MTLTYPE_LAYER_OPAQUE_LIGHT		0.33f
+
+//! прозрачные освещаемые
+#define MTLTYPE_LAYER_TRANSPARENT_LIGHT	1.0f
+
+//!@}
+
+//! тип модели материала
+enum MTLTYPE_MODEL
+{
+	//! статическая геометрия
+	MTLTYPE_MODEL_STATIC = 0,	
+
+	//! растительность трава
+	MTLTYPE_MODEL_GRASS,		
+
+	//! растительность дерево
+	MTLTYPE_MODEL_TREE,		
+
+	//! анимационная модель
+	MTLTYPE_MODEL_SKIN,		
+
+	//! значение по умолчанию
+	MTLTYPE_MODEL_DEFAULT = MTLTYPE_MODEL_STATIC
+};
+
+//! физический тип материала
+enum MTLTYPE_PHYSIC
+{
+	MTLTYPE_PHYSIC_CONCRETE = 0,	//!< бетон
+
+	//! значение по умолчанию
+	MTLTYPE_PHYSIC_DEFAULT = MTLTYPE_PHYSIC_CONCRETE,
+
+	//! металл
+	MTLTYPE_PHYSIC_METAL,			
+
+	//! стекло
+	MTLTYPE_PHYSIC_GLASS,			
+
+	//! пластик
+	MTLTYPE_PHYSIC_PLASTIC,			
+
+	//! дерево
+	MTLTYPE_PHYSIC_TREE,			
+
+	//! плоть
+	MTLTYPE_PHYSIC_FLESH,			
+
+	//! земля/песок
+	MTLTYPE_PHYSIC_GROUD_SAND,		
+
+	//! вода
+	MTLTYPE_PHYSIC_WATER,			
+
+	//! листва/трава
+	MTLTYPE_PHYSIC_LEAF_GRASS,		
+
+	//! количество типов
+	MPT_COUNT
+};
+
+//! данные отправляемые в шейдеры
+enum MTL_SHADERSTD
+{
+	//! мировая матрица (трансформации модели), world
+	MTL_SHADERSTD_MATRIX_WORLD = 0,		
+
+	//! матрица вида, view
+	MTL_SHADERSTD_MATRIX_VIEW,			
+
+	//! матрица проекции, projection
+	MTL_SHADERSTD_MATRIX_PROJECTION,	
+
+	//! world * view
+	MTL_SHADERSTD_MATRIX_WORLDVIEW,		
+
+	//! world * view * projection
+	MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ,	
+
+	//! позиция камеры/наблюдателя
+	MTL_SHADERSTD_CAMPOS,				
+
+	//! данные о времени float2(CountTimeRender,TimeDelta)
+	MTL_SHADERSTD_TIMEDELTA,			
+
+	//! размеры окна рендера
+	MTL_SHADERSTD_WINSIZE,				
+
+	//! пользовательские данные (float4)
+	MTL_SHADERSTD_USERDATA				
+};
+
+/*! \name Загрузка/сохранение
+ \note Файл загрузки/сохранения представлен простым конфигурационным файлом (ini) который можно обрабатывать посредством #ISXLConfig
+ \todo Расписать организацию конфигурационного файла загрузки/сохранения для материала
+@{*/
+
+/*! загрузка материала, возвращает уникальный идентификатора материала, 
+ \note все материалы оборачиваются в специальную структуру, поэтому дубликатов среди идентификаторов материалов нет
+ \note любой повторно загружаемый материал не загружается, а лишь дублирует обертку, со ссылкой на внутренности оберкти
+ */
+SX_LIB_API ID SML_MtlLoad(
+	const char *szName,								//!< имя_материала.расширение
+	MTLTYPE_MODEL mtl_type = MTLTYPE_MODEL_STATIC	//!< тип модели материала на случай если материал не будет загружен/найден
+	);
+
+//! перезагрузка материала
+SX_LIB_API void SML_MtlReloadMaterial(
+	ID id,					//!< идентификатор материала
+	const char *szName = 0	//!< на случай замены существующего материала другим
+	);
+
+/*! сохранить материал по id
+ \note Сохранение происходит по отноительному пути в директория/директория_имяфайла.mtl
+*/
+SX_LIB_API void SML_MtlSave(ID id);	
+
+//!@}
+
+/*! очитска, удаляет все загруженные материалы (но место в массиве под них остается), все стандартные остаются
+ \warning Отражения не удаляются а помещаются в очередь удаления, так как могут сожеражть в себе идентификаторы, которые необходимы очистить, 
+для полной очистки необходимо вызывать функцию #SML_MtlDelRefClear. Однако во избежания утечек памяти необходимо очистить идентификаторы, для их получения вызыва функцию #SML_MtlDelRefGetIDArr
+*/
+SX_LIB_API void SML_MtlClear(
+	bool isClearRefDel	//!< очищать ли очередь удаления отражений, на тот случай если идентификаторы в отражениях больше не действительны
+	);	
+
+//! возвращает общее количество материалов
+SX_LIB_API long SML_MtlGetCount();					
+
+//! возвращает тип модели материала по id
+SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id);	
+
+/*! установка типа модели материала по id
+ \warning меняется только внутренний флаг (определение)!!! все остальное для данного типа надо загружать вручную, сделано для больших возможностей построения материалов
+*/
+SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model);
+
+//! установка параметров материала по id, вызывается перед DIP
+SX_LIB_API void SML_MtlRender(
+	ID id,					//!< идентификатор материала
+	const float4x4 *pWorld	//!< указатель на мировую матрицу модели, либо 0 - тогда будет принята единичная матрица
+	);
+
+//! стандартная отрисовка материала, используются стандартные шейдеры, нужно для теней, отражений и прочего
+SX_LIB_API void SML_MtlRenderStd(
+	MTLTYPE_MODEL type,			//!< тип материала из MtlTypeModel
+	const float4x4 *pWorld,		//!< мировая матрица трансформации, либо 0 и будет применена единичная матрица
+	ID idSlot,					//!< текстурный слот в который установить текстуру
+	ID idMtl					//!< идентификатор материала из которого будет браться текстура
+	);
+
+//! установка параметров материала для рендера источника света
+SX_LIB_API void SML_MtlRenderLight(
+	const float4_t *pColor,	//!< rgb - цвет, w зарезервирован 
+	const float4x4 *pWorld	//!< аналогично #SML_MtlRender
+	);
+
+//! установить текстуру из материала id в текстурный слот slot
+SX_LIB_API void SML_MtlSetMainTexture(ID idSlot, ID id);	
+
+
+//! установка физического типа материала
+SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type);	
+
+//! возвращает текущий тип физического материала
+SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id);				
+
+//! возвращает id стандартного материала для определенной модели материалов указанной в #MtlTypeModel 
+SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model);
+
+/*! \name Управление полупрозрачными поверхностями
+Каждый выводимый пиксель помечается номером поверхности к которой он относится
+ - 0 - пусто
+ - 1 - непрозрачная геометрия
+ - все что больше 1 значит полупрозрачная геометрия
+ \note Если инкремент установлен то отрисовка каждого материала будет инкрементировать внутренний счетчик, присваивая каждому пикселю поверхности идентификатор поверхности. 
+ \note На данный момент максимальное значение полупрозрачных поверхностей может быть только 255 (8 бит)
+@{*/
+
+/*! установка инкремента идентификатора поверхностей
+ \note К примеру для диференциации (разделения) пикселей при смешивании всех слоев изображения, 
+без разделения по принадлжености к определнной поверхности будет трудно/невозможно (пока выхода нет) корректно смешать все слои
+*/
+SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf);
+
+//! установлен ли инкремент поверхностей
+SX_LIB_API bool SML_MtlGetIsIncrCountSurf();		
+
+//! обнуление идентификатора отрисованных поверхностей (к примеру при новом кадре)
+SX_LIB_API void SML_MtlNullingCurrCountSurf();		
+
+//! текущее количество отрисованных полупрозрачных поверхностей
+SX_LIB_API int SML_MtlGetCurrCountSurf();			
+
+//! установить текущее количество отрисованных полупрозрачных поверхностей
+SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount);	
+
+/*! принудительное включение альфа теста (isat - true - включить, false - выключить) при устновке параметров материала, 
+к примеру для рендера полупрозрачных поверхностей, чтобы отсечь (условно) полностью прозрачные пиксели
+*/
+SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isEnable);	
+
+//! включен ли принудительный альфа тест
+SX_LIB_API bool SML_MtlGetForceblyAlphaTest();			
+
+//!@}
+
+/*! \defgroup sxmtllight_mtl_reflect Отражения
+ \ingroup sxmtllight_mtl
+ \note Поддерживается 2 вида отражений:
+  - плоские
+  - объемные/кубические
+@{*/
+//{{
+
+//! записать в отражения идентификатор (idArr) для определнной стороны куба/сплита (iCube), соотнести его с идентификатором сущности (idOwner)
+SX_LIB_API void SML_MtlRefSetIDArr(
+	ID id,		//!< идентификатор материала
+	ID idOwner,	//!< идентификатор сущности для которой записываем (геометрия, растительность и прочее)
+	int iCube,	//!< условно - сторона куба/сплита для которой записываем 
+	ID idArr	//!< идентификатор который надо записать
+	);
+
+//! возвращает идентификатор который был записан для сущности (idOwner) для стороны куба/сплита (iCube), если вообще записывался, если не записывался то <0
+SX_LIB_API ID SML_MtlRefGetIDArr(
+	ID id,		//!< идентификатор материала
+	ID idOwner,	//!< идентификатор сущности для которой было записывано (геометрия, растительность и прочее)
+	int iCube	//!< условно - сторона куба/сплита для которой было записывано 
+	);
+
+/*! \name Управление удаленными отражениями
+@{*/
+
+//! возвращает количество удаленных материалов с отражениями
+SX_LIB_API int SML_MtlDelRefGetCount();	
+
+//! возвращает идентификатор который был записан для сущности (inid) для стороны куба/сплита (cube)
+SX_LIB_API ID SML_MtlDelRefGetIDArr(
+	ID idKey,	//!< порядковый номер удаленного материала с отражением
+	ID idOwner,	//!< идентификатор сущности для которой было записано (геометрия, растительность и прочее)
+	int iCube	//!< условно - сторона куба/сплита для которой было записывано
+	);
+
+//! очистка массива удаленных материалов с отражениями
+SX_LIB_API void SML_MtlDelRefClear();	
+
+//!@}
+
+//! обработка статистики рендера для текущего матриала с отражением
+SX_LIB_API bool SML_MtlRefUpdateCountUpdate(
+	ID id,						//!< идентификатора материала
+	const float3_t *pViewPos	//!< позиция наблюдателя, viewpos == 0 вернет false
+	);
+
+/*! обнуление статистикки рендера для данного материала с отражением, 
+полезно в случаях каких-либо изменений, чтобы эти изменения были видны и в отражениях (актуально для статических отражений)
+*/
+SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id);
+
+//! установка экстремумов материала
+SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax);
+
+//! возвращает фрустум отражения, cube - сторона куба
+SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(
+	ID id,		//!< идентификатора материала
+	int iCube	//!< сторона куба, если отражение плоское то необходимо указать в cube передать 0, иначе вернет NULL
+	);
+
+SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id);	//!< разрешен ли рендер отражений для данного материала в текущий момент
+
+/*! \name Рендер плоского отражения
+ \note Перед началом рендера плоских отражений необходимо в регистры матриц в #G_RI_MATRIX_VIEW поместить матрицу вида наблюдателя
+ \note Порядок рендера:
+ \code
+ SML_MtlRefPreRenderPlane(id, plane);
+ //код рендера всего того что необходимо поместить в текстуру отражений
+ SML_MtlRefPostRenderPlane(id);
+ \endcode
+@{*/
+
+//! первоначальные настройки данных для генерации отражения
+SX_LIB_API void SML_MtlRefPreRenderPlane(
+	ID id,				//!< идентификатор материала
+	D3DXPLANE *pPlane	//!< плоскость относительно которой будет считаться отражение
+	);	
+
+//! завершающие операции
+SX_LIB_API void SML_MtlRefPostRenderPlane(ID id);			
+
+//! возвращает текстуру с плоским отражением (если оно есть, иначе 0)
+SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id);	
+
+//!@}
+
+/*! \name Рендер объемного (кубического) отражения
+ \note Порядок рендера:
+ \code
+ SML_MtlRefCubeBeginRender(id, center);
+ SML_MtlRefCubePreRender(id, cube, world);
+ //код рендера всего того что необходимо поместить в текстуру отражений
+ SML_MtlRefCubePostRender(id, cube);
+ SML_MtlRefCubeEndRender(id, viewpos);
+ \endcode
+@{*/
+
+//! установка общих настроек
+SX_LIB_API void SML_MtlRefCubeBeginRender(
+	ID id,					//!< идентификатор материала
+	const float3_t *pCenter	//!< центр (позиция) подгруппы модели - откуда будет рендер отражений
+	);	
+
+//! установка частных настроек для стороны куба (cube)
+SX_LIB_API void SML_MtlRefCubePreRender(
+	ID id,					//!< идентификатор материала
+	int iCube,				//!< сторона куба [0,5]
+	const float4x4 *pWorld	//!< мировая матрица модели 
+	);
+
+//! завершающие частные моменты для стороны куба
+SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube);	
+
+/*! завершающие общие моменты
+ \note если viewpos == 0 обновления статисктики рендера для текущего материала с отражением не произойдет, 
+и дабы рационально обрабатывать и статические и динамические отражения необходимо до следующего рендера отражений вызвать SML_MtlRefUpdateCountUpdate
+*/
+SX_LIB_API void SML_MtlRefCubeEndRender(
+	ID id,						//!< идентификатор материала
+	const float3_t *pViewPos	//!< позиция наблюдателя, необходимо для обработки разрешения на следующий рендер
+	);	
+
+//! возвращает cube текстуру отражением (если оно есть, иначе 0)
+SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id);	
+
+//!@}
+
+//!@} sxmtllight_mtl_reflect
+
+
+/*! \defgroup sxmtllight_mtl_propslayer Cвойства поверхности
+ \ingroup sxmtllight_mtl
+@{*/
+
+//! установка основной текстуры (загрузка текстуры по имени)
+SX_LIB_API void SML_MtlSetTexture(ID id, const char *szPathTex);	
+
+//! в name записывает имя текстуры
+SX_LIB_API void SML_MtlGetTexture(ID id, char *szName);			
+
+//! возвращает id текстуры материала
+SX_LIB_API ID SML_MtlGetTextureID(ID id);						
+
+
+/*! \name Шейдеры для рендера материала
+ \warning В текущей версии все шейдеры загружаются в версии 3.0 и требуют в качестве старта указывать функцию main
+ \warning Рекомендуется устанавливать и вершинный и пиксельный шейдеры, так как во врем тестов одно из устройств требовало наличия обоих шейдеров либо отсутствия обоих
+ \note В аргументах path_vs/path_ps указывается только имя шейдера с расширением, есесно возвращается тоже самое
+@{*/
+
+//! установка вершинного шейдера
+SX_LIB_API void SML_MtlSetVS(ID id, const char *szPathVS);	
+
+//! в name записывает имя текущего вершинного шейдера
+SX_LIB_API void SML_MtlGetVS(ID id, char *szName);			
+
+//! установка пиксельного шейдера
+SX_LIB_API void SML_MtlSetPS(ID id, const char *szPathPS);	
+
+//! в name записывает имя текущего пикельного шейдера
+SX_LIB_API void SML_MtlGetPS(ID id, char *szName);			
+
+//!@}
+
+//! возвращает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить
+SX_LIB_API float SML_MtlGetDurability(ID id);
+
+//! устанавливает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить
+SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability);
+
+
+//! возвращает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется]
+SX_LIB_API float SML_MtlGetHitChance(ID id);
+
+//! устанавливает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется]
+SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance);
+
+
+//! возвращает плотность материала кг/м3
+SX_LIB_API float SML_MtlGetDensity(ID id);
+
+//! устанавливает плотность материала кг/м3
+SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity);
+
+
+//! используется ли альфа тест для материала
+SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id);				
+
+//! установка использования альфа теста
+SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing);	
+
+/*! освещение материала id
+ \note если материал не освещается то будет выведен в цвете накладываемым материалом
+*/
+SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting);	
+
+//! освещается ли материал
+SX_LIB_API bool SML_MtlGetLighting(ID id);	
+
+/*! \name Параметры освещения.
+ \note Для более точной/тонкой настройки освещения материала рекомендуется использовать текстуру с параметрами освещения 
+(к прмиеру когда в одной поверхности разные материалы, к примеру дерево, метал и камень, то в текстуре можно указать параметры освещения для каждого пикселя), 
+однако если текстуры нет то будут использованы установленные парметры освещения для всей поверхности
+@{*/
+
+//! установка использования текстуры с параметрами освещения
+SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting);
+
+//! используется ли текстура с параметрами для освещения
+SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id);	
+
+
+//! загрузка текстуры с парамтерами освещения
+SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szPathTex);	
+
+//! в path_tex записывает имя текстуры с параметрами освещения
+SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szPathTex);		
+
+
+//! установка шероховатости (0-1)
+SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness);	
+
+//! возвращает текущее значение шероховатости поверхности
+SX_LIB_API float SML_MtlGetRoughness(ID id);					
+
+
+//! установка просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение
+SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness);	
+
+//! возвращает просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение
+SX_LIB_API float SML_MtlGetThickness(ID id);					
+
+//! установка отражательной способности поверхности (0-1)
+SX_LIB_API void SML_MtlSetF0(ID id, float fF0);	
+
+//! возвращает текущее значение отражательной способности поверхности
+SX_LIB_API float SML_MtlGetF0(ID id);			
+
+//!@}
+
+/*! \name Полупрозрачность, типы из #MtlTypeTransparency
+Под полупрозрачными материалами следует понимать такие материалы, прозрачность которых в среднем находится в пределах 0.5 и минимальный процент полупрозрачного периметра 50%
+@{*/
+
+//! установка типа полупрозрачности
+SX_LIB_API void SML_MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type);	
+
+//! возвращает текущий тип полупрозрачности для материала
+SX_LIB_API MTLTYPE_TRANSPARENCY SML_MtlGetTypeTransparency(ID id);				
+
+//!@}
+
+/*! \name Отражения окружения, типы из #MtlTypeReflect
+@{*/
+
+//! установка типа отражений
+SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type);	
+
+//! возвращает текущий тип отражений для материала
+SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id);				
+
+//!@}
+
+/*! \name Детальность и микрорельеф
+Поверхность может содержать до 4 детальных текстур и до 4 текстур с микрорельефом. 
+Данные для определения наложения текстур (детальных и микрорельефных) указываются в маске - 
+на каждый канал текстуры маски по одной детальной и микрорельефной текстуре, 
+то есть канал маски определет связанные между собой и детальную и микрорельефную текстуры
+ \note В аргументах channel - RGBA - 0,1,2,3
+@{*/
+
+//! загрузка маски наложения
+SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szPathTex);	
+
+//! в path_tex записывает текущее имя маски наложения
+SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szPathTex);		
+
+//! загрузка текстуры микрорельефа, на каждый канал
+SX_LIB_API void SML_MtlSetMRTex(
+	ID id,					//!< идентификатор материала
+	int iChannel,			//!< номер канала RGBA - 0,1,2,3
+	const char *szPathTex	//!< имя текстуры с расширением
+	);
+
+//! в path_tex запишет текущее имя текстуры микрорельефа для канала channel
+SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szPathTex);
+
+//! загрузка детальной текстуры, на каждый канал
+SX_LIB_API void SML_MtlSetDTex(
+	ID id,					//!< идентификатор материала
+	int iChannel,			//!< номер канала RGBA - 0,1,2,3
+	const char *szPathTex	//!< имя текстуры с расширением
+	);
+
+//! в path_tex запишет текущее имя детальной текстуры для канала channel
+SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szPathTex);
+
+//!@}
+
+/*! \name Стандартные параметры для отправки в шейдер (в вершинный и пиксельный раздельно), данные из #MtlTransShaderStd
+@{*/
+
+//! отправка стадартных данных в вершинный шейдер
+SX_LIB_API void SML_MtlSetStdVS(
+	ID id,				//!< идентификатор материала
+	MTL_SHADERSTD type,	//!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd
+	bool isSend			//!< true - отправлять, false - не отправлять
+	);
+
+//! установлена ли отпрвка значения type в вершинный шейдер
+SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type);
+
+//! отправка стадартных данных в пиксельный шейдер
+SX_LIB_API void SML_MtlSetStdPS(
+	ID id,				//!< идентификатор материала
+	MTL_SHADERSTD type,	//!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd
+	bool isSend			//!< true - отправлять, false - не отправлять
+	);
+
+//! установлена ли отпрвка значения type в пиксельный шейдер
+SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type);
+
+//!@}
+
+/*! \name Дополнительные пользовательские данные в виде float4 (предел [0-1] для стандарта, иное вне стандарта, но допустимо)
+ \note Данные для вершинного и пиксельного шейдера раздельны. Отправляется float4.
+Однако данные и из пиксельного могут быть отправленны в вершинный и наоборот.
+В итоге в шейдере может быть 2 float4 пользовательских вектора с данными.
+Но если вектор определен для пиксельного то он все-равно будет отправлен в пиксельный шейдер, даже если и придназначалася для вершинного.
+ \note В аргументах component - xyzw - 0,1,2,3
+@{*/
+
+//! установка значения компоненты вектора для вершинного шейдера
+SX_LIB_API void SML_MtlSetUserDataVS(
+	ID id,			//!< идентификатор материала
+	int iComponent,	//!< компонента вектора xyzw - 0,1,2,3
+	float fValue	//!< значение компоненты
+	);
+
+//! возвращает значение компоненты вектора, который отправляется в вершинный шейдер
+SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent);
+
+//! установка отправки float4 вектора, предназначенного для вершинного шейдера, в пиксельный шейдер
+SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPs);
+
+//! отправляется ли float4 вектор, предназначенный для вершинного шейдера, в пиксельный шейдер
+SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id);
+
+
+//! установка значения компоненты вектора для пиксельного шейдера
+SX_LIB_API void SML_MtlSetUserDataPS(
+	ID id,			//!< идентификатор материала
+	int iComponent,	//!< компонента вектора xyzw - 0,1,2,3
+	float fValue	//!< значение компоненты
+	);
+
+//! возвращает значение компоненты вектора, который отправляется в пиксельный шейдер
+SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent);
+
+//! установка отправки float4 вектора, предназначенного для пиксельного шейдера, в вершинный шейдер
+SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVs);
+
+//! отправляется ли float4 вектор, предназначенный для пиксельного шейдера, в вершинный шейдер
+SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id);
+
+//!@}
+
+//!@} sxmtllight_mtl_propslayer
+
+//!@} sxmtllight_mtl
+
+#endif
+
+//!@} sxmtllight
diff --git a/source/mtllight/sxmtllight.cpp b/source/mtllight/sxmtllight.cpp
index 7fe7c48bb..edbf8f16c 100644
--- a/source/mtllight/sxmtllight.cpp
+++ b/source/mtllight/sxmtllight.cpp
@@ -18,7 +18,7 @@ report_func g_fnReportf = DefReport;
 #endif
 
 CLights* ArrLights = 0;
-Materials* ArrMaterials = 0;
+CMaterials* ArrMaterials = 0;
 
 #define ML_PRECOND(retval) if(!ArrLights){LibReport(-1, "%s - sxmtlligth is not init", GEN_MSG_LOCATION); return retval;}
 
@@ -34,13 +34,13 @@ SX_LIB_API void SML_Dbg_Set(report_func rf)
 	g_fnReportf = rf;
 }
 
-SX_LIB_API void SML_0Create(const char* name, bool is_unic)
+SX_LIB_API void SML_0Create(const char *szName, bool isUnic)
 {
-	if (name && strlen(name) > 1)
+	if (szName && strlen(szName) > 1)
 	{
-		if (is_unic)
+		if (isUnic)
 		{
-			HANDLE hMutex = CreateMutex(NULL, FALSE, name);
+			HANDLE hMutex = CreateMutex(NULL, FALSE, szName);
 			if (GetLastError() == ERROR_ALREADY_EXISTS)
 			{
 				CloseHandle(hMutex);
@@ -51,7 +51,7 @@ SX_LIB_API void SML_0Create(const char* name, bool is_unic)
 				MLSet::MLInit();
 				MLSet::ReCalcSize();
 				ArrLights = new CLights();
-				ArrMaterials = new Materials();
+				ArrMaterials = new CMaterials();
 			}
 		}
 		else
@@ -59,7 +59,7 @@ SX_LIB_API void SML_0Create(const char* name, bool is_unic)
 			MLSet::MLInit();
 			MLSet::ReCalcSize();
 			ArrLights = new CLights();
-			ArrMaterials = new Materials();
+			ArrMaterials = new CMaterials();
 		}
 	}
 	else
@@ -76,36 +76,17 @@ SX_LIB_API void SML_OnLostDevice()
 {
 	ML_PRECOND(_VOID);
 	ArrLights->onLostDevice();
-	ArrMaterials->OnLostDevice();
+	ArrMaterials->onLostDevice();
 }
 
 SX_LIB_API void SML_OnResetDevice()
 {
 	ML_PRECOND(_VOID);
-	/*MLSet::WinSize.x = width;
-	MLSet::WinSize.y = heigth;
-	MLSet::ProjFov = projfov;
-	MLSet::ProjRatio = MLSet::WinSize.x / MLSet::WinSize.y;*/
+
 	MLSet::ReCalcSize();
 	ArrLights->onResetDevice();
-	ArrMaterials->OnResetDevice();
+	ArrMaterials->onResetDevice();
 
-	//MLSet::IDsRenderTargets::ToneMaps.clear();
-	//MLSet::IDsRenderTargets::SurfToneMap.clear();
-	/*int tmpcount = 0;
-	while (true)
-	{
-		int tmpsize = 1 << (2 * tmpcount);
-		if (tmpsize >= MLSet::WinSize.x*0.25 || tmpsize > MLSet::WinSize.y*0.25)
-			break;
-		if (MLSet::IDsRenderTargets::CountArrToneMaps <= tmpcount)
-		{
-			MLSet::IDsRenderTargets::ToneMaps[tmpcount] = SGCore_RTAdd(tmpsize, tmpsize, 1, D3DUSAGE_RENDERTARGET, D3DFMT_R16F, D3DPOOL_DEFAULT, "", 0);
-			MLSet::IDsRenderTargets::SurfToneMap[tmpcount] = 0;
-		}
-		++tmpcount;
-	}
-	MLSet::IDsRenderTargets::CountArrToneMaps = tmpcount;*/
 	MLSet::IDsRenderTargets::HowAdaptedLum = 0;
 }
 
@@ -117,27 +98,27 @@ SX_LIB_API void SML_Update(DWORD timeDelta)
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 
 	if (ArrMaterials)
-		ArrMaterials->Update(timeDelta);
+		ArrMaterials->update(timeDelta);
 
 	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);
 }
 
-SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float coef)
+SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef)
 {
 	ML_PRECOND(_VOID);
 
-	MLSet::CoefSizeDepthMapForLocal = coef;
+	MLSet::CoefSizeDepthMapForLocal = fCoef;
 	MLSet::ReCalcSize();
 	SML_OnLostDevice();
 	SML_OnResetDevice();
 }
 
-SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float coef)
+SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef)
 {
 	ML_PRECOND(_VOID);
 
-	MLSet::CoefSizeDepthMapForGlobal = coef;
+	MLSet::CoefSizeDepthMapForGlobal = fCoef;
 	MLSet::ReCalcSize();
 	SML_OnLostDevice();
 	SML_OnResetDevice();
@@ -173,7 +154,7 @@ SX_LIB_API void SML_LigthsClearIDArr()
 	ArrLights->clearIDArr();
 }
 
-SX_LIB_API long SML_LigthsGetCount()
+SX_LIB_API int SML_LigthsGetCount()
 {
 	ML_PRECOND(-1);
 
@@ -188,16 +169,16 @@ SX_LIB_API bool SML_LigthsGetExists(ID id)
 }
 
 
-SX_LIB_API ID SML_LigthsCreatePoint(const float3* center, float dist, const float3* color, bool isglobal, bool is_shadowed/*, const char* bound_volume*/)
+SX_LIB_API ID SML_LigthsCreatePoint(const float3 *pCenter, float fDist, const float3 *pColor, bool isGlobal, bool isShadowed/*, const char* bound_volume*/)
 {
 	ML_PRECOND(-1);
-	return ArrLights->createPoint(-1,center, dist, color, isglobal, is_shadowed/*, 0*/);
+	return ArrLights->createPoint(-1, pCenter, fDist, pColor, isGlobal, isShadowed/*, 0*/);
 }
 
-SX_LIB_API ID SML_LigthsCreateDirection(const float3* pos, float dist, const float3* color, const SMQuaternion* orient, float top_radius, float angle, bool is_shadow/*, const char* bound_volume*/)
+SX_LIB_API ID SML_LigthsCreateDirection(const float3 *pPos, float fDist, const float3 *pColor, const SMQuaternion *qOrient, float fTopRadius, float fAngle, bool isShadow/*, const char* bound_volume*/)
 {
 	ML_PRECOND(-1);
-	return ArrLights->createDirection(-1, pos, dist, color, orient, top_radius, angle, is_shadow/*, 0*/);
+	return ArrLights->createDirection(-1, pPos, fDist, pColor, qOrient, fTopRadius, fAngle, isShadow/*, 0*/);
 }
 
 SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta)
@@ -224,22 +205,22 @@ SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed)
 	return ArrLights->setCastGlobalShadow(isShadowed);
 }
 
-SX_LIB_API void SML_LigthsGetColor(ID id, float3* color)
+SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->getLightColor(id, color);
+	ArrLights->getLightColor(id, pColor);
 }
 
-SX_LIB_API void SML_LigthsSetColor(ID id, const float3* vec)
+SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightColor(id, vec);
+	ArrLights->setLightColor(id, pColor);
 }
 
-SX_LIB_API void SML_LigthsGetPos(ID id, float3* vec, bool greal)
+SX_LIB_API void SML_LigthsGetPos(ID id, float3 *pPos, bool isGreal)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->getLightPos(id, vec, greal);
+	ArrLights->getLightPos(id, pPos, isGreal);
 }
 
 SX_LIB_API float SML_LigthsGetPower(ID id)
@@ -254,22 +235,22 @@ SX_LIB_API float SML_LigthsGetDist(ID id)
 	return ArrLights->getLightDist(id);
 }
 
-SX_LIB_API void SML_LigthsSetPos(ID id, const float3* vec, bool greal)
+SX_LIB_API void SML_LigthsSetPos(ID id, const float3 *pPos, bool isGreal)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightPos(id, vec, greal);
+	ArrLights->setLightPos(id, pPos, isGreal);
 }
 
-SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion* q)
+SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->getLightOrient(id, q);
+	ArrLights->getLightOrient(id, pQ);
 }
 
-SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion* q)
+SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightOrient(id, q);
+	ArrLights->setLightOrient(id, pQ);
 }
 
 SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id)
@@ -278,10 +259,10 @@ SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id)
 	return ArrLights->getLightType(id);
 }
 
-SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum* frustum)
+SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum)
 {
 	ML_PRECOND(-1);
-	return ArrLights->comVisibleForFrustum(id, frustum);
+	return ArrLights->comVisibleForFrustum(id, pFrustum);
 }
 
 SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id)
@@ -290,10 +271,10 @@ SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id)
 	return ArrLights->getVisibleForFrustum(id);
 }
 
-SX_LIB_API float SML_LigthsComDistFor(ID id, const float3* vec)
+SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pPos)
 {
 	ML_PRECOND(-1);
-	return ArrLights->comDistFor(id, vec);
+	return ArrLights->comDistFor(id, pPos);
 }
 
 SX_LIB_API float SML_LigthsGetDistFor(ID id)
@@ -302,10 +283,10 @@ SX_LIB_API float SML_LigthsGetDistFor(ID id)
 	return ArrLights->getDistFor(id);
 }
 
-SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum* frustum, const float3* vec)
+SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pPos)
 {
 	ML_PRECOND(_VOID);
-	return ArrLights->comVisibleFrustumDistFor(frustum, vec);
+	return ArrLights->comVisibleFrustumDistFor(pFrustum, pPos);
 }
 
 SX_LIB_API bool SML_LigthsGetEnable(ID id)
@@ -314,10 +295,10 @@ SX_LIB_API bool SML_LigthsGetEnable(ID id)
 	return ArrLights->getLightEnable(id);
 }
 
-SX_LIB_API void SML_LigthsSetEnable(ID id, bool val)
+SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable)
 {
 	ML_PRECOND(_VOID);
-	return ArrLights->setLightEnable(id, val);
+	return ArrLights->setLightEnable(id, isEnable);
 }
 
 SX_LIB_API bool SML_LigthsGetShadowed(ID id)
@@ -332,11 +313,11 @@ SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id)
 	return ArrLights->get4Or3Splits(id);
 }
 
-SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool bf4or3)
+SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3)
 {
 	ML_PRECOND(_VOID);
 
-	ArrLights->set4Or3Splits(id, bf4or3);
+	ArrLights->set4Or3Splits(id, is4or3);
 }
 
 SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow()
@@ -363,34 +344,34 @@ SX_LIB_API void SML_LigthsShadowRenderEnd(ID id)
 	ArrLights->shadowRenderEnd(id);
 }
 
-SX_LIB_API void SML_LigthsShadowRenderPre(ID id, int cube)
+SX_LIB_API void SML_LigthsShadowRenderPre(ID id, int iCube)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->shadowRenderPre(id, cube);
+	ArrLights->shadowRenderPre(id, iCube);
 }
 
-SX_LIB_API void SML_LigthsShadowRenderPost(ID id, int cube)
+SX_LIB_API void SML_LigthsShadowRenderPost(ID id, int iCube)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->shadowRenderPost(id, cube);
+	ArrLights->shadowRenderPost(id, iCube);
 }
 
-SX_LIB_API IFrustum* SML_LigthsGetFrustum(ID id, int how)
+SX_LIB_API IFrustum* SML_LigthsGetFrustum(ID id, int iHow)
 {
 	ML_PRECOND(0);
-	return ArrLights->getLightFrustum(id, how);
+	return ArrLights->getLightFrustum(id, iHow);
 }
 
-SX_LIB_API void SML_LigthsUpdateGFrustums(ID id, int split, const float3* pos, const float3* dir)
+SX_LIB_API void SML_LigthsUpdateGFrustums(ID id, int iSplit, const float3 *pPos, const float3 *pDir)
 {
 	ML_PRECOND(_VOID);
-	return ArrLights->updateLightGFrustums(id, split, pos, dir);
+	return ArrLights->updateLightGFrustums(id, iSplit, pPos, pDir);
 }
 
-SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, float4x4* wmat)
+SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int iTypeMaterial, const float4x4 *pWorld)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->initShaderOfTypeMaterial(id, typemat, wmat);
+	ArrLights->initShaderOfTypeMaterial(id, iTypeMaterial, pWorld);
 }
 
 SX_LIB_API void SML_LigthsShadowGen(ID id)
@@ -399,10 +380,10 @@ SX_LIB_API void SML_LigthsShadowGen(ID id)
 	ArrLights->shadowGen2(id);
 }
 
-SX_LIB_API void SML_LigthsShadowSoft(bool randomsam, float size, bool isfirst)
+SX_LIB_API void SML_LigthsShadowSoft(bool isRandom, float fSize, bool isFirst)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->shadowSoft(randomsam, size, isfirst);
+	ArrLights->shadowSoft(isRandom, fSize, isFirst);
 }
 
 
@@ -425,29 +406,29 @@ SX_LIB_API char* SML_LigthsGetName(ID id)
 	return ArrLights->getLightName(id);
 }
 
-SX_LIB_API void SML_LigthsSetName(ID id, const char* name)
+SX_LIB_API void SML_LigthsSetName(ID id, const char *szName)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightName(id, name);
+	ArrLights->setLightName(id, szName);
 }
 
 
-SX_LIB_API void SML_LigthsSetAngle(ID id, float angle)
+SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightAngle(id, angle, true);
+	ArrLights->setLightAngle(id, fAngle, true);
 }
 
-SX_LIB_API void SML_LigthsSetTopRadius(ID id, float top_radius)
+SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightTopRadius(id, top_radius);
+	ArrLights->setLightTopRadius(id, fTopRadius);
 }
 
-SX_LIB_API void SML_LigthsSetDist(ID id, float radius_height, bool is_create)
+SX_LIB_API void SML_LigthsSetDist(ID id, float fRadiusHeight, bool isCreate)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightDist(id, radius_height, is_create);
+	ArrLights->setLightDist(id, fRadiusHeight, isCreate);
 }
 
 
@@ -457,16 +438,16 @@ SX_LIB_API float SML_LigthsGetShadowBias(ID id)
 	return ArrLights->getShadowBias(id);
 }
 
-SX_LIB_API void SML_LigthsSetShadowBias(ID id, float bias)
+SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias)
 {
 	ML_PRECOND(_VOID);
-	return ArrLights->setShadowBias(id, bias);
+	return ArrLights->setShadowBias(id, fBias);
 }
 
-SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float blur_pixel)
+SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setShadowBlurPixel(id, blur_pixel);
+	ArrLights->setShadowBlurPixel(id, fBlurPixel);
 }
 
 SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id)
@@ -474,10 +455,10 @@ SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id)
 	ML_PRECOND(-1);
 	return ArrLights->getShadowBlurPixel(id);
 }
-SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float slnear)
+SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setShadowLocalNear(id, slnear);
+	ArrLights->setShadowLocalNear(id, fNear);
 }
 
 SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id)
@@ -486,10 +467,10 @@ SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id)
 	return ArrLights->getShadowLocalNear(id);
 }
 
-SX_LIB_API void SML_LigthsSetShadowLocalFar(ID id, float slfar)
+SX_LIB_API void SML_LigthsSetShadowLocalFar(ID id, float fFar)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setShadowLocalFar(id, slfar);
+	ArrLights->setShadowLocalFar(id, fFar);
 }
 
 SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id)
@@ -498,16 +479,16 @@ SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id)
 	return ArrLights->getShadowLocalFar(id);
 }
 
-SX_LIB_API void SML_LigthsSetCubeEdgeEnable(ID id, int edge, bool enable)
+SX_LIB_API void SML_LigthsSetCubeEdgeEnable(ID id, int iEdge, bool isEnable)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightCubeEdgeEnable(id, edge, enable);
+	ArrLights->setLightCubeEdgeEnable(id, iEdge, isEnable);
 }
 
-SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(ID id, int edge)
+SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(ID id, int iEdge)
 {
 	ML_PRECOND(false);
-	return ArrLights->getLightCubeEdgeEnable(id, edge);
+	return ArrLights->getLightCubeEdgeEnable(id, iEdge);
 }
 
 
@@ -523,16 +504,16 @@ SX_LIB_API float SML_LigthsGetTopRadius(ID id)
 	return ArrLights->getLightTopRadius(id);
 }
 
-SX_LIB_API ID SML_LigthsGetIDArr(ID id, ID inid, int how)
+SX_LIB_API ID SML_LigthsGetIDArr(ID id, ID idOwner, int iHow)
 {
 	ML_PRECOND(-1);
-	return ArrLights->getLightIDArr(id, inid, how);
+	return ArrLights->getLightIDArr(id, idOwner, iHow);
 }
 
-SX_LIB_API void SML_LigthsSetIDArr(ID id, ID inid, int how, ID id_arr)
+SX_LIB_API void SML_LigthsSetIDArr(ID id, ID idOwner, int iHow, ID idArr)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->setLightIDArr(id, inid, how, id_arr);
+	ArrLights->setLightIDArr(id, idOwner, iHow, idArr);
 }
 
 SX_LIB_API void SML_LigthsSetTypeShadowed(ID id, LTYPE_SHADOW type)
@@ -547,16 +528,16 @@ SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id)
 	return ArrLights->getLightTypeShadowed(id);
 }
 
-SX_LIB_API bool SML_LigthsCountUpdateUpdate(ID id, const float3* viewpos, int ghow)
+SX_LIB_API bool SML_LigthsCountUpdateUpdate(ID id, const float3 *pViewPos, int iHow)
 {
 	ML_PRECOND(false);
-	return ArrLights->lightCountUpdateUpdate(id, viewpos, ghow);
+	return ArrLights->lightCountUpdateUpdate(id, pViewPos, iHow);
 }
 
-SX_LIB_API bool SML_LigthsCountUpdateAllowed(ID id, int ghow)
+SX_LIB_API bool SML_LigthsCountUpdateAllowed(ID id, int iHow)
 {
 	ML_PRECOND(false);
-	return ArrLights->lightCountUpdateAllowed(id, ghow);
+	return ArrLights->lightCountUpdateAllowed(id, iHow);
 }
 
 SX_LIB_API void SML_LigthsCountUpdateNull(ID id)
@@ -565,10 +546,10 @@ SX_LIB_API void SML_LigthsCountUpdateNull(ID id)
 	ArrLights->lightCountUpdateNull(id);
 }
 
-SX_LIB_API void SML_LigthsToneMappingCom(DWORD timeDelta, float factor_adapted)
+SX_LIB_API void SML_LigthsToneMappingCom(DWORD timeDelta, float fAdapted)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->toneMappingCom(timeDelta, factor_adapted);
+	ArrLights->toneMappingCom(timeDelta, fAdapted);
 }
 
 SX_LIB_API int SML_LigthsDelGetCount()
@@ -577,22 +558,22 @@ SX_LIB_API int SML_LigthsDelGetCount()
 	return ArrLights->delGetCount();
 }
 
-SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID key)
+SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID idKey)
 {
 	ML_PRECOND(LTYPE_LIGHT_NONE);
-	return ArrLights->delGetType(key);
+	return ArrLights->delGetType(idKey);
 }
 
-SX_LIB_API void SML_LigthsDelDel(ID key)
+SX_LIB_API void SML_LigthsDelDel(ID idKey)
 {
 	ML_PRECOND(_VOID);
-	ArrLights->delDel(key);
+	ArrLights->delDel(idKey);
 }
 
-SX_LIB_API ID SML_LigthsDelGetIDArr(ID key, ID inid, int how)
+SX_LIB_API ID SML_LigthsDelGetIDArr(ID idKey, ID idOwner, int iHow)
 {
 	ML_PRECOND(-1);
-	return ArrLights->delGetIDArr(key, inid, how);
+	return ArrLights->delGetIDArr(idKey, idOwner, iHow);
 }
 
 //#############################################################################
@@ -642,548 +623,555 @@ SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type)
 
 //#############################################################################
 
-SX_LIB_API ID SML_MtlLoad(const char* name, MTLTYPE_MODEL mtl_type)
+SX_LIB_API ID SML_MtlLoad(const char *szName, MTLTYPE_MODEL mtl_type)
 {
 	ML_PRECOND(-1);
 
-	return ArrMaterials->MtlLoad(name, mtl_type);
+	return ArrMaterials->mtlLoad(szName, mtl_type);
 }
 
 SX_LIB_API void SML_MtlSave(ID id)
 {
 	ML_PRECOND(_VOID);
 
-	ArrMaterials->MtlSave(id);
+	ArrMaterials->mtlSave(id);
 }
 
 SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id)
 {
 	ML_PRECOND(MTLTYPE_MODEL_STATIC);
 
-	return ArrMaterials->GetTypeModel(id);
+	return ArrMaterials->getTypeModel(id);
+}
+
+SX_LIB_API UINT SML_MtlGetSort(ID id)
+{
+	ML_PRECOND(0);
+
+	return ArrMaterials->mtlGetSort(id);
 }
 
 SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model)
 {
 	ML_PRECOND(_VOID);
 
-	ArrMaterials->SetTypeModel(id, type_model);
+	ArrMaterials->setTypeModel(id, type_model);
 }
 
 SX_LIB_API long SML_MtlGetCount()
 {
 	ML_PRECOND(-1);
 
-	return ArrMaterials->GetCount();
+	return ArrMaterials->getCount();
 }
 
-SX_LIB_API void SML_MtlRender(ID id, float4x4* world)
+SX_LIB_API void SML_MtlRender(ID id, const float4x4 *pWorld)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->Render(id, world);
+	ArrMaterials->render(id, pWorld);
 }
 
-SX_LIB_API void SML_MtlRenderStd(MTLTYPE_MODEL type, float4x4* world, ID slot, ID id_mtl)
+SX_LIB_API void SML_MtlRenderStd(MTLTYPE_MODEL type, const float4x4 *pWorld, ID idSlot, ID idMtl)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->RenderStd(type, world, slot, id_mtl);
+	ArrMaterials->renderStd(type, pWorld, idSlot, idMtl);
 }
 
-SX_LIB_API void SML_MtlRenderLight(float4_t* color, float4x4* world)
+SX_LIB_API void SML_MtlRenderLight(const float4_t *pColor, const float4x4 *pWorld)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->RenderLight(color, world);
+	ArrMaterials->renderLight(pColor, pWorld);
 }
 
 SX_LIB_API void SML_MtlSetMainTexture(ID slot, ID id)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->SetMainTexture(slot, id);
+	ArrMaterials->setMainTexture(slot, id);
 }
 
 SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->SetIsIncrCountSurf(bf);
+	ArrMaterials->setIsIncrCountSurf(bf);
 }
 
 SX_LIB_API bool SML_MtlGetIsIncrCountSurf()
 {
 	ML_PRECOND(false);
-	return ArrMaterials->GetIsIncrCountSurf();
+	return ArrMaterials->getIsIncrCountSurf();
 }
 
 SX_LIB_API void SML_MtlNullingCurrCountSurf()
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->NullingCurrCountSurf();
+	ArrMaterials->nullingCurrCountSurf();
 }
 
 SX_LIB_API int SML_MtlGetCurrCountSurf()
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->GetCurrCountSurf();
+	return ArrMaterials->getCurrCountSurf();
 }
 
-SX_LIB_API void SML_MtlSetCurrCountSurf(int count)
+SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->SetCurrCountSurf(count);
+	ArrMaterials->setCurrCountSurf(iCount);
 }
 
-SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isat)
+SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isAlphaTest)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->SetForceblyAlphaTest(isat);
+	ArrMaterials->setForceblyAlphaTest(isAlphaTest);
 }
 
 SX_LIB_API bool SML_MtlGetForceblyAlphaTest()
 {
 	ML_PRECOND(false);
-	return ArrMaterials->GetForceblyAlphaTest();
+	return ArrMaterials->getForceblyAlphaTest();
 }
 
 
 SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->GetStdMtl(type_model);
+	return ArrMaterials->getStdMtl(type_model);
 }
 
 
 SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetPhysicMaterial(id, type);
+	ArrMaterials->mtlSetPhysicMaterial(id, type);
 }
 
 SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id)
 {
 	ML_PRECOND(MTLTYPE_PHYSIC_DEFAULT);
-	return ArrMaterials->MtlGetPhysicMaterial(id);
+	return ArrMaterials->mtlGetPhysicMaterial(id);
 }
 
 SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetUsingAlphaTest(id);
+	return ArrMaterials->mtlGetUsingAlphaTest(id);
 }
 
-SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool is_using)
+SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetUsingAlphaTest(id, is_using);
+	ArrMaterials->mtlSetUsingAlphaTest(id, isUsing);
 }
 
 
 
-SX_LIB_API void SML_MtlRefSetIDArr(ID id, ID inid, int cube, ID idarr)
+SX_LIB_API void SML_MtlRefSetIDArr(ID id, ID idOwner, int iCube, ID idArr)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefSetIDArr(id, inid, cube, idarr);
+	ArrMaterials->mtlRefSetIDArr(id, idOwner, iCube, idArr);
 }
 
-SX_LIB_API ID SML_MtlRefGetIDArr(ID id, ID inid, int cube)
+SX_LIB_API ID SML_MtlRefGetIDArr(ID id, ID idOwner, int iCube)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlRefGetIDArr(id, inid, cube);
+	return ArrMaterials->mtlRefGetIDArr(id, idOwner, iCube);
 }
 
 SX_LIB_API int SML_MtlDelRefGetCount()
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->DelRefCount();
+	return ArrMaterials->delRefCount();
 }
 
-SX_LIB_API ID SML_MtlDelRefGetIDArr(ID key, ID inid, int cube)
+SX_LIB_API ID SML_MtlDelRefGetIDArr(ID idKey, ID idOwner, int iCube)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->DelRefGetIDArr(key, inid, cube);
+	return ArrMaterials->delRefGetIDArr(idKey, idOwner, iCube);
 }
 
 SX_LIB_API void SML_MtlDelRefClear()
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->DelRefAllDel();
+	ArrMaterials->delRefAllDel();
 }
 
-SX_LIB_API void SML_MtlRefSetMinMax(ID id, float3_t* min, float3_t* max)
+SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefSetMinMax(id, min, max);
+	ArrMaterials->mtlRefSetMinMax(id, pMin, pMax);
 }
 
-SX_LIB_API void SML_MtlRefPreRenderPlane(ID id, D3DXPLANE* plane)
+SX_LIB_API void SML_MtlRefPreRenderPlane(ID id, D3DXPLANE *pPlane)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefPreRenderPlane(id, plane);
+	ArrMaterials->mtlRefPreRenderPlane(id, pPlane);
 }
 
-SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(ID id, int cube)
+SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(ID id, int iCube)
 {
 	ML_PRECOND(0);
-	return ArrMaterials->MtlRefGetfrustum(id, cube);
+	return ArrMaterials->mtlRefGetfrustum(id, iCube);
 }
 
 SX_LIB_API bool SML_MtlRefIsAllowedRender(ID id)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlRefIsAllowedRender(id);
+	return ArrMaterials->mtlRefIsAllowedRender(id);
 }
 
 SX_LIB_API void SML_MtlRefPostRenderPlane(ID id)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefPostRenderPlane(id);
+	ArrMaterials->mtlRefPostRenderPlane(id);
 }
 
 SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id)
 {
 	ML_PRECOND(0);
-	return ArrMaterials->MtlRefPlaneGetTex(id);
+	return ArrMaterials->mtlRefPlaneGetTex(id);
 }
 
 
 
-SX_LIB_API void SML_MtlRefCubeBeginRender(ID id, float3_t* center)
+SX_LIB_API void SML_MtlRefCubeBeginRender(ID id, const float3_t *pCenter)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefCubeBeginRender(id, center);
+	ArrMaterials->mtlRefCubeBeginRender(id, pCenter);
 }
 
-SX_LIB_API void SML_MtlRefCubePreRender(ID id, int cube, float4x4* world)
+SX_LIB_API void SML_MtlRefCubePreRender(ID id, int iCube, const float4x4 *pWorld)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefCubePreRender(id, cube, world);
+	ArrMaterials->mtlRefCubePreRender(id, iCube, pWorld);
 }
 
-SX_LIB_API void SML_MtlRefCubePostRender(ID id, int cube)
+SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefCubePostRender(id, cube);
+	ArrMaterials->mtlRefCubePostRender(id, iCube);
 }
 
-SX_LIB_API void SML_MtlRefCubeEndRender(ID id, float3_t* viewpos)
+SX_LIB_API void SML_MtlRefCubeEndRender(ID id, const float3_t *pViewPos)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefCubeEndRender(id, viewpos);
+	ArrMaterials->mtlRefCubeEndRender(id, pViewPos);
 }
 
-SX_LIB_API bool SML_MtlRefUpdateCountUpdate(ID id, float3_t* viewpos)
+SX_LIB_API bool SML_MtlRefUpdateCountUpdate(ID id, const float3_t *pViewPos)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlRefUpdateCountUpdate(id, viewpos);
+	return ArrMaterials->mtlRefUpdateCountUpdate(id, pViewPos);
 }
 
 SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlRefNullingCountUpdate(id);
+	ArrMaterials->mtlRefNullingCountUpdate(id);
 }
 
 SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id)
 {
 	ML_PRECOND(0);
-	return ArrMaterials->RefCubeGetTex(id);
+	return ArrMaterials->refCubeGetTex(id);
 }
 
 //##########################################################################
 
-SX_LIB_API void SML_MtlReloadMaterial(ID id, const char* name)
+SX_LIB_API void SML_MtlReloadMaterial(ID id, const char *szName)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlReLoad(id, name);
+	ArrMaterials->mtlReLoad(id, szName);
 }
 
-SX_LIB_API void SML_MtlClear(bool clear_ref_del)
+SX_LIB_API void SML_MtlClear(bool isClearRefDel)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->Clear(clear_ref_del);
+	ArrMaterials->clear(isClearRefDel);
 }
 
-SX_LIB_API void SML_MtlSetTexture(ID id, const char* path_tex)
+SX_LIB_API void SML_MtlSetTexture(ID id, const char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetTexture(id, path_tex);
+	ArrMaterials->mtlSetTexture(id, szTexture);
 }
 
-SX_LIB_API void SML_MtlGetTexture(ID id, char* name)
+SX_LIB_API void SML_MtlGetTexture(ID id, char *szName)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetTexture(id, name);
+	ArrMaterials->mtlGetTexture(id, szName);
 }
 
 SX_LIB_API ID SML_MtlGetTextureID(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetTextureID(id);
+	return ArrMaterials->mtlGetTextureID(id);
 }
 
-SX_LIB_API void SML_MtlSetVS(ID id, const char* path_vs)
+SX_LIB_API void SML_MtlSetVS(ID id, const char *szPath)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetVS(id, path_vs);
+	ArrMaterials->mtlSetVS(id, szPath);
 }
 
-SX_LIB_API void SML_MtlGetVS(ID id, char* name)
+SX_LIB_API void SML_MtlGetVS(ID id, char *szName)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetVS(id, name);
+	ArrMaterials->mtlGetVS(id, szName);
 }
 
-SX_LIB_API void SML_MtlSetPS(ID id, const char* path_ps)
+SX_LIB_API void SML_MtlSetPS(ID id, const char *szPath)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetPS(id, path_ps);
+	ArrMaterials->mtlSetPS(id, szPath);
 }
 
-SX_LIB_API void SML_MtlGetPS(ID id, char* name)
+SX_LIB_API void SML_MtlGetPS(ID id, char *szName)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetPS(id, name);
+	ArrMaterials->mtlGetPS(id, szName);
 }
 
-SX_LIB_API float SML_MtlGetPenetration(ID id)
+SX_LIB_API float SML_MtlGetDurability(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetPenetration(id);
+	return ArrMaterials->mtlGetDurability(id);
 }
 
-SX_LIB_API void SML_MtlSetPenetration(ID id, float penetration)
+SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetPenetration(id, penetration);
+	ArrMaterials->mtlSetDurability(id, fDurability);
 }
 
 SX_LIB_API float SML_MtlGetHitChance(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetHitChance(id);
+	return ArrMaterials->mtlGetHitChance(id);
 }
 
 SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetHitChance(id, fHitChance);
+	ArrMaterials->mtlSetHitChance(id, fHitChance);
 }
 
 SX_LIB_API float SML_MtlGetDensity(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetDensity(id);
+	return ArrMaterials->mtlGetDensity(id);
 }
 
 SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetDensity(id, fDensity);
+	ArrMaterials->mtlSetDensity(id, fDensity);
 }
 
 //##########################################################################
 
-SX_LIB_API void SML_MtlSetLighting(ID id, bool is_lighting)
+SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetLighting(id, is_lighting);
+	ArrMaterials->mtlSetLighting(id, isLighting);
 }
 
 SX_LIB_API bool SML_MtlGetLighting(ID id)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetLighting(id);
+	return ArrMaterials->mtlGetLighting(id);
 }
 
-SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool is_tex_lighting)
+SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetIsTextureLighting(id, is_tex_lighting);
+	ArrMaterials->mtlSetIsTextureLighting(id, isTexLighting);
 }
 
 SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetIsTextureLighting(id);
+	return ArrMaterials->mtlGetIsTextureLighting(id);
 }
 
-SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char* path_tex)
+SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetTextureLighting(id, path_tex);
+	ArrMaterials->mtlSetTextureLighting(id, szTexture);
 }
 
-SX_LIB_API void SML_MtlGetTextureLighting(ID id, char* path_tex)
+SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetTextureLighting(id, path_tex);
+	ArrMaterials->mtlGetTextureLighting(id, szTexture);
 }
 
-SX_LIB_API void SML_MtlSetRoughness(ID id, float roughness)
+SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetRoughness(id, roughness);
+	ArrMaterials->mtlSetRoughness(id, fRoughness);
 }
 
 SX_LIB_API float SML_MtlGetRoughness(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetRoughness(id);
+	return ArrMaterials->mtlGetRoughness(id);
 }
 
-SX_LIB_API void SML_MtlSetThickness(ID id, float thickness)
+SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetThickness(id, thickness);
+	ArrMaterials->mtlSetThickness(id, fThickness);
 }
 
 SX_LIB_API float SML_MtlGetThickness(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetThickness(id);
+	return ArrMaterials->mtlGetThickness(id);
 }
 
-SX_LIB_API void SML_MtlSetF0(ID id, float f0)
+SX_LIB_API void SML_MtlSetF0(ID id, float fF0)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetF0(id, f0);
+	ArrMaterials->mtlSetF0(id, fF0);
 }
 
 SX_LIB_API float SML_MtlGetF0(ID id)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetF0(id);
+	return ArrMaterials->mtlGetF0(id);
 }
 
-SX_LIB_API void SML_MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type)
+SX_LIB_API void SML_MtlSetTransparency(ID id, bool isTransparent)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetTypeTransparency(id, type);
+	ArrMaterials->mtlSetTransparency(id, isTransparent);
 }
 
-SX_LIB_API MTLTYPE_TRANSPARENCY SML_MtlGetTypeTransparency(ID id)
+SX_LIB_API bool SML_MtlGetTransparency(ID id)
 {
-	ML_PRECOND(MTLTYPE_TRANSPARENCY_NONE);
-	return ArrMaterials->MtlGetTypeTransparency(id);
+	ML_PRECOND(false);
+	return ArrMaterials->mtlGetTransparency(id);
 }
 
 SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetTypeReflection(id, type);
+	ArrMaterials->mtlSetTypeReflection(id, type);
 }
 
 SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id)
 {
 	ML_PRECOND(MTLTYPE_REFLECT_NONE);
-	return ArrMaterials->MtlGetTypeReflection(id);
+	return ArrMaterials->mtlGetTypeReflection(id);
 }
 
 //**************************************************************************
 
-SX_LIB_API void SML_MtlSetMaskTex(ID id, const char* path_tex)
+SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetMaskTex(id, path_tex);
+	ArrMaterials->mtlSetMaskTex(id, szTexture);
 }
 
-SX_LIB_API void SML_MtlGetMaskTex(ID id, char* path_tex)
+SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetMaskTex(id, path_tex);
+	ArrMaterials->mtlGetMaskTex(id, szTexture);
 }
 
-SX_LIB_API void SML_MtlSetMRTex(ID id, int channel, const char* path_tex)
+SX_LIB_API void SML_MtlSetMRTex(ID id, int iChannel, const char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetMRTex(id, channel, path_tex);
+	ArrMaterials->mtlSetMRTex(id, iChannel, szTexture);
 }
 
-SX_LIB_API void SML_MtlGetMRTex(ID id, int channel, char* path_tex)
+SX_LIB_API void SML_MtlGetMRTex(ID id, int iChannel, char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetMRTex(id, channel, path_tex);
+	ArrMaterials->mtlGetMRTex(id, iChannel, szTexture);
 }
 
-SX_LIB_API void SML_MtlSetDTex(ID id, int channel, const char* path_tex)
+SX_LIB_API void SML_MtlSetDTex(ID id, int iChannel, const char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetDTex(id, channel, path_tex);
+	ArrMaterials->mtlSetDTex(id, iChannel, szTexture);
 }
 
-SX_LIB_API void SML_MtlGetDTex(ID id, int channel, char* path_tex)
+SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szTexture)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlGetDTex(id, channel, path_tex);
+	ArrMaterials->mtlGetDTex(id, iChannel, szTexture);
 }
 
-SX_LIB_API void SML_MtlSetSTDVS(ID id, MTL_SHADERSTD type, bool is_send)
+SX_LIB_API void SML_MtlSetStdVS(ID id, MTL_SHADERSTD type, bool isSend)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetSTDVS(id, type, is_send);
+	ArrMaterials->mtlSetStdVS(id, type, isSend);
 }
 
-SX_LIB_API bool SML_MtlGetSTDVS(ID id, MTL_SHADERSTD type)
+SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetSTDVS(id, type);
+	return ArrMaterials->mtlGetStdVS(id, type);
 }
 
-SX_LIB_API void SML_MtlSetSTDPS(ID id, MTL_SHADERSTD type, bool is_send)
+SX_LIB_API void SML_MtlSetStdPS(ID id, MTL_SHADERSTD type, bool isSend)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetSTDPS(id, type, is_send);
+	ArrMaterials->mtlSetStdPS(id, type, isSend);
 }
 
-SX_LIB_API bool SML_MtlGetSTDPS(ID id, MTL_SHADERSTD type)
+SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetSTDPS(id, type);
+	return ArrMaterials->mtlGetStdPS(id, type);
 }
 
 
-SX_LIB_API void SML_MtlSetUDVS(ID id, int component, float val)
+SX_LIB_API void SML_MtlSetUserDataVS(ID id, int iComponent, float fValue)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetUDVS(id, component, val);
+	ArrMaterials->mtlSetUserDataVS(id, iComponent, fValue);
 }
 
-SX_LIB_API float SML_MtlGetUDVS(ID id, int component)
+SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetUDVS(id, component);
+	return ArrMaterials->mtlGetUserDataVS(id, iComponent);
 }
 
-SX_LIB_API void SML_MtlSetUDVS_InPS(ID id, bool is_send_ps)
+SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPS)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetUDVS_InPS(id, is_send_ps);
+	ArrMaterials->mtlSetUserDataVS_InPS(id, isSendPS);
 }
 
-SX_LIB_API bool SML_MtlGetUDVS_InPS(ID id)
+SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetUDVS_InPS(id);
+	return ArrMaterials->mtlGetUserDataVS_InPS(id);
 }
 
-SX_LIB_API void SML_MtlSetUDPS(ID id, int component, float val)
+SX_LIB_API void SML_MtlSetUserDataPS(ID id, int iComponent, float fValue)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetUDPS(id, component, val);
+	ArrMaterials->mtlSetUserDataPS(id, iComponent, fValue);
 }
 
-SX_LIB_API float SML_MtlGetUDPS(ID id, int component)
+SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent)
 {
 	ML_PRECOND(-1);
-	return ArrMaterials->MtlGetUDPS(id, component);
+	return ArrMaterials->mtlGetUserDataPS(id, iComponent);
 }
 
-SX_LIB_API void SML_MtlSetUDPS_InVS(ID id, bool is_send_vs)
+SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVS)
 {
 	ML_PRECOND(_VOID);
-	ArrMaterials->MtlSetUDPS_InPS(id, is_send_vs);
+	ArrMaterials->mtlSetUserDataPS_InPS(id, isSendVS);
 }
 
-SX_LIB_API bool SML_MtlGetUDPS_InVS(ID id)
+SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id)
 {
 	ML_PRECOND(false);
-	return ArrMaterials->MtlGetUDPS_InPS(id);
+	return ArrMaterials->mtlGetUserDataPS_InPS(id);
 }
diff --git a/source/mtllight/sxmtllight.h b/source/mtllight/sxmtllight.h
index 6bb2102db..edd34cb0c 100644
--- a/source/mtllight/sxmtllight.h
+++ b/source/mtllight/sxmtllight.h
@@ -36,25 +36,30 @@ See the license in LICENSE
 /*! \name Базовые функции библиотеки
 @{*/
 
-SX_LIB_API long SML_0GetVersion();			//!< версия подсистемы
-SX_LIB_API void SML_Dbg_Set(report_func rf);//!< установить функцию обработки сообщений
+//! версия подсистемы
+SX_LIB_API long SML_0GetVersion();			
+
+//! установить функцию обработки сообщений
+SX_LIB_API void SML_Dbg_Set(report_func rf);
 
 //! инициализция подсистемы
 SX_LIB_API void SML_0Create(
-	const char* name,				//!< присваиваемое имя
-	bool is_unic = true				//!< должна ли подсистема быть уникальной по имени
+	const char *szName,				//!< присваиваемое имя
+	bool isUnic = true				//!< должна ли подсистема быть уникальной по имени
 	);
 
-SX_LIB_API void SML_AKill();	//!< уничтожить подсистему
+//! уничтожить подсистему
+SX_LIB_API void SML_AKill();	
 
 //!@}
 
 /*! \name Обработка потери/восстановления устройства
 @{*/
 
-SX_LIB_API void SML_OnLostDevice();	//!< вызывать при потрете устройства
+//! вызывать при потрете устройства
+SX_LIB_API void SML_OnLostDevice();	
 
-//! вызывать при восстановлении устройства, с передачей параметров области в которую рисуем
+//! вызывать при восстановлении устройства
 SX_LIB_API void SML_OnResetDevice();
 
 //!@}
@@ -75,16 +80,17 @@ SX_LIB_API void SML_Update(
 передав этот ключ #SML_LigthsGetIDOfKey, которая в случае успеха вернет идентификатор света.
 @{*/
 
-#define LIGHTS_UPDATE_MAX_COUNT_FOR_STATIC 3	/*!< максимальное количество обновлений статических источников света, в первый момент рендера */
+/*! максимальное количество обновлений статических источников света, в первый момент рендера */
+#define LIGHTS_UPDATE_MAX_COUNT_FOR_STATIC 3	
 
 /*! \name Дистанции (метрах) при которых будет сниженно или повышено количество отрисовок для локальных источников света
-меньше LIGHTS_UPDATE_L0_DIST - обновление будет каждый кадр\n
-больше LIGHTS_UPDATE_L2_DIST - обновления не будет
+меньше #LIGHTS_UPDATE_L0_DIST - обновление будет каждый кадр\n
+больше #LIGHTS_UPDATE_L2_DIST - обновления не будет
 @{*/
 
-#define LIGHTS_UPDATE_L0_DIST 10	/**/
-#define LIGHTS_UPDATE_L1_DIST 30	/**/
-#define LIGHTS_UPDATE_L2_DIST 70	/**/
+#define LIGHTS_UPDATE_L0_DIST 10	
+#define LIGHTS_UPDATE_L1_DIST 30	
+#define LIGHTS_UPDATE_L2_DIST 70	
 
 //!@}
 
@@ -94,125 +100,174 @@ Cчитается: LIGHTS_UPDATE_PSSM_SPLIT*number_split
 */
 #define LIGHTS_UPDATE_PSSM_SPLIT 1		
 
-#define LIGHTS_UPDATE_PSSM_SPLIT_5 2	/*!< аналогичнен #LIGHTS_UPDATE_PSSM_SPLIT только для 5 сплита (для теней от облаков) */
+/*! аналогичнен #LIGHTS_UPDATE_PSSM_SPLIT только для 5 сплита (для теней от облаков) */
+#define LIGHTS_UPDATE_PSSM_SPLIT_5 2	
+
+
+/*! стандартное значение верхнего/начального радиуса для направленного света  */
+#define LIGHTS_LOCAL_STD_TOP_RADIUS 0.1	
+
+/*! стандартное значение ближней плоскости отсечения для теней локального света  */
+#define LIGHTS_LOCAL_STD_NEAR 0.1		
+
+/*! максимальная дистанция локального света */
+#define LIGHTS_LOCAL_MAX_DIST 200.f		
 
-#define LIGHTS_LOCAL_STD_TOP_RADIUS 0.1	/*!< стандартное значение верхнего/начального радиуса для направленного света  */
-#define LIGHTS_LOCAL_STD_NEAR 0.1		/*!< стандартное значение ближней плоскости отсечения для теней локального света  */
 
-#define LIGHTS_LOCAL_MAX_DIST 200.f		/*!< максимальная дистанция локального света */
+/*! радиус глобального источника */
+#define LIGHTS_GLOBAL_STD_RADIUS 999999	
 
-#define LIGHTS_GLOBAL_STD_RADIUS 999999	/*!< радиус глобального источника */
-#define LIGHTS_POS_G_MAX 1000	/*!< отдаленность глобального света (нужно для корректности теней) */
+/*! отдаленность глобального света (нужно для корректности теней), если не знаете, не трогайте */
+#define LIGHTS_POS_G_MAX 1000	
+
+
+/*! базовое направление направленноого источника света */
+#define LIGHTS_DIR_BASE float3(0, -1, 0)
 
-#define LIGHTS_DIR_BASE float3(0, -1, 0) /*!< базовое направление направленноого источника света */
 
 //! типы источников света
 enum LTYPE_LIGHT
 {
-	LTYPE_LIGHT_NONE = -1,	//!< не установленный
-	LTYPE_LIGHT_GLOBAL,		//!< глобальный
-	LTYPE_LIGHT_POINT,		//!< точечный
-	LTYPE_LIGHT_DIR			//!< направленный
+	//! не установленный
+	LTYPE_LIGHT_NONE = -1,	
+
+	//! глобальный
+	LTYPE_LIGHT_GLOBAL,		
+
+	//! точечный
+	LTYPE_LIGHT_POINT,		
+
+	//! направленный
+	LTYPE_LIGHT_DIR			
 };
 
 //! типы теней источников света
 enum LTYPE_SHADOW
 {
-	LTYPE_SHADOW_NONE = -1,	//!< без теней
-	LTYPE_SHADOW_STATIC,	//!< статичные тени, тень обновляется первые несколько кадров (для корректности), далее не обновляется
-	LTYPE_SHADOW_DYNAMIC,	//!< полностью динамические тени
+	//! без теней
+	LTYPE_SHADOW_NONE = -1,	
+
+	//! статичные тени, тень обновляется первые несколько кадров (для корректности), далее не обновляется
+	LTYPE_SHADOW_STATIC,	
+
+	//! полностью динамические тени
+	LTYPE_SHADOW_DYNAMIC,	
 };
 
 /*! \name Настройки размеров для теней
- \note Коэфициента относительно размеров окна рендера
+ \note Коэфициента относительно размеров окна рендера, если 1.f то размеры экрана, если 0.5f то размеры экрана * 0.5f
 @{*/
-//{
-//
-SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float coef);	//!< установка коэфициента для локального света
-SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float coef);	//!< установка коэфициента для глобального света
 
-SX_LIB_API float SML_LigthsGettLCoefSizeDepth();	//!< возвращение коэфициента для локальный свет
-SX_LIB_API float SML_LigthsGettGCoefSizeDepth();	//!< возвращение коэфициента для глобальный свет
+//! установка коэфициента для локального света
+SX_LIB_API void SML_LigthsSettLCoefSizeDepth(float fCoef);	
+
+//! установка коэфициента для глобального света
+SX_LIB_API void SML_LigthsSettGCoefSizeDepth(float fCoef);	
+
+
+//! возвращение коэфициента для локальный свет
+SX_LIB_API float SML_LigthsGettLCoefSizeDepth();	
+
+//! возвращение коэфициента для глобальный свет
+SX_LIB_API float SML_LigthsGettGCoefSizeDepth();	
 
 //!@}
 
-SX_LIB_API void SML_LigthsClear();		//!< очистить список света
-SX_LIB_API void SML_LigthsClearIDArr();	//!< очистка всех идентификаторов просчетов во всех источниках света
-SX_LIB_API long SML_LigthsGetCount();	//!< общее количество света
+//! очистить список света
+SX_LIB_API void SML_LigthsClear();		
+
+//! очистка всех идентификаторов просчетов во всех источниках света
+SX_LIB_API void SML_LigthsClearIDArr();	
 
+//! общее количество света
+SX_LIB_API int SML_LigthsGetCount();	
+
+//! возвращает true если свет с id существует
 SX_LIB_API bool SML_LigthsGetExists(ID id);
 
 //! создать точечный свет (светит во все стороны)
 SX_LIB_API ID SML_LigthsCreatePoint(
-	const float3* center,	//!< центр света (мировая)
-	float dist,				//!< дистанция на которую распространяется свет
-	const float3* color,	//!< цвет в пределах 0-1
-	bool isglobal,			//!< глобальный ли свет (типа солнца)
-	bool is_shadowed		//!< отбрасвыает ли тени свет
+	const float3 *pCenter,	//!< центр света (мировая позиция)
+	float fDist,			//!< дистанция, на которую распространяется свет
+	const float3 *pColor,	//!< цвет в пределах 0-1
+	bool isGlobal,			//!< глобальный ли свет (типа солнца)
+	bool isShadowed			//!< отбрасвыает ли тени свет
 	);
 
 //! создать направленный свет
 SX_LIB_API ID SML_LigthsCreateDirection(
-	const float3* pos,			//!< позиция света (мировая)
-	float dist,					//!< дистанция на которую распространяется свет
-	const float3* color,		//!< цвет
-	const SMQuaternion* orient,	//!< ориентация
-	float top_radius,			//!< верхний (начальный) радиус
-	float angle,				//!< угол
-	bool is_shadow				//!< отбрасвыает ли тени свет
+	const float3 *pPos,			//!< позиция света (мировая)
+	float fDist,				//!< дистанция на которую распространяется свет
+	const float3 *pColor,		//!< цвет
+	const SMQuaternion *qOrient,//!< ориентация
+	float fTopRadius,			//!< верхний (начальный) радиус
+	float fAngle,				//!< угол (в радианах)
+	bool isShadow				//!< отбрасвыает ли тени свет
 	);
 
-SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id);	//!< возвращает тип света
+//! возвращает тип света
+SX_LIB_API LTYPE_LIGHT SML_LigthsGetType(ID id);	
+
+//! создать копию объекта и вернуть на нее id
+SX_LIB_API ID SML_LigthsCreateCopy(ID id);		
 
-SX_LIB_API ID SML_LigthsCreateCopy(ID id);		//!< создать копию объекта и вернуть на нее id
-SX_LIB_API void SML_LigthsDeleteLight(ID id);	//!< удаление света
+//! удаление света
+SX_LIB_API void SML_LigthsDeleteLight(ID id);	
 
-SX_LIB_API char* SML_LigthsGetName(ID id);					//!< возвращает имя света
-SX_LIB_API void SML_LigthsSetName(ID id, const char* name);	//!< устанавливает имя света
+//! возвращает имя света
+SX_LIB_API char* SML_LigthsGetName(ID id);					
 
-/*! отрисовка ограничивающего объема */
+//! устанавливает имя света
+SX_LIB_API void SML_LigthsSetName(ID id, const char *szName);	
+
+//! отрисовка ограничивающего объема 
 SX_LIB_API void SML_LigthsRender(ID id, DWORD timeDelta);
 
-SX_LIB_API void SML_LigthsGetColor(ID id, float3* color);		//!< в color записывает цвет света
-SX_LIB_API void SML_LigthsSetColor(ID id, const float3* color);	//!< устанавливает цвет света
+//! в color записывает цвет света
+SX_LIB_API void SML_LigthsGetColor(ID id, float3 *pColor);		
+
+//! устанавливает цвет света
+SX_LIB_API void SML_LigthsSetColor(ID id, const float3 *pColor);	
 
 //! получить в pos позицию света
 SX_LIB_API void SML_LigthsGetPos(
 	ID id,				//!< идентификатор света
-	float3* pos,		//!< инициализированный вектор в который будет записана позиция
-	bool greal = false	//!< true - нужны реальные координаты, false - нужны углы, только для глобального света, во всех остальных случаях не имеет смысла
+	float3 *pPos,		//!< инициализированный вектор в который будет записана позиция
+	bool isReal = false	//!< true - нужны реальные координаты, false - нужны углы, только для глобального света, во всех остальных случаях не имеет смысла
 	);
 
 //! установить позицию свету
 SX_LIB_API void SML_LigthsSetPos(
 	ID id,				//!< идентификатор света
-	const float3* pos,	//!< позиция в которую будет перемещен свет
-	bool greal = false	//!< true - установка реальных координат, false - установка углов, только для глобального света, во всех остальных случаях не имеет смысла
+	const float3 *pPos,	//!< позиция в которую будет перемещен свет
+	bool isReal = false	//!< true - установка реальных координат, false - установка углов, только для глобального света, во всех остальных случаях не имеет смысла
 	);
 
-SX_LIB_API float SML_LigthsGetPower(ID id);	//!< возвращает "значение силы света" для отправки в шейдер (максимальная компонента цвет * дистанция покрытия/LIGHTS_LOCAL_MAX_DIST)
+//! возвращает "значение силы света" для отправки в шейдер (максимальная компонента цвет * дистанция покрытия/#LIGHTS_LOCAL_MAX_DIST)
+SX_LIB_API float SML_LigthsGetPower(ID id);	
 
-SX_LIB_API float SML_LigthsGetDist(ID id);		//!< возвращает дистанцию на которую распространяется свет
+//! возвращает дистанцию, на которую распространяется свет
+SX_LIB_API float SML_LigthsGetDist(ID id);		
 
 //! установка новой дистанции
 SX_LIB_API void SML_LigthsSetDist(
 	ID id,					//!< идентификатор света
-	float dist,				//!< новая дистанция(радиус для точечного и высота для направленного)
-	bool is_create = true	//!< нужно ли пересоздание объема? (если новая дистанция больше чем текущий ограничивающий объем то надо, в других случаях по усмотрению)
+	float fDist,			//!< новая дистанция(радиус для точечного и высота для направленного)
+	bool isCreate = true	//!< нужно ли пересоздание объема? (если новая дистанция больше чем текущий ограничивающий объем то надо, в других случаях по усмотрению)
 	);
 
 //! записывает в q ориентацию света
-SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion* q);
+SX_LIB_API void SML_LigthsGetOrient(ID id, SMQuaternion *pQ);
 
 //! установка ориентации света
-SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion* q);
+SX_LIB_API void SML_LigthsSetOrient(ID id, const SMQuaternion *pQ);
 
 
 //! включен ли свет с идентификатором id
 SX_LIB_API bool SML_LigthsGetEnable(ID id);				
 
 //! установить всключен (true) или отключен (false) свет  с идентификатором id
-SX_LIB_API void SML_LigthsSetEnable(ID id, bool val);	
+SX_LIB_API void SML_LigthsSetEnable(ID id, bool isEnable);	
 
 //! возвращает идентификатор глобального источника света, если он есть, иначе -1
 SX_LIB_API ID SML_LigthsGetGlobal();					
@@ -230,13 +285,21 @@ SX_LIB_API void SML_LigthsSetCastGlobalShadow(bool isShadowed);
  \note Предварительный просчет - просчет для всего света (к примеру в другом потоке)
 @{*/
 
-SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum);	//!< виден ли свет в данном фрустуме frustum (отдельный просчет)
-SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pViewPos);				//!< дистанция от viewpos до начала света (отдельный просчет)
+//! виден ли свет в данном фрустуме (отдельный просчет)
+SX_LIB_API bool SML_LigthsComVisibleForFrustum(ID id, const IFrustum *pFrustum);	
+
+//! дистанция от viewpos до начала света (отдельный просчет)
+SX_LIB_API float SML_LigthsComDistFor(ID id, const float3 *pViewPos);				
 
 //! просчет видимости и расстояния от наблюдателя viewpos до начала света, для каждого света (предварительный просчет)
 SX_LIB_API void SML_LigthsComVisibleFrustumDistFor(const IFrustum *pFrustum, const float3 *pViewPos);
-SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id);	//!< виден ли свет в просчитанном фрустуме
-SX_LIB_API float SML_LigthsGetDistFor(ID id);			//!< просчитанная дистанция от позиции наблюдателя до начала света
+
+
+//! виден ли свет в просчитанном фрустуме
+SX_LIB_API bool SML_LigthsGetVisibleForFrustum(ID id);	
+
+//! просчитанная дистанция от позиции наблюдателя до начала света
+SX_LIB_API float SML_LigthsGetDistFor(ID id);			
 
 //!@}
 
@@ -244,13 +307,18 @@ SX_LIB_API float SML_LigthsGetDistFor(ID id);			//!< просчитанная д
 
 /*! \name Настройки для направленного света
 @{*/
-//угол для направленного источника
-SX_LIB_API float SML_LigthsGetAngle(ID id);				//!< возвращает угол, актуально только для направленного и света
-SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle);	//!< установить угол, актуально только для направленного и света
 
-//верхний радиус для направленного источника
-SX_LIB_API float SML_LigthsGetTopRadius(ID id);					//!< возвращает верхний радиус, актуально только для направленного и света
-SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius);//!< устанавливает верхний радиус, актуально только для направленного и света
+//! возвращает угол, актуально только для направленного и света
+SX_LIB_API float SML_LigthsGetAngle(ID id);				
+
+//! установить угол, актуально только для направленного и света
+SX_LIB_API void SML_LigthsSetAngle(ID id, float fAngle);	
+
+//! возвращает верхний радиус, актуально только для направленного и света
+SX_LIB_API float SML_LigthsGetTopRadius(ID id);					
+
+//! устанавливает верхний радиус, актуально только для направленного и света
+SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius);
 
 //!@}
 
@@ -265,7 +333,7 @@ SX_LIB_API void SML_LigthsSetTopRadius(ID id, float fTopRadius);//!< устан
 SX_LIB_API void SML_LigthsSetCubeEdgeEnable(
 	ID id,			//!< идентификатор света
 	int iEdge,		//!< номер стороны/грани cubemap [0,5]
-	bool iEnable		//!< true - рисовать, false - не рисовать
+	bool iEnable	//!< true - рисовать, false - не рисовать
 	);
 
 //! получить текущее значение "рисовать ли в указанную грань cubemap тени"
@@ -289,13 +357,17 @@ SX_LIB_API bool SML_LigthsGetCubeEdgeEnable(
   - для направленного света - обычная техника Shadow Mapping
 @{*/
 
-SX_LIB_API bool SML_LigthsGetShadowed(ID id);						//!< отбрасывает ли свет тени
+//! отбрасывает ли свет тени
+SX_LIB_API bool SML_LigthsGetShadowed(ID id);						
+
+//! возвращает true в случае если установлено 4 сплита для PSSM, иначе (установлено 3 сплита) false
+SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id);				
 
-SX_LIB_API bool SML_LigthsGet4Or3SplitsG(ID id);				//!< возвращает true В случае если установлено 4 сплита для PSSM, иначе (установлено 3 сплита) false
-SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3);	//!< установка количества сплитов (false - 3, true - 4) для PSSM
+//! установка количества сплитов (false - 3, true - 4) для PSSM
+SX_LIB_API void SML_LigthsSet4Or3SplitsG(ID id, bool is4or3);	
 
 /*! устанавливает шейдеры и передает им данные на основании типа материала, поддерживаются все типы MTL_TYPE_*/
-SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, float4x4 *pWorldMat);
+SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, const float4x4 *pWorld);
 
 /*! \name Управление обновлениями теней
  \note Так как основная задумка это real-time рендер то для этого нужны упрощения, одним из таковых является обновление теней от света, которое может происходить не каждый кадр
@@ -303,11 +375,12 @@ SX_LIB_API void SML_LigthsShadowSetShaderOfTypeMat(ID id, int typemat, float4x4
 
 //! установка динамики обработки теней
 SX_LIB_API void SML_LigthsSetTypeShadowed(
-	ID id,					//!< идентификатор света
-	LTYPE_SHADOW type	//!< значение из перечисления #LightsTypeShadow
+	ID id,				//!< идентификатор света
+	LTYPE_SHADOW type	//!< значение из перечисления #LTYPE_SHADOW
 	);
 
-SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id);	//!< возвращает тип динамики теней (одно из значений #LightsTypeShadow)
+//! возвращает тип динамики теней (одно из значений #LTYPE_SHADOW)
+SX_LIB_API LTYPE_SHADOW SML_LigthsGetTypeShadowed(ID id);	
 
 //! производит обработку данных затем возвращает разрешено ли обновлять тени, увеличивает внутрений счетчик, поэтому необходимо вызывать только когда надо
 SX_LIB_API bool SML_LigthsCountUpdateUpdate(
@@ -322,7 +395,8 @@ SX_LIB_API bool SML_LigthsCountUpdateAllowed(
 	int iHow = -1	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
 	);
 
-SX_LIB_API void SML_LigthsCountUpdateNull(ID id);	//!< сбросить счетчик обновлений и обновлять до предела тени
+//! сбросить счетчик обновлений и обновлять до предела тени
+SX_LIB_API void SML_LigthsCountUpdateNull(ID id);	
 
 //!@}
 
@@ -345,9 +419,11 @@ SX_LIB_API void SML_LigthsCountUpdateNull(ID id);	//!< сбросить счет
  Где cube для точечного это номер стороны cubemap [0-5] в которую будет осуществлен рендер, а для глобального это номер сплита.
 @{*/
 
-//
-SX_LIB_API void SML_LigthsShadowRenderBegin(ID id);	//!< подготовительные процедуры
-SX_LIB_API void SML_LigthsShadowRenderEnd(ID id);	//!< завершающие процедуры
+//! подготовительные процедуры
+SX_LIB_API void SML_LigthsShadowRenderBegin(ID id);	
+
+//! завершающие процедуры
+SX_LIB_API void SML_LigthsShadowRenderEnd(ID id);	
 
 //! подготовительные процедур перед рендером для сплита/стороны
 SX_LIB_API void SML_LigthsShadowRenderPre(
@@ -363,27 +439,32 @@ SX_LIB_API void SML_LigthsShadowRenderPost(
 
 //!@}
 
-SX_LIB_API void SML_LigthsShadowNull();			//!< обнуление карты теней, необходимо вызывать перед генерацией теней посредством функции #SML_LigthsGenShadow
-SX_LIB_API void SML_LigthsShadowGen(ID id);		//!< генерация тени на основе уже отработанной информации о затенении, перед вызовов этой функции необходимо вызывать #SML_LigthsNullingShadow
-SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow();//!< возвращает текстуру с тенями (если вызывались функции сглаживания) то вренутся сглаженная
+//! обнуление карты теней, необходимо вызывать перед генерацией теней посредством функции #SML_LigthsGenShadow
+SX_LIB_API void SML_LigthsShadowNull();			
+
+//! генерация тени на основе уже отработанной информации о затенении, перед вызовов этой функции необходимо вызывать #SML_LigthsShadowNull
+SX_LIB_API void SML_LigthsShadowGen(ID id);		
+
+//! возвращает текстуру с тенями (если вызывались функции сглаживания) то вренутся сглаженная
+SX_LIB_API IDirect3DTexture9* SML_LigthsGetShadow();
 
 //! сглаживание текущей тени
 SX_LIB_API void SML_LigthsShadowSoft(
 	bool isRandSam,			//!< использовать ли смещение по случайному направлению
 	float fSize,			//!< коэфициент увеличения размера пикселя для размытия
-	bool isFirst = false	//!< впервые ли вызывается размытие для текущей тени, каждый раз когда тень еще не сглажена но сгенерирована нужно указывать false
+	bool isFirst = false	//!< впервые ли вызывается размытие для текущей тени, каждый раз когда тень еще не сглажена, но сгенерирована, нужно указывать false
 	);
 
 //! возвращает указатель фрустума света
 SX_LIB_API IFrustum* SML_LigthsGetFrustum(
-	ID id,	//!< идентификатор света
+	ID id,		//!< идентификатор света
 	int iHow	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
 	);
 
 //! обновление фрустума глобального света
 SX_LIB_API void SML_LigthsUpdateGFrustums(
-	ID id,		//!< идентификатор света
-	int iSplit,	//!< номер сплита
+	ID id,				//!< идентификатор света
+	int iSplit,			//!< номер сплита
 	const float3 *pPos,	//!< позиция наблюдателя
 	const float3 *pDir	//!< направление взгляда наблюдателя
 	);
@@ -391,14 +472,25 @@ SX_LIB_API void SML_LigthsUpdateGFrustums(
 /*! \name Управление настройками для генерации глубины/тени
 @{*/
 
-SX_LIB_API float SML_LigthsGetShadowBias(ID id);				//!< получить текущее смещение (bias) при генерации глубины
-SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias);	//!< установить текущее смещение (bias) при генерации глубины
+//! получить текущее смещение (bias) при генерации глубины
+SX_LIB_API float SML_LigthsGetShadowBias(ID id);				
+
+//! установить текущее смещение (bias) при генерации глубины
+SX_LIB_API void SML_LigthsSetShadowBias(ID id, float fBias);	
 
-SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel);	//!< установить размерность размытия (в пикселя) при геренации тени
-SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id);						//!< получить текущее значение размерности (в пикселях) при генерации тени
 
-SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear);	//!< установить значение ближней плоскостью отсечения для теней (локальный свет)
-SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id);				//!< получить текущее значение ближней плоскостью отсечения для теней (локальный свет)
+//! установить размерность размытия (в пикселя) при геренации тени
+SX_LIB_API void SML_LigthsSetShadowBlurPixel(ID id, float fBlurPixel);	
+
+//! получить текущее значение размерности (в пикселях) при генерации тени
+SX_LIB_API float SML_LigthsGetShadowBlurPixel(ID id);						
+
+
+//! установить значение ближней плоскостью отсечения для теней (локальный свет)
+SX_LIB_API void SML_LigthsSetShadowLocalNear(ID id, float fNear);	
+
+//! получить текущее значение ближней плоскостью отсечения для теней (локальный свет)
+SX_LIB_API float SML_LigthsGetShadowLocalNear(ID id);				
 
 /*! установка дальней плоскостью отсечения для теней (локальный свет)
  \note Иногда возникают артефакты и если отрегулировать это значение то все становится на свои места, тесты показали что в основном при ошибках, увеличение этого значения решало проблемы
@@ -408,7 +500,8 @@ SX_LIB_API void SML_LigthsSetShadowLocalFar(
 	float fFar	//!< значение дальней плоскости отсечения (дальность видимости теней), обычно это значение = дальность света
 	);
 
-SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id);	//!< возвращает значение дальней плоскости отсечения (дальности видимости теней)
+//! возвращает значение дальней плоскости отсечения (дальности видимости теней)
+SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id);	
 
 //!@}
 
@@ -423,14 +516,14 @@ SX_LIB_API float SML_LigthsGetShadowLocalFar(ID id);	//!< возвращает 
 //! возвращает идентификатор в случае успеха, иначе <0
 SX_LIB_API ID SML_LigthsGetIDArr(
 	ID id,		//!< идентификатор света
-	ID inid,	//!< идентификатор объекта/системы вообще того что выдало идентификатор массива
-	int iHow		//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
+	ID idOwner,	//!< идентификатор объекта/системы вообще того что выдало идентификатор массива
+	int iHow	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
 	);
 
 //! установить идентификатор
 SX_LIB_API void SML_LigthsSetIDArr(
 	ID id,		//!< идентификатор света
-	ID inid,	//!< идентификатор объекта/системы вообще того что выдало идентификатор массива
+	ID idOwner,	//!< идентификатор объекта/системы вообще того что выдало идентификатор массива
 	int iHow,	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
 	ID idArr	//!< номер массива обработки от объекта который надо будет обрабатывать на видимость
 	);
@@ -453,14 +546,19 @@ SX_LIB_API void SML_LigthsToneMappingCom(
  \note Доступ к элементам массива удаленных объектов света осуществляется посредством порядкового номера в массиве (ключа key), то есть можно пройтись по массиву циклом.
 @{*/
 
-SX_LIB_API int SML_LigthsDelGetCount();						//!< возвращает количество удаленных объектов света которые требуют удаления
-SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID key);		//!< возвращает тип удаленного объекта света, значения из #LightsTypeLight
-SX_LIB_API void SML_LigthsDelDel(ID key);						//!< удаляет (окончательно) удаленный объект света
+//! возвращает количество удаленных объектов света которые требуют удаления
+SX_LIB_API int SML_LigthsDelGetCount();						
+
+//! возвращает тип удаленного объекта света, значения из #LightsTypeLight
+SX_LIB_API LTYPE_LIGHT SML_LigthsDelGetType(ID key);		
+
+//! удаляет (окончательно) удаленный объект света
+SX_LIB_API void SML_LigthsDelDel(ID key);						
 
 //! возвращает идентификатор, если был передан, иначе <0
 SX_LIB_API ID SML_LigthsDelGetIDArr(
-	ID key,	//!< порядковый номер объекта света в массиве удаленного света
-	ID inid,//!< идентификатор того что выдало идентификатор массива
+	ID key,		//!< порядковый номер объекта света в массиве удаленного света
+	ID idOwner,	//!< идентификатор того что выдало идентификатор массива
 	int iHow	//!< номер сплита для глобального, 0 для направленного, и номер стороны для точечного
 	);
 
@@ -477,23 +575,46 @@ SX_LIB_API ID SML_LigthsDelGetIDArr(
 //! типы render targets
 enum DS_RT
 {
-	DS_RT_COLOR = 0,		//!< цвет rgba8
-	DS_RT_NORMAL,			//!< нормали (включая микрорельеф) rfb10a2
-	DS_RT_PARAM,			//!< параметры освещения rgba8
-	DS_RT_DEPTH,			//!< глубина r16f, непрозрачные материалы
-	DS_RT_DEPTH0,			//!< глубина r16f, непрозрачные материалы
-	DS_RT_DEPTH1,			//!< глубина r16f, непрозрачные и полупрозрачные пиксели, однако прозрачные (если есть) будут перекрывать непрозрачные, и в этом случае их глубина будет 1 то есть максимальной(для идентификации)
-
-	DS_RT_AMBIENTDIFF,		//!< эмбиент цвет (цвет света rgb) и диффузное освещение (a) rgba16f
-	DS_RT_SPECULAR,			//!< блики r16f
-	DS_RT_SCENELIGHT,		//!< освещенная сцена rgba16
-	DS_RT_SCENELIGHT2,		//!< освещенная сцена rgba16
-
-	DS_RT_ADAPTEDLUM		//!< текущий rt адаптации глаза к освещению r16f
+	//! цвет rgba8
+	DS_RT_COLOR = 0,		
+
+	//! нормали (включая микрорельеф) rfb10a2
+	DS_RT_NORMAL,			
+
+	//! параметры освещения rgba8
+	DS_RT_PARAM,			
+
+	//! глубина r16f, непрозрачные материалы
+	DS_RT_DEPTH,			
+
+	//! глубина r16f, непрозрачные материалы
+	DS_RT_DEPTH0,			
+
+	//! глубина r16f, непрозрачные и полупрозрачные пиксели, однако прозрачные (если есть) будут перекрывать непрозрачные, и в этом случае их глубина будет 1 то есть максимальной(для идентификации)
+	DS_RT_DEPTH1,			
+
+
+	//! эмбиент цвет (цвет света rgb) и диффузное освещение (a) rgba16f
+	DS_RT_AMBIENTDIFF,		
+
+	//! блики r16f
+	DS_RT_SPECULAR,			
+
+	//! освещенная сцена rgba16
+	DS_RT_SCENELIGHT,		
+
+	//! освещенная сцена rgba16
+	DS_RT_SCENELIGHT2,		
+
+	//! текущий rt адаптации глаза к освещению r16f
+	DS_RT_ADAPTEDLUM		
 };
 
-SX_LIB_API ID SML_DSGetRT_ID(DS_RT type);				//!< id render target по его типу
-SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	//!< текстура render target по его типу
+//! id render target по его типу
+SX_LIB_API ID SML_DSGetRT_ID(DS_RT type);				
+
+//! текстура render target по его типу
+SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	
 
 //!@} sxmtllight_ds
 
@@ -503,19 +624,23 @@ SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	//!< текстура ren
  \ingroup sxmtllight
 @{*/
 
-#define MTL_MAX_SIZE_DIR SXGC_LOADTEX_MAX_SIZE_DIR		/*!< максимальная длина имени директории материала */
-#define MTL_MAX_SIZE_NAME SXGC_LOADTEX_MAX_SIZE_NAME	/*!< максимальная длина имени материала (без директории) */
+/*! максимальная длина имени директории материала */
+#define MTL_MAX_SIZE_DIR SXGC_LOADTEX_MAX_SIZE_DIR		
 
-#define MTL_REF_UPDATE_MAX_COUNT_FOR_STATIC 3	/*!< максимальное количество обновлений статических отражений, в первый момент рендера */
+/*! максимальная длина имени материала (без директории) */
+#define MTL_MAX_SIZE_NAME SXGC_LOADTEX_MAX_SIZE_NAME	
+
+/*! максимальное количество обновлений статических отражений, в первый момент рендера */
+#define MTL_REF_UPDATE_MAX_COUNT_FOR_STATIC 3	
 
 /*! \name Дистанции при которых будут сниженно или повышено количество отрисовок для отражений
-меньше MTL_REF_UPDATE_L0_DIST - обновление будет каждый кадр
-больше MTL_REF_UPDATE_L2_DIST - обновления не будет
+меньше #MTL_REF_UPDATE_L0_DIST - обновление будет каждый кадр
+больше #MTL_REF_UPDATE_L2_DIST - обновления не будет
 @{*/
 
-#define MTL_REF_UPDATE_L0_DIST 10	/**/
-#define MTL_REF_UPDATE_L1_DIST 30	/**/
-#define MTL_REF_UPDATE_L2_DIST 70	/**/
+#define MTL_REF_UPDATE_L0_DIST 10	
+#define MTL_REF_UPDATE_L1_DIST 30	
+#define MTL_REF_UPDATE_L2_DIST 70	
 
 //!@}
 
@@ -524,8 +649,11 @@ SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	//!< текстура ren
  \note функция альфа теста D3DCMP_GREATEREQUAL
 @{*/
 
-#define MTL_ALPHATEST_FREE_VALUE 64		/*!< значение свободного альфа теста (назначаемого материалом) */
-#define MTL_ALPHATEST_FORCEBLY_VALUE 8	/*!< значение принудительного альфа теста */
+/*! значение свободного альфа теста (назначаемого материалом) */
+#define MTL_ALPHATEST_FREE_VALUE 64		
+
+/*! значение принудительного альфа теста */
+#define MTL_ALPHATEST_FORCEBLY_VALUE 8	
 
 //!@}
 
@@ -547,9 +675,14 @@ SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	//!< текстура ren
 /*! \name Параметры отражений
 @{*/
 
-#define MTL_REF_TEX_SIZE 512	/*!< размер текстур с отражениями */
-#define MTl_REF_PROJ_NEAR 0.25	/*!< ближняя плоскость отсечения */
-#define MTl_REF_PROJ_FAR 100	/*!< дальняя плоскость отсечения, или дистанция на которую будет рендер всего в текстуру отражений */
+/*! размер текстур с отражениями */
+#define MTL_REF_TEX_SIZE 512	
+
+/*! ближняя плоскость отсечения */
+#define MTl_REF_PROJ_NEAR 0.25	
+
+/*! дальняя плоскость отсечения, или дистанция на которую будет рендер всего в текстуру отражений */
+#define MTl_REF_PROJ_FAR 100	
 
 //!@}
 
@@ -571,8 +704,11 @@ SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	//!< текстура ren
 Распределение регистров между текстурами которые будут отправляться для формирования данных
 @{*/
 
-#define MTL_TEX_R_MAIN		0	/*!< основная текстура */
-#define MTL_TEX_R_MASK		1	/*!< маска */
+/*!< основная текстура */
+#define MTL_TEX_R_MAIN		0	
+
+/*!< маска */
+#define MTL_TEX_R_MASK		1	
 
 /*! стартовый регистр для детальных текстур
  \warning 4 следующих (включая указанный) будует заполнены детальными текстурами, поэтому никакие другие текстуры в [MTL_TEX_R_DETAIL, MTL_TEX_R_DETAIL+3] не должны отправляться
@@ -586,36 +722,97 @@ SX_LIB_API IDirect3DTexture9* SML_DSGetRT(DS_RT type);	//!< текстура ren
 */
 #define MTL_TEX_R_MICRO		6
 
-#define MTL_TEX_R_PARAM_LIGHT	10	/*!< текстура с параметрами освещения */
-#define MTL_TEX_R_REFLECTION	12	/*!< текстура с отражениями */
-#define MTL_TEX_R_REFRACTION	13	/*!< текстура с преломлениями */
-#define MTL_TEX_R_CURR_DEPTH	14	/*!< текстура с текущей глубиной */
+
+/*! текстура с параметрами освещения */
+#define MTL_TEX_R_PARAM_LIGHT	10	
+
+/*! текстура с отражениями */
+#define MTL_TEX_R_REFLECTION	12	
+
+/*! текстура с преломлениями */
+#define MTL_TEX_R_REFRACTION	13	
+
+/*! текстура с текущей глубиной */
+#define MTL_TEX_R_CURR_DEPTH	14	
 
 //!@}
 
 //! типы отражений
 enum MTLTYPE_REFLECT
 {
-	MTLTYPE_REFLECT_NONE,			//!< нет отражения
-	MTLTYPE_REFLECT_PLANE,			//!< плоское
-	MTLTYPE_REFLECT_CUBE_DYNAMIC,	//!< объемное динамическое
-	MTLTYPE_REFLECT_CUBE_STATIC		//!< объемное статическое, обработка идет первые несколько кадров, затем не обновляется
+	//! нет отражения
+	MTLTYPE_REFLECT_NONE,			
+
+	//! плоское
+	MTLTYPE_REFLECT_PLANE,			
+
+	//! объемное динамическое
+	MTLTYPE_REFLECT_CUBE_DYNAMIC,	
+
+	//! объемное статическое, обработка идет первые несколько кадров, затем не обновляется
+	MTLTYPE_REFLECT_CUBE_STATIC		
 };
 
-//! типы прозрачности
-enum MTLTYPE_TRANSPARENCY
+//! сорт материала
+enum MTLSORT
 {
-	MTLTYPE_TRANSPARENCY_NONE,			//!< нет прозрачности
-	MTLTYPE_TRANSPARENCY_ALPHA_LIGHT,	//!< освещаяемая прозрачность
+	//! непрозрачный
+	MTLSORT_OPAQUE = 0x00000001,
+
+	//! прозрачный
+	MTLTYPE_TRANSPARENCY = 0x00000010,
+
+	//! непрозрачный
+	MTLSORT_LIGHTED = 0x00000100,
+
+	//! прозрачный
+	MTLTYPE_ULIT = 0x00001000,
+
+	//! непрозрачный освещаемый
+	/*MTLSORT_OPAQUE_LIGHTED,
+
+	//! непрозрачный не освещаемый
+	MTLSORT_OPAQUE_UNLIT,*/
+
+
+	//! полупрозрачный освещаемый
+	/*MTLTYPE_TRANSPARENCY_LIGHTED,	
+
+	//! полупрозрачный не освещаемый
+	MTLTYPE_TRANSPARENCY_UNLIT,*/
 };
 
+/*! \name Возможные слои
+@{*/
+
+//! непрозрачные неосвещаемые
+#define MTLTYPE_LAYER_OPAQUE_UNLIT		0.0f
+
+//! прозрачные неосвещаемые
+#define MTLTYPE_LAYER_TRANSPARENT_UNLIT	0.666667f
+
+//! непрозрачные освещаемые
+#define MTLTYPE_LAYER_OPAQUE_LIGHT		0.333333f
+
+//! прозрачные освещаемые
+#define MTLTYPE_LAYER_TRANSPARENT_LIGHT	1.0f
+
+//!@}
+
 //! тип модели материала
 enum MTLTYPE_MODEL
 {
-	MTLTYPE_MODEL_STATIC = 0,	//!< статическая геометрия
-	MTLTYPE_MODEL_GRASS,		//!< растительность трава
-	MTLTYPE_MODEL_TREE,		//!< растительность дерево
-	MTLTYPE_MODEL_SKIN,		//!< анимационная модель
+	//! статическая геометрия
+	MTLTYPE_MODEL_STATIC = 0,	
+
+	//! растительность трава
+	MTLTYPE_MODEL_GRASS,		
+
+	//! растительность дерево
+	MTLTYPE_MODEL_TREE,		
+
+	//! анимационная модель
+	MTLTYPE_MODEL_SKIN,		
 
 	//! значение по умолчанию
 	MTLTYPE_MODEL_DEFAULT = MTLTYPE_MODEL_STATIC
@@ -629,14 +826,29 @@ enum MTLTYPE_PHYSIC
 	//! значение по умолчанию
 	MTLTYPE_PHYSIC_DEFAULT = MTLTYPE_PHYSIC_CONCRETE,
 
-	MTLTYPE_PHYSIC_METAL,			//!< металл
-	MTLTYPE_PHYSIC_GLASS,			//!< стекло
-	MTLTYPE_PHYSIC_PLASTIC,			//!< пластик
-	MTLTYPE_PHYSIC_TREE,			//!< дерево
-	MTLTYPE_PHYSIC_FLESH,			//!< плоть
-	MTLTYPE_PHYSIC_GROUD_SAND,		//!< земля/песок
-	MTLTYPE_PHYSIC_WATER,			//!< вода
-	MTLTYPE_PHYSIC_LEAF_GRASS,		//!< листва/трава
+	//! металл
+	MTLTYPE_PHYSIC_METAL,			
+
+	//! стекло
+	MTLTYPE_PHYSIC_GLASS,			
+
+	//! пластик
+	MTLTYPE_PHYSIC_PLASTIC,			
+
+	//! дерево
+	MTLTYPE_PHYSIC_TREE,			
+
+	//! плоть
+	MTLTYPE_PHYSIC_FLESH,			
+
+	//! земля/песок
+	MTLTYPE_PHYSIC_GROUD_SAND,		
+
+	//! вода
+	MTLTYPE_PHYSIC_WATER,			
+
+	//! листва/трава
+	MTLTYPE_PHYSIC_LEAF_GRASS,		
 
 	//! количество типов
 	MPT_COUNT
@@ -645,16 +857,32 @@ enum MTLTYPE_PHYSIC
 //! данные отправляемые в шейдеры
 enum MTL_SHADERSTD
 {
-	MTL_SHADERSTD_MATRIX_WORLD = 0,		//!< мировая матрица (трансформации модели), world
-	MTL_SHADERSTD_MATRIX_VIEW,			//!< матрица вида, view
-	MTL_SHADERSTD_MATRIX_PROJECTION,	//!< матрица проекции, projection
-	MTL_SHADERSTD_MATRIX_WORLDVIEW,		//!< world * view
-	MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ,	//!< world * view * projection
-	MTL_SHADERSTD_CAMPOS,				//!< позиция камеры/наблюдателя
-	MTL_SHADERSTD_TIMEDELTA,			//!< данные о времени float2(CountTimeRender,TimeDelta)
-	MTL_SHADERSTD_WINSIZE,				//!< размеры окна рендера
-
-	MTL_SHADERSTD_USERDATA				//!< пользовательские данные (float4)
+	//! мировая матрица (трансформации модели), world
+	MTL_SHADERSTD_MATRIX_WORLD = 0,		
+
+	//! матрица вида, view
+	MTL_SHADERSTD_MATRIX_VIEW,			
+
+	//! матрица проекции, projection
+	MTL_SHADERSTD_MATRIX_PROJECTION,	
+
+	//! world * view
+	MTL_SHADERSTD_MATRIX_WORLDVIEW,		
+
+	//! world * view * projection
+	MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ,	
+
+	//! позиция камеры/наблюдателя
+	MTL_SHADERSTD_CAMPOS,				
+
+	//! данные о времени float2(CountTimeRender,TimeDelta)
+	MTL_SHADERSTD_TIMEDELTA,			
+
+	//! размеры окна рендера
+	MTL_SHADERSTD_WINSIZE,				
+
+	//! пользовательские данные (float4)
+	MTL_SHADERSTD_USERDATA				
 };
 
 /*! \name Загрузка/сохранение
@@ -667,7 +895,7 @@ enum MTL_SHADERSTD
  \note любой повторно загружаемый материал не загружается, а лишь дублирует обертку, со ссылкой на внутренности оберкти
  */
 SX_LIB_API ID SML_MtlLoad(
-	const char *szName,	//!< имя_материала.расширение
+	const char *szName,								//!< имя_материала.расширение
 	MTLTYPE_MODEL mtl_type = MTLTYPE_MODEL_STATIC	//!< тип модели материала на случай если материал не будет загружен/найден
 	);
 
@@ -692,8 +920,14 @@ SX_LIB_API void SML_MtlClear(
 	bool isClearRefDel	//!< очищать ли очередь удаления отражений, на тот случай если идентификаторы в отражениях больше не действительны
 	);	
 
-SX_LIB_API long SML_MtlGetCount();					//!< возвращает общее количество материалов
-SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id);	//!< возвращает тип модели материала по id
+//! возвращает общее количество материалов
+SX_LIB_API long SML_MtlGetCount();					
+
+//! возвращает тип модели материала по id
+SX_LIB_API MTLTYPE_MODEL SML_MtlGetTypeModel(ID id);
+
+//! возвращает сорт материала по id
+SX_LIB_API UINT SML_MtlGetSort(ID id);
 
 /*! установка типа модели материала по id
  \warning меняется только внутренний флаг (определение)!!! все остальное для данного типа надо загружать вручную, сделано для больших возможностей построения материалов
@@ -702,29 +936,33 @@ SX_LIB_API void SML_MtlSetTypeModel(ID id, MTLTYPE_MODEL type_model);
 
 //! установка параметров материала по id, вызывается перед DIP
 SX_LIB_API void SML_MtlRender(
-	ID id,			//!< идентификатор материала
-	float4x4* world	//!< указатель на мировую матрицу модели, либо 0 - тогда будет принята единичная матрица
+	ID id,					//!< идентификатор материала
+	const float4x4 *pWorld	//!< указатель на мировую матрицу модели, либо 0 - тогда будет принята единичная матрица
 	);
 
 //! стандартная отрисовка материала, используются стандартные шейдеры, нужно для теней, отражений и прочего
 SX_LIB_API void SML_MtlRenderStd(
 	MTLTYPE_MODEL type,			//!< тип материала из MtlTypeModel
-	float4x4 *pWorld,			//!< мировая матрица трансформации, либо 0 и будет применена единичная матрица
+	const float4x4 *pWorld,		//!< мировая матрица трансформации, либо 0 и будет применена единичная матрица
 	ID idSlot,					//!< текстурный слот в который установить текстуру
 	ID idMtl					//!< идентификатор материала из которого будет браться текстура
 	);
 
 //! установка параметров материала для рендера источника света
 SX_LIB_API void SML_MtlRenderLight(
-	float4_t *pColor,	//!< rgb - цвет, w зарезервирован 
-	float4x4 *pWorld		//!< аналогично #SML_MtlRender
+	const float4_t *pColor,	//!< rgb - цвет, w зарезервирован 
+	const float4x4 *pWorld	//!< аналогично #SML_MtlRender
 	);
 
-SX_LIB_API void SML_MtlSetMainTexture(ID idSlot, ID id);	//!< установить текстуру из материала id в текстурный слот slot
+//! установить текстуру из материала id в текстурный слот slot
+SX_LIB_API void SML_MtlSetMainTexture(ID idSlot, ID id);	
+
 
-//физический тип материала
-SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type);	//!< установка физического типа материала
-SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id);				//!< возвращает текущий тип физического материала
+//! установка физического типа материала
+SX_LIB_API void SML_MtlSetPhysicMaterial(ID id, MTLTYPE_PHYSIC type);	
+
+//! возвращает текущий тип физического материала
+SX_LIB_API MTLTYPE_PHYSIC SML_MtlGetPhysicMaterial(ID id);				
 
 //! возвращает id стандартного материала для определенной модели материалов указанной в #MtlTypeModel 
 SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model);
@@ -740,19 +978,29 @@ SX_LIB_API ID SML_MtlGetStdMtl(MTLTYPE_MODEL type_model);
 
 /*! установка инкремента идентификатора поверхностей
  \note К примеру для диференциации (разделения) пикселей при смешивании всех слоев изображения, 
-без разделения по принадлжености к определнной поверхности будет трудно (пока выхода нет) корректно смешать все слои
+без разделения по принадлжености к определнной поверхности будет трудно/невозможно (пока выхода нет) корректно смешать все слои
 */
 SX_LIB_API void SML_MtlSetIsIncrCountSurf(bool bf);
-SX_LIB_API bool SML_MtlGetIsIncrCountSurf();		//!< установлен ли инкремент поверхностей
-SX_LIB_API void SML_MtlNullingCurrCountSurf();		//!< обнуление идентификатора отрисованных поверхностей (к примеру при новом кадре)
-SX_LIB_API int SML_MtlGetCurrCountSurf();			//!< текущее количество отрисованных полупрозрачных поверхностей
-SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount);	//!< установить текущее количество отрисованных полупрозрачных поверхностей
+
+//! установлен ли инкремент поверхностей
+SX_LIB_API bool SML_MtlGetIsIncrCountSurf();		
+
+//! обнуление идентификатора отрисованных поверхностей (к примеру при новом кадре)
+SX_LIB_API void SML_MtlNullingCurrCountSurf();		
+
+//! текущее количество отрисованных полупрозрачных поверхностей
+SX_LIB_API int SML_MtlGetCurrCountSurf();			
+
+//! установить текущее количество отрисованных полупрозрачных поверхностей
+SX_LIB_API void SML_MtlSetCurrCountSurf(int iCount);	
 
 /*! принудительное включение альфа теста (isat - true - включить, false - выключить) при устновке параметров материала, 
 к примеру для рендера полупрозрачных поверхностей, чтобы отсечь (условно) полностью прозрачные пиксели
 */
 SX_LIB_API void SML_MtlSetForceblyAlphaTest(bool isEnable);	
-SX_LIB_API bool SML_MtlGetForceblyAlphaTest();			//!< включен ли принудительный альфа тест
+
+//! включен ли принудительный альфа тест
+SX_LIB_API bool SML_MtlGetForceblyAlphaTest();			
 
 //!@}
 
@@ -764,39 +1012,43 @@ SX_LIB_API bool SML_MtlGetForceblyAlphaTest();			//!< включен ли при
 @{*/
 //{{
 
-//! записать в отражения идентификатор (idarr) для определнной стороны куба/сплита (cube), соотнести его с идентификатором сущности (inid)
+//! записать в отражения идентификатор (idArr) для определнной стороны куба/сплита (iCube), соотнести его с идентификатором сущности (idOwner)
 SX_LIB_API void SML_MtlRefSetIDArr(
 	ID id,		//!< идентификатор материала
-	ID inid,	//!< идентификатор сущности для которой записываем (геометрия, растительность и прочее)
+	ID idOwner,	//!< идентификатор сущности для которой записываем (геометрия, растительность и прочее)
 	int iCube,	//!< условно - сторона куба/сплита для которой записываем 
 	ID idArr	//!< идентификатор который надо записать
 	);
 
-//! возвращает идентификатор который был записан для сущности (inid) для стороны куба/сплита (cube), если вообще записывался, если не записывался то <0
+//! возвращает идентификатор который был записан для сущности (idOwner) для стороны куба/сплита (iCube), если вообще записывался, если не записывался то <0
 SX_LIB_API ID SML_MtlRefGetIDArr(
 	ID id,		//!< идентификатор материала
-	ID inid,	//!< идентификатор сущности для которой было записывано (геометрия, растительность и прочее)
+	ID idOwner,	//!< идентификатор сущности для которой было записывано (геометрия, растительность и прочее)
 	int iCube	//!< условно - сторона куба/сплита для которой было записывано 
 	);
 
 /*! \name Управление удаленными отражениями
 @{*/
 
-SX_LIB_API int SML_MtlDelRefGetCount();	//!< возвращает количество удаленных материалов с отражениями
+//! возвращает количество удаленных материалов с отражениями
+SX_LIB_API int SML_MtlDelRefGetCount();	
+
 //! возвращает идентификатор который был записан для сущности (inid) для стороны куба/сплита (cube)
 SX_LIB_API ID SML_MtlDelRefGetIDArr(
-	ID key,		//!< порядковый номер удаленного материала с отражением
-	ID inid,	//!< идентификатор сущности для которой было записано (геометрия, растительность и прочее)
+	ID idKey,	//!< порядковый номер удаленного материала с отражением
+	ID idOwner,	//!< идентификатор сущности для которой было записано (геометрия, растительность и прочее)
 	int iCube	//!< условно - сторона куба/сплита для которой было записывано
 	);
-SX_LIB_API void SML_MtlDelRefClear();	//!< очистка массива удаленных материалов с отражениями
+
+//! очистка массива удаленных материалов с отражениями
+SX_LIB_API void SML_MtlDelRefClear();	
 
 //!@}
 
 //! обработка статистики рендера для текущего матриала с отражением
 SX_LIB_API bool SML_MtlRefUpdateCountUpdate(
-	ID id,				//!< идентификатора материала
-	float3_t *pViewPos	//!< позиция наблюдателя, viewpos == 0 вернет false
+	ID id,						//!< идентификатора материала
+	const float3_t *pViewPos	//!< позиция наблюдателя, viewpos == 0 вернет false
 	);
 
 /*! обнуление статистикки рендера для данного материала с отражением, 
@@ -804,7 +1056,8 @@ SX_LIB_API bool SML_MtlRefUpdateCountUpdate(
 */
 SX_LIB_API void SML_MtlRefNullingCountUpdate(ID id);
 
-SX_LIB_API void SML_MtlRefSetMinMax(ID id, float3_t *pMin, float3_t *pMax);//!< установка экстремумов материала
+//! установка экстремумов материала
+SX_LIB_API void SML_MtlRefSetMinMax(ID id, const float3_t *pMin, const float3_t *pMax);
 
 //! возвращает фрустум отражения, cube - сторона куба
 SX_LIB_API const IFrustum* SML_MtlRefGetfrustum(
@@ -829,9 +1082,12 @@ SX_LIB_API void SML_MtlRefPreRenderPlane(
 	ID id,				//!< идентификатор материала
 	D3DXPLANE *pPlane	//!< плоскость относительно которой будет считаться отражение
 	);	
-//между этими функциями необходимо помещать код рендера всего того что необходимо поместить в текстуру отражений
-SX_LIB_API void SML_MtlRefPostRenderPlane(ID id);			//!< завершающие операции
-SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id);	//!< возвращает текстуру с плоским отражением (если оно есть, иначе 0)
+
+//! завершающие операции
+SX_LIB_API void SML_MtlRefPostRenderPlane(ID id);			
+
+//! возвращает текстуру с плоским отражением (если оно есть, иначе 0)
+SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id);	
 
 //!@}
 
@@ -848,30 +1104,31 @@ SX_LIB_API IDirect3DTexture9* SML_MtlRefGetTexPlane(ID id);	//!< возвращ
 
 //! установка общих настроек
 SX_LIB_API void SML_MtlRefCubeBeginRender(
-	ID id,				//!< идентификатор материала
-	float3_t *pCenter	//!< центр (позиция) подгруппы модели - откуда будет рендер отражений
+	ID id,					//!< идентификатор материала
+	const float3_t *pCenter	//!< центр (позиция) подгруппы модели - откуда будет рендер отражений
 	);	
 
 //! установка частных настроек для стороны куба (cube)
 SX_LIB_API void SML_MtlRefCubePreRender(
-	ID id,			//!< идентификатор материала
-	int iCube,		//!< сторона куба [0,5]
-	float4x4 *pWorld//!< мировая матрица модели 
+	ID id,					//!< идентификатор материала
+	int iCube,				//!< сторона куба [0,5]
+	const float4x4 *pWorld	//!< мировая матрица модели 
 	);
 
-//между этим набором функций (Begin-pre ... post-End) необходимо помещать код рендера всего того что необходимо поместить в текстуру отражений
-SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube);	//!< завершающие частные моменты для стороны куба
+//! завершающие частные моменты для стороны куба
+SX_LIB_API void SML_MtlRefCubePostRender(ID id, int iCube);	
 
 /*! завершающие общие моменты
  \note если viewpos == 0 обновления статисктики рендера для текущего материала с отражением не произойдет, 
 и дабы рационально обрабатывать и статические и динамические отражения необходимо до следующего рендера отражений вызвать SML_MtlRefUpdateCountUpdate
 */
 SX_LIB_API void SML_MtlRefCubeEndRender(
-	ID id,				//!< идентификатор материала
-	float3_t *pViewPos	//!< позиция наблюдателя, необходимо для обработки разрешения на следующий рендер
+	ID id,						//!< идентификатор материала
+	const float3_t *pViewPos	//!< позиция наблюдателя, необходимо для обработки разрешения на следующий рендер
 	);	
 
-SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id);	//!< возвращает cube текстуру отражением (если оно есть, иначе 0)
+//! возвращает cube текстуру отражением (если оно есть, иначе 0)
+SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id);	
 
 //!@}
 
@@ -882,10 +1139,14 @@ SX_LIB_API IDirect3DCubeTexture9* SML_MtlRefCubeGetTex(ID id);	//!< возвра
  \ingroup sxmtllight_mtl
 @{*/
 
-//основная текстура которая накладывается на модель/подгруппу
-SX_LIB_API void SML_MtlSetTexture(ID id, const char *szPathTex);	//!< установка основной текстуры (загрузка текстуры по имени)
-SX_LIB_API void SML_MtlGetTexture(ID id, char *szName);			//!< в name записывает имя текстуры
-SX_LIB_API ID SML_MtlGetTextureID(ID id);						//!< возвращает id текстуры материала
+//! установка основной текстуры (загрузка текстуры по имени)
+SX_LIB_API void SML_MtlSetTexture(ID id, const char *szPathTex);	
+
+//! в name записывает имя текстуры
+SX_LIB_API void SML_MtlGetTexture(ID id, char *szName);			
+
+//! возвращает id текстуры материала
+SX_LIB_API ID SML_MtlGetTextureID(ID id);						
 
 
 /*! \name Шейдеры для рендера материала
@@ -894,31 +1155,54 @@ SX_LIB_API ID SML_MtlGetTextureID(ID id);						//!< возвращает id те
  \note В аргументах path_vs/path_ps указывается только имя шейдера с расширением, есесно возвращается тоже самое
 @{*/
 
-SX_LIB_API void SML_MtlSetVS(ID id, const char *szPathVS);	//!< установка вершинного шейдера
-SX_LIB_API void SML_MtlGetVS(ID id, char *szName);			//!< в name записывает имя текущего вершинного шейдера
-SX_LIB_API void SML_MtlSetPS(ID id, const char *szPathPS);	//!< установка пиксельного шейдера
-SX_LIB_API void SML_MtlGetPS(ID id, char *szName);			//!< в name записывает имя текущего пикельного шейдера
+//! установка вершинного шейдера
+SX_LIB_API void SML_MtlSetVS(ID id, const char *szPathVS);	
+
+//! в name записывает имя текущего вершинного шейдера
+SX_LIB_API void SML_MtlGetVS(ID id, char *szName);			
+
+//! установка пиксельного шейдера
+SX_LIB_API void SML_MtlSetPS(ID id, const char *szPathPS);	
+
+//! в name записывает имя текущего пикельного шейдера
+SX_LIB_API void SML_MtlGetPS(ID id, char *szName);			
 
 //!@}
 
-SX_LIB_API float SML_MtlGetPenetration(ID id);
-SX_LIB_API void SML_MtlSetPenetration(ID id, float fPenetration);
+//! возвращает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить
+SX_LIB_API float SML_MtlGetDurability(ID id);
+
+//! устанавливает коэффициент пробиваемости [0, ], чем больше тем сложнее пробить
+SX_LIB_API void SML_MtlSetDurability(ID id, float fDurability);
 
+
+//! возвращает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется]
 SX_LIB_API float SML_MtlGetHitChance(ID id);
+
+//! устанавливает шанс пробиваемости [0 - пуля летит насквозь, 1 - пуля ударяется]
 SX_LIB_API void SML_MtlSetHitChance(ID id, float fHitChance);
 
+
+//! возвращает плотность материала кг/м3
 SX_LIB_API float SML_MtlGetDensity(ID id);
+
+//! устанавливает плотность материала кг/м3
 SX_LIB_API void SML_MtlSetDensity(ID id, float fDensity);
 
-//использование альфа теста для материала
-SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id);				//!< используется ли альфа тест для материала
-SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing);	//!< установка использования альфа теста
+
+//! используется ли альфа тест для материала
+SX_LIB_API bool SML_MtlGetUsingAlphaTest(ID id);				
+
+//! установка использования альфа теста
+SX_LIB_API void SML_MtlSetUsingAlphaTest(ID id, bool isUsing);	
 
 /*! освещение материала id
  \note если материал не освещается то будет выведен в цвете накладываемым материалом
 */
 SX_LIB_API void SML_MtlSetLighting(ID id, bool isLighting);	
-SX_LIB_API bool SML_MtlGetLighting(ID id);	//!< освещается ли материал
+
+//! освещается ли материал
+SX_LIB_API bool SML_MtlGetLighting(ID id);	
 
 /*! \name Параметры освещения.
  \note Для более точной/тонкой настройки освещения материала рекомендуется использовать текстуру с параметрами освещения 
@@ -928,37 +1212,59 @@ SX_LIB_API bool SML_MtlGetLighting(ID id);	//!< освещается ли мат
 
 //! установка использования текстуры с параметрами освещения
 SX_LIB_API void SML_MtlSetIsTextureLighting(ID id, bool isTexLighting);
-SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id);	//!< используется ли текстура с параметрами для освещения
 
-SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szPathTex);	//!< загрузка текстуры с парамтерами освещения
-SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szPathTex);		//!< в path_tex записывает имя текстуры с параметрами освещения
+//! используется ли текстура с параметрами для освещения
+SX_LIB_API bool SML_MtlGetIsTextureLighting(ID id);	
+
+
+//! загрузка текстуры с парамтерами освещения
+SX_LIB_API void SML_MtlSetTextureLighting(ID id, const char *szPathTex);	
+
+//! в path_tex записывает имя текстуры с параметрами освещения
+SX_LIB_API void SML_MtlGetTextureLighting(ID id, char *szPathTex);		
+
 
-SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness);	//!< установка шероховатости (0-1)
-SX_LIB_API float SML_MtlGetRoughness(ID id);					//!< возвращает текущее значение шероховатости поверхности
+//! установка шероховатости (0-1)
+SX_LIB_API void SML_MtlSetRoughness(ID id, float fRoughness);	
 
-SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness);	//!< установка толщины (0-1)
-SX_LIB_API float SML_MtlGetThickness(ID id);					//!< возвращает текущее значение толщины
+//! возвращает текущее значение шероховатости поверхности
+SX_LIB_API float SML_MtlGetRoughness(ID id);					
 
-//f0 - отражательная способность поверхности (0-1)
-SX_LIB_API void SML_MtlSetF0(ID id, float fF0);	//!< установка отражательной способности поверхности (0-1)
-SX_LIB_API float SML_MtlGetF0(ID id);			//!< возвращает текущее значение отражательной способности поверхности
+
+//! установка просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение
+SX_LIB_API void SML_MtlSetThickness(ID id, float fThickness);	
+
+//! возвращает просвечиваемости (толщины для графики (0, 1)), 0 - не принимает затенение, 1 - полностью принимает затенение
+SX_LIB_API float SML_MtlGetThickness(ID id);					
+
+//! установка отражательной способности поверхности (0-1)
+SX_LIB_API void SML_MtlSetF0(ID id, float fF0);	
+
+//! возвращает текущее значение отражательной способности поверхности
+SX_LIB_API float SML_MtlGetF0(ID id);			
 
 //!@}
 
-/*! \name Полупрозрачность, типы из #MtlTypeTransparency
-Под полупрозрачными материалами следует понимать такие материалы, прозрачность которых в среднем находится в пределах 0.5 и минимальный процент полупрозрачного периметра 50%
+/*! \name Полупрозрачность
+Под полупрозрачными материалами следует понимать такие материалы, прозрачность которых в среднем находится в пределах [0.5, 1) и минимальный процент полупрозрачного периметра 50%
 @{*/
 
-SX_LIB_API void SML_MtlSetTypeTransparency(ID id, MTLTYPE_TRANSPARENCY type);	//!< установка типа полупрозрачности
-SX_LIB_API MTLTYPE_TRANSPARENCY SML_MtlGetTypeTransparency(ID id);				//!< возвращает текущий тип полупрозрачности для материала
+//! установка свойства полупрозрачности
+SX_LIB_API void SML_MtlSetTransparency(ID id, bool isTransparent);
+
+//! возвращает текущее значение свойства полупрозрачности для материала
+SX_LIB_API bool SML_MtlGetTransparency(ID id);				
 
 //!@}
 
 /*! \name Отражения окружения, типы из #MtlTypeReflect
 @{*/
 
-SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type);	//!< установка типа отражений
-SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id);				//!< возвращает текущий тип отражений для материала
+//! установка типа отражений
+SX_LIB_API void SML_MtlSetTypeReflection(ID id, MTLTYPE_REFLECT type);	
+
+//! возвращает текущий тип отражений для материала
+SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id);				
 
 //!@}
 
@@ -970,9 +1276,11 @@ SX_LIB_API MTLTYPE_REFLECT SML_MtlGetTypeReflection(ID id);				//!< возвра
  \note В аргументах channel - RGBA - 0,1,2,3
 @{*/
 
-//маска наложения
-SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szPathTex);	//!< загрузка маски наложения
-SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szPathTex);		//!< в path_tex записывает текущее имя маски наложения
+//! загрузка маски наложения
+SX_LIB_API void SML_MtlSetMaskTex(ID id, const char *szPathTex);	
+
+//! в path_tex записывает текущее имя маски наложения
+SX_LIB_API void SML_MtlGetMaskTex(ID id, char *szPathTex);		
 
 //! загрузка текстуры микрорельефа, на каждый канал
 SX_LIB_API void SML_MtlSetMRTex(
@@ -1000,24 +1308,24 @@ SX_LIB_API void SML_MtlGetDTex(ID id, int iChannel, char *szPathTex);
 @{*/
 
 //! отправка стадартных данных в вершинный шейдер
-SX_LIB_API void SML_MtlSetSTDVS(
+SX_LIB_API void SML_MtlSetStdVS(
 	ID id,				//!< идентификатор материала
 	MTL_SHADERSTD type,	//!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd
-	bool isSend		//!< true - отправлять, false - не отправлять
+	bool isSend			//!< true - отправлять, false - не отправлять
 	);
 
 //! установлена ли отпрвка значения type в вершинный шейдер
-SX_LIB_API bool SML_MtlGetSTDVS(ID id, MTL_SHADERSTD type);
+SX_LIB_API bool SML_MtlGetStdVS(ID id, MTL_SHADERSTD type);
 
 //! отправка стадартных данных в пиксельный шейдер
-SX_LIB_API void SML_MtlSetSTDPS(
+SX_LIB_API void SML_MtlSetStdPS(
 	ID id,				//!< идентификатор материала
 	MTL_SHADERSTD type,	//!< тип значения которое нужно отправить, одно из значений #MtlTransShaderStd
-	bool isSend		//!< true - отправлять, false - не отправлять
+	bool isSend			//!< true - отправлять, false - не отправлять
 	);
 
 //! установлена ли отпрвка значения type в пиксельный шейдер
-SX_LIB_API bool SML_MtlGetSTDPS(ID id, MTL_SHADERSTD type);
+SX_LIB_API bool SML_MtlGetStdPS(ID id, MTL_SHADERSTD type);
 
 //!@}
 
@@ -1030,33 +1338,37 @@ SX_LIB_API bool SML_MtlGetSTDPS(ID id, MTL_SHADERSTD type);
 @{*/
 
 //! установка значения компоненты вектора для вершинного шейдера
-SX_LIB_API void SML_MtlSetUDVS(
+SX_LIB_API void SML_MtlSetUserDataVS(
 	ID id,			//!< идентификатор материала
 	int iComponent,	//!< компонента вектора xyzw - 0,1,2,3
 	float fValue	//!< значение компоненты
 	);
 
 //! возвращает значение компоненты вектора, который отправляется в вершинный шейдер
-SX_LIB_API float SML_MtlGetUDVS(ID id, int iComponent);
+SX_LIB_API float SML_MtlGetUserDataVS(ID id, int iComponent);
 
 //! установка отправки float4 вектора, предназначенного для вершинного шейдера, в пиксельный шейдер
-SX_LIB_API void SML_MtlSetUDVS_InPS(ID id, bool isSendPs);
-SX_LIB_API bool SML_MtlGetUDVS_InPS(ID id);	//!< отправляется ли float4 вектор, предназначенный для вершинного шейдера, в пиксельный шейдер
+SX_LIB_API void SML_MtlSetUserDataVS_InPS(ID id, bool isSendPs);
+
+//! отправляется ли float4 вектор, предназначенный для вершинного шейдера, в пиксельный шейдер
+SX_LIB_API bool SML_MtlGetUserDataVS_InPS(ID id);
 
 
 //! установка значения компоненты вектора для пиксельного шейдера
-SX_LIB_API void SML_MtlSetUDPS(
+SX_LIB_API void SML_MtlSetUserDataPS(
 	ID id,			//!< идентификатор материала
 	int iComponent,	//!< компонента вектора xyzw - 0,1,2,3
 	float fValue	//!< значение компоненты
 	);
 
 //! возвращает значение компоненты вектора, который отправляется в пиксельный шейдер
-SX_LIB_API float SML_MtlGetUDPS(ID id, int iComponent);
+SX_LIB_API float SML_MtlGetUserDataPS(ID id, int iComponent);
 
 //! установка отправки float4 вектора, предназначенного для пиксельного шейдера, в вершинный шейдер
-SX_LIB_API void SML_MtlSetUDPS_InVS(ID id, bool isSendVs);
-SX_LIB_API bool SML_MtlGetUDPS_InVS(ID id);	//!< отправляется ли float4 вектор, предназначенный для пиксельного шейдера, в вершинный шейдер
+SX_LIB_API void SML_MtlSetUserDataPS_InVS(ID id, bool isSendVs);
+
+//! отправляется ли float4 вектор, предназначенный для пиксельного шейдера, в вершинный шейдер
+SX_LIB_API bool SML_MtlGetUserDataPS_InVS(ID id);
 
 //!@}
 
diff --git a/source/particles/effect.cpp b/source/particles/effect.cpp
index 1e9124257..d623cfc7e 100644
--- a/source/particles/effect.cpp
+++ b/source/particles/effect.cpp
@@ -73,7 +73,7 @@ void Effects::Effect::NullingInit()
 	Original = true;
 }
 
-void Effects::OnLostDevice()
+void Effects::onLostDevice()
 {
 	for (int i = 0; i < ArrID.size(); ++i)
 	{
@@ -82,13 +82,13 @@ void Effects::OnLostDevice()
 			for (int k = 0; k < ArrID[i]->Arr.size(); ++k)
 			{
 				if (ArrID[i]->Arr[k])
-					ArrID[i]->Arr[k]->OnLostDevice();
+					ArrID[i]->Arr[k]->onLostDevice();
 			}
 		}
 	}
 }
 
-void Effects::OnResetDevice()
+void Effects::onResetDevice()
 {
 	for (int i = 0; i < ArrID.size(); ++i)
 	{
@@ -97,13 +97,13 @@ void Effects::OnResetDevice()
 			for (int k = 0; k < ArrID[i]->Arr.size(); ++k)
 			{
 				if (ArrID[i]->Arr[k])
-					ArrID[i]->Arr[k]->OnResetDevice();
+					ArrID[i]->Arr[k]->onResetDevice();
 			}
 		}
 	}
 }
 
-void Effects::Clear()
+void Effects::clear()
 {
 	for (int i = 0; i < ArrKey.size(); ++i)
 	{
@@ -121,7 +121,7 @@ void Effects::Clear()
 	Pools.clear();
 }
 
-void Effects::Save(const char* path)
+void Effects::save(const char* path)
 {
 	FILE* file = 0;
 	file = fopen(path, "w");
@@ -132,7 +132,7 @@ void Effects::Save(const char* path)
 		return;
 	}
 
-	int eff_count = EffectCountGet();
+	int eff_count = effectGetCount();
 
 	fprintf(file, "[effects]\n");
 	fprintf(file, "count = %d\n\n", eff_count);
@@ -149,151 +149,151 @@ void Effects::Save(const char* path)
 		{
 			Emitter* part = ArrKey[i]->Arr[k];
 			char tmpname[CONFIG_SECTION_MAX_LEN];
-			part->NameGet(tmpname);
+			part->getName(tmpname);
 			char tmptex[SXGC_LOADTEX_MAX_SIZE_DIRNAME];
 			tmptex[0] = 0;
 
-			if (part->TextureGetID() >= 0)
-				SGCore_LoadTexGetName(part->TextureGetID(), tmptex);
+			if (part->getTextureID() >= 0)
+				SGCore_LoadTexGetName(part->getTextureID(), tmptex);
 
 			fprintf(file, "[effect_%d_emitter_%d]\n", i, k);
 			fprintf(file, "name = %s\n", tmpname);
-			fprintf(file, "count = %d\n", part->CountGet());
+			fprintf(file, "count = %d\n", part->getCount());
 
 			if (tmptex[0] != 0)
 				fprintf(file, "texture = %s\n", tmptex);
 
-			if (part->TextureTrackGetID() >= 0)
-				SGCore_LoadTexGetName(part->TextureTrackGetID(), tmptex);
+			if (part->getTextureTrackID() >= 0)
+				SGCore_LoadTexGetName(part->getTextureTrackID(), tmptex);
 
 			if (tmptex[0] != 0)
 				fprintf(file, "texture_track = %s\n", tmptex);
 
-			fprintf(file, "Track = %d\n", part->GetData()->Track);
-			fprintf(file, "TrackSize = %f\n", part->GetData()->TrackSize);
-			fprintf(file, "TrackTime = %d\n", part->GetData()->TrackTime);
+			fprintf(file, "Track = %d\n", part->getData()->Track);
+			fprintf(file, "TrackSize = %f\n", part->getData()->TrackSize);
+			fprintf(file, "TrackTime = %d\n", part->getData()->TrackTime);
 
-			fprintf(file, "BoundType = %d\n", part->GetData()->BoundType);
+			fprintf(file, "BoundType = %d\n", part->getData()->BoundType);
 
-			fprintf(file, "BoundVec1X = %f\n", part->GetData()->BoundVec1.x);
-			fprintf(file, "BoundVec1Y = %f\n", part->GetData()->BoundVec1.y);
-			fprintf(file, "BoundVec1Z = %f\n", part->GetData()->BoundVec1.z);
-			fprintf(file, "BoundVec1W = %f\n", part->GetData()->BoundVec1.w);
+			fprintf(file, "BoundVec1X = %f\n", part->getData()->BoundVec1.x);
+			fprintf(file, "BoundVec1Y = %f\n", part->getData()->BoundVec1.y);
+			fprintf(file, "BoundVec1Z = %f\n", part->getData()->BoundVec1.z);
+			fprintf(file, "BoundVec1W = %f\n", part->getData()->BoundVec1.w);
 
-			fprintf(file, "BoundVec2X = %f\n", part->GetData()->BoundVec2.x);
-			fprintf(file, "BoundVec2Y = %f\n", part->GetData()->BoundVec2.y);
-			fprintf(file, "BoundVec2Z = %f\n", part->GetData()->BoundVec2.z);
-			fprintf(file, "BoundVec2W = %f\n", part->GetData()->BoundVec2.w);
+			fprintf(file, "BoundVec2X = %f\n", part->getData()->BoundVec2.x);
+			fprintf(file, "BoundVec2Y = %f\n", part->getData()->BoundVec2.y);
+			fprintf(file, "BoundVec2Z = %f\n", part->getData()->BoundVec2.z);
+			fprintf(file, "BoundVec2W = %f\n", part->getData()->BoundVec2.w);
 
 
-			fprintf(file, "SpawnPosType = %d\n", part->GetData()->SpawnPosType);
-			fprintf(file, "SpawnOriginX = %f\n", part->GetData()->SpawnOrigin.x);
-			fprintf(file, "SpawnOriginY = %f\n", part->GetData()->SpawnOrigin.y);
-			fprintf(file, "SpawnOriginZ = %f\n", part->GetData()->SpawnOrigin.z);
+			fprintf(file, "SpawnPosType = %d\n", part->getData()->SpawnPosType);
+			fprintf(file, "SpawnOriginX = %f\n", part->getData()->SpawnOrigin.x);
+			fprintf(file, "SpawnOriginY = %f\n", part->getData()->SpawnOrigin.y);
+			fprintf(file, "SpawnOriginZ = %f\n", part->getData()->SpawnOrigin.z);
 
-			fprintf(file, "SpawnOriginDisp = %f\n", part->GetData()->SpawnOriginDisp);
+			fprintf(file, "SpawnOriginDisp = %f\n", part->getData()->SpawnOriginDisp);
 
-			fprintf(file, "SpawnBoundBindCreateXNeg = %d\n", part->GetData()->SpawnBoundBindCreateXNeg);
-			fprintf(file, "SpawnBoundBindCreateXPos = %d\n", part->GetData()->SpawnBoundBindCreateXPos);
-			fprintf(file, "SpawnBoundBindCreateYNeg = %d\n", part->GetData()->SpawnBoundBindCreateYNeg);
-			fprintf(file, "SpawnBoundBindCreateYPos = %d\n", part->GetData()->SpawnBoundBindCreateYPos);
-			fprintf(file, "SpawnBoundBindCreateZNeg = %d\n", part->GetData()->SpawnBoundBindCreateZNeg);
-			fprintf(file, "SpawnBoundBindCreateZPos = %d\n", part->GetData()->SpawnBoundBindCreateZPos);
+			fprintf(file, "SpawnBoundBindCreateXNeg = %d\n", part->getData()->SpawnBoundBindCreateXNeg);
+			fprintf(file, "SpawnBoundBindCreateXPos = %d\n", part->getData()->SpawnBoundBindCreateXPos);
+			fprintf(file, "SpawnBoundBindCreateYNeg = %d\n", part->getData()->SpawnBoundBindCreateYNeg);
+			fprintf(file, "SpawnBoundBindCreateYPos = %d\n", part->getData()->SpawnBoundBindCreateYPos);
+			fprintf(file, "SpawnBoundBindCreateZNeg = %d\n", part->getData()->SpawnBoundBindCreateZNeg);
+			fprintf(file, "SpawnBoundBindCreateZPos = %d\n", part->getData()->SpawnBoundBindCreateZPos);
 
-			fprintf(file, "SpawnNextTime = %d\n", part->GetData()->SpawnNextTime);
-			fprintf(file, "SpawnNextTimeDisp = %d\n", part->GetData()->SpawnNextTimeDisp);
+			fprintf(file, "SpawnNextTime = %d\n", part->getData()->SpawnNextTime);
+			fprintf(file, "SpawnNextTimeDisp = %d\n", part->getData()->SpawnNextTimeDisp);
 
 
-			fprintf(file, "AnimTexCountCadrsX = %d\n", part->GetData()->AnimTexCountCadrsX);
-			fprintf(file, "AnimTexCountCadrsY = %d\n", part->GetData()->AnimTexCountCadrsY);
+			fprintf(file, "AnimTexCountCadrsX = %d\n", part->getData()->AnimTexCountCadrsX);
+			fprintf(file, "AnimTexCountCadrsY = %d\n", part->getData()->AnimTexCountCadrsY);
 
-			fprintf(file, "AnimTexRate = %d\n", part->GetData()->AnimTexRate);
-			fprintf(file, "AnimTexRateDisp = %d\n", part->GetData()->AnimTexRateDisp);
-			fprintf(file, "AnimTexStartCadr = %d\n", part->GetData()->AnimTexStartCadr);
-			fprintf(file, "AnimTexStartCadrDisp = %d\n", part->GetData()->AnimTexStartCadrDisp);
+			fprintf(file, "AnimTexRate = %d\n", part->getData()->AnimTexRate);
+			fprintf(file, "AnimTexRateDisp = %d\n", part->getData()->AnimTexRateDisp);
+			fprintf(file, "AnimTexStartCadr = %d\n", part->getData()->AnimTexStartCadr);
+			fprintf(file, "AnimTexStartCadrDisp = %d\n", part->getData()->AnimTexStartCadrDisp);
 
 
-			fprintf(file, "TimeLife = %d\n", part->GetData()->TimeLife);
-			fprintf(file, "TimeLifeDisp = %d\n", part->GetData()->TimeLifeDisp);
-			fprintf(file, "AlphaDependAge = %d\n", part->GetData()->AlphaDependAge);
+			fprintf(file, "TimeLife = %d\n", part->getData()->TimeLife);
+			fprintf(file, "TimeLifeDisp = %d\n", part->getData()->TimeLifeDisp);
+			fprintf(file, "AlphaDependAge = %d\n", part->getData()->AlphaDependAge);
 
-			fprintf(file, "SizeX = %f\n", part->GetData()->Size.x);
-			fprintf(file, "SizeY = %f\n", part->GetData()->Size.y);
-			fprintf(file, "SizeDisp = %f\n", part->GetData()->SizeDisp);
+			fprintf(file, "SizeX = %f\n", part->getData()->Size.x);
+			fprintf(file, "SizeY = %f\n", part->getData()->Size.y);
+			fprintf(file, "SizeDisp = %f\n", part->getData()->SizeDisp);
 
-			fprintf(file, "SizeDependAge = %d\n", part->GetData()->SizeDependAge);
+			fprintf(file, "SizeDependAge = %d\n", part->getData()->SizeDependAge);
 
 
-			fprintf(file, "VelocityX = %f\n", part->GetData()->Velocity.x);
-			fprintf(file, "VelocityY = %f\n", part->GetData()->Velocity.y);
-			fprintf(file, "VelocityZ = %f\n", part->GetData()->Velocity.z);
-			fprintf(file, "VelocityDisp = %f\n", part->GetData()->VelocityDisp);
+			fprintf(file, "VelocityX = %f\n", part->getData()->Velocity.x);
+			fprintf(file, "VelocityY = %f\n", part->getData()->Velocity.y);
+			fprintf(file, "VelocityZ = %f\n", part->getData()->Velocity.z);
+			fprintf(file, "VelocityDisp = %f\n", part->getData()->VelocityDisp);
 
-			fprintf(file, "VelocityDispXNeg = %d\n", part->GetData()->VelocityDispXNeg);
-			fprintf(file, "VelocityDispYNeg = %d\n", part->GetData()->VelocityDispYNeg);
-			fprintf(file, "VelocityDispZNeg = %d\n", part->GetData()->VelocityDispZNeg);
+			fprintf(file, "VelocityDispXNeg = %d\n", part->getData()->VelocityDispXNeg);
+			fprintf(file, "VelocityDispYNeg = %d\n", part->getData()->VelocityDispYNeg);
+			fprintf(file, "VelocityDispZNeg = %d\n", part->getData()->VelocityDispZNeg);
 
 
-			fprintf(file, "AccelerationX = %f\n", part->GetData()->Acceleration.x);
-			fprintf(file, "AccelerationY = %f\n", part->GetData()->Acceleration.y);
-			fprintf(file, "AccelerationZ = %f\n", part->GetData()->Acceleration.z);
-			fprintf(file, "AccelerationDisp = %f\n", part->GetData()->AccelerationDisp);
+			fprintf(file, "AccelerationX = %f\n", part->getData()->Acceleration.x);
+			fprintf(file, "AccelerationY = %f\n", part->getData()->Acceleration.y);
+			fprintf(file, "AccelerationZ = %f\n", part->getData()->Acceleration.z);
+			fprintf(file, "AccelerationDisp = %f\n", part->getData()->AccelerationDisp);
 
-			fprintf(file, "AccelerationDispXNeg = %d\n", part->GetData()->AccelerationDispXNeg);
-			fprintf(file, "AccelerationDispYNeg = %d\n", part->GetData()->AccelerationDispYNeg);
-			fprintf(file, "AccelerationDispZNeg = %d\n", part->GetData()->AccelerationDispZNeg);
+			fprintf(file, "AccelerationDispXNeg = %d\n", part->getData()->AccelerationDispXNeg);
+			fprintf(file, "AccelerationDispYNeg = %d\n", part->getData()->AccelerationDispYNeg);
+			fprintf(file, "AccelerationDispZNeg = %d\n", part->getData()->AccelerationDispZNeg);
 
 
-			fprintf(file, "CharacterCircle = %d\n", part->GetData()->CharacterCircle);
-			fprintf(file, "CharacterCircleAxis = %d\n", part->GetData()->CharacterCircleAxis);
-			fprintf(file, "CharacterCircleAngle = %f\n", part->GetData()->CharacterCircleAngle);
-			fprintf(file, "CharacterCircleAngleDisp = %f\n", part->GetData()->CharacterCircleAngleDisp);
-			fprintf(file, "CharacterCircleAngleDispNeg = %d\n", part->GetData()->CharacterCircleAngleDispNeg);
+			fprintf(file, "CharacterCircle = %d\n", part->getData()->CharacterCircle);
+			fprintf(file, "CharacterCircleAxis = %d\n", part->getData()->CharacterCircleAxis);
+			fprintf(file, "CharacterCircleAngle = %f\n", part->getData()->CharacterCircleAngle);
+			fprintf(file, "CharacterCircleAngleDisp = %f\n", part->getData()->CharacterCircleAngleDisp);
+			fprintf(file, "CharacterCircleAngleDispNeg = %d\n", part->getData()->CharacterCircleAngleDispNeg);
 
 
-			fprintf(file, "CharacterRotate = %d\n", part->GetData()->CharacterRotate);
-			fprintf(file, "CharacterRotateAngle = %f\n", part->GetData()->CharacterRotateAngle);
-			fprintf(file, "CharacterRotateAngleDisp = %f\n", part->GetData()->CharacterRotateAngleDisp);
-			fprintf(file, "CharacterRotateAngleDispNeg = %d\n", part->GetData()->CharacterRotateAngleDispNeg);
+			fprintf(file, "CharacterRotate = %d\n", part->getData()->CharacterRotate);
+			fprintf(file, "CharacterRotateAngle = %f\n", part->getData()->CharacterRotateAngle);
+			fprintf(file, "CharacterRotateAngleDisp = %f\n", part->getData()->CharacterRotateAngleDisp);
+			fprintf(file, "CharacterRotateAngleDispNeg = %d\n", part->getData()->CharacterRotateAngleDispNeg);
 
 
-			fprintf(file, "CharacterDeviation = %d\n", part->GetData()->CharacterDeviation);
-			fprintf(file, "CharacterDeviationType = %d\n", part->GetData()->CharacterDeviationType);
-			fprintf(file, "CharacterDeviationAmplitude = %f\n", part->GetData()->CharacterDeviationAmplitude);
-			fprintf(file, "CharacterDeviationCoefAngle = %f\n", part->GetData()->CharacterDeviationCoefAngle);
-			fprintf(file, "CharacterDeviationAxis = %d\n", part->GetData()->CharacterDeviationAxis);
-			fprintf(file, "CharacterDeviationCountDelayMls = %d\n", part->GetData()->CharacterDeviationCountDelayMls);
-			fprintf(file, "CharacterDeviationCoefAngleDisp = %f\n", part->GetData()->CharacterDeviationCoefAngleDisp);
-			fprintf(file, "CharacterDeviationCoefAngleDispNeg = %d\n", part->GetData()->CharacterDeviationCoefAngleDispNeg);
+			fprintf(file, "CharacterDeviation = %d\n", part->getData()->CharacterDeviation);
+			fprintf(file, "CharacterDeviationType = %d\n", part->getData()->CharacterDeviationType);
+			fprintf(file, "CharacterDeviationAmplitude = %f\n", part->getData()->CharacterDeviationAmplitude);
+			fprintf(file, "CharacterDeviationCoefAngle = %f\n", part->getData()->CharacterDeviationCoefAngle);
+			fprintf(file, "CharacterDeviationAxis = %d\n", part->getData()->CharacterDeviationAxis);
+			fprintf(file, "CharacterDeviationCountDelayMls = %d\n", part->getData()->CharacterDeviationCountDelayMls);
+			fprintf(file, "CharacterDeviationCoefAngleDisp = %f\n", part->getData()->CharacterDeviationCoefAngleDisp);
+			fprintf(file, "CharacterDeviationCoefAngleDispNeg = %d\n", part->getData()->CharacterDeviationCoefAngleDispNeg);
 
-			fprintf(file, "CharacterDeviationTapX = %d\n", part->GetData()->CharacterDeviationTapX);
-			fprintf(file, "CharacterDeviationTapY = %d\n", part->GetData()->CharacterDeviationTapY);
-			fprintf(file, "CharacterDeviationTapZ = %d\n", part->GetData()->CharacterDeviationTapZ);
+			fprintf(file, "CharacterDeviationTapX = %d\n", part->getData()->CharacterDeviationTapX);
+			fprintf(file, "CharacterDeviationTapY = %d\n", part->getData()->CharacterDeviationTapY);
+			fprintf(file, "CharacterDeviationTapZ = %d\n", part->getData()->CharacterDeviationTapZ);
 
 
-			fprintf(file, "FigureType = %d\n", part->GetData()->FigureType);
-			fprintf(file, "FigureCountQuads = %d\n", part->GetData()->FigureCountQuads);
-			fprintf(file, "FigureRotRand = %d\n", part->GetData()->FigureRotRand);
+			fprintf(file, "FigureType = %d\n", part->getData()->FigureType);
+			fprintf(file, "FigureCountQuads = %d\n", part->getData()->FigureCountQuads);
+			fprintf(file, "FigureRotRand = %d\n", part->getData()->FigureRotRand);
 
-			fprintf(file, "FigureTapX = %d\n", part->GetData()->FigureTapX);
-			fprintf(file, "FigureTapY = %d\n", part->GetData()->FigureTapY);
-			fprintf(file, "FigureTapZ = %d\n", part->GetData()->FigureTapZ);
+			fprintf(file, "FigureTapX = %d\n", part->getData()->FigureTapX);
+			fprintf(file, "FigureTapY = %d\n", part->getData()->FigureTapY);
+			fprintf(file, "FigureTapZ = %d\n", part->getData()->FigureTapZ);
 
-			fprintf(file, "ReCreateCount = %d\n", part->GetData()->ReCreateCount);
+			fprintf(file, "ReCreateCount = %d\n", part->getData()->ReCreateCount);
 
-			fprintf(file, "AlphaBlendType = %d\n", part->GetData()->AlphaBlendType);
+			fprintf(file, "AlphaBlendType = %d\n", part->getData()->AlphaBlendType);
 
-			fprintf(file, "ColorCoef = %f\n", part->GetData()->ColorCoef);
+			fprintf(file, "ColorCoef = %f\n", part->getData()->ColorCoef);
 
-			fprintf(file, "Soft = %d\n", part->GetData()->Soft);
-			fprintf(file, "SoftCoef = %f\n", part->GetData()->SoftCoef);
+			fprintf(file, "Soft = %d\n", part->getData()->Soft);
+			fprintf(file, "SoftCoef = %f\n", part->getData()->SoftCoef);
 
-			fprintf(file, "Refraction = %d\n", part->GetData()->Refraction);
-			fprintf(file, "RefractionCoef = %f\n", part->GetData()->RefractionCoef);
+			fprintf(file, "Refraction = %d\n", part->getData()->Refraction);
+			fprintf(file, "RefractionCoef = %f\n", part->getData()->RefractionCoef);
 
-			fprintf(file, "TransparencyCoef = %f\n", part->GetData()->TransparencyCoef);
-			fprintf(file, "Lighting = %d\n", part->GetData()->Lighting);
-			fprintf(file, "CollisionDelete = %d\n", part->GetData()->CollisionDelete);
+			fprintf(file, "TransparencyCoef = %f\n", part->getData()->TransparencyCoef);
+			fprintf(file, "Lighting = %d\n", part->getData()->Lighting);
+			fprintf(file, "CollisionDelete = %d\n", part->getData()->CollisionDelete);
 			fprintf(file, "\n");
 		}
 		fprintf(file, "----------------------------------------------------------------------\n\n");
@@ -302,7 +302,7 @@ void Effects::Save(const char* path)
 	fclose(file);
 }
 
-void Effects::Load(const char* path)
+void Effects::load(const char* path)
 {
 	if (!FileExistsFile(path))
 	{
@@ -337,7 +337,7 @@ void Effects::Load(const char* path)
 			return;
 		}
 
-		ID eff_id = this->EffectAdd(0);
+		ID eff_id = this->effectAdd(0);
 		ArrID[eff_id]->Original = true;
 		int eff_count_part = 0;
 
@@ -582,19 +582,19 @@ void Effects::Load(const char* path)
 				part.TrackTime = String(config->getKey(part_section_name, "TrackTime")).toUnsLongInt();
 
 			
-			ID part_id = this->EmitterAdd(eff_id, &part);
+			ID part_id = this->emitterAdd(eff_id, &part);
 
 			if (config->keyExists(part_section_name, "name"))
-				EmitterNameSet(eff_id, part_id, config->getKey(part_section_name, "name"));
+				emitterSetName(eff_id, part_id, config->getKey(part_section_name, "name"));
 
 			if (config->keyExists(part_section_name, "count"))
-				EmitterCountSet(eff_id, part_id, String(config->getKey(part_section_name, "count")).toInt());
+				emitterSetCount(eff_id, part_id, String(config->getKey(part_section_name, "count")).toInt());
 
 			if (config->keyExists(part_section_name, "texture"))
-				EmitterTextureSet(eff_id, part_id, config->getKey(part_section_name, "texture"));
+				emitterSetTexture(eff_id, part_id, config->getKey(part_section_name, "texture"));
 
 			if (config->keyExists(part_section_name, "texture_track"))
-				EmitterTextureTrackSet(eff_id, part_id, config->getKey(part_section_name, "texture_track"));
+				emitterSetTextureTrack(eff_id, part_id, config->getKey(part_section_name, "texture_track"));
 		}
 	}
 
@@ -602,163 +602,163 @@ void Effects::Load(const char* path)
 }
 
 
-int Effects::EmitterTrackCountGet(ID id, ID id_part)
+int Effects::emitterGetTrackCount(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, 0);
 
-	return ArrID[id]->Arr[id_part]->TrackCountGet();
+	return ArrID[id]->Arr[id_part]->getTrackCount();
 }
 
-int Effects::EmitterTrackPosGet(ID id, ID id_part, float3** arr, int count)
+int Effects::emitterGetTrackPos(ID id, ID id_part, float3** arr, int count)
 {
 	EFFECTS_PRECOND(id, id_part, 0);
 
-	return ArrID[id]->Arr[id_part]->TrackPosGet(arr, count);
+	return ArrID[id]->Arr[id_part]->getTrackPos(arr, count);
 }
 
 
-void Effects::EmitterNameSet(ID id, ID id_part, const char* name)
+void Effects::emitterSetName(ID id, ID id_part, const char* name)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->NameSet(name);
+	ArrID[id]->Arr[id_part]->setName(name);
 }
 
-void Effects::EmitterNameGet(ID id, ID id_part, char* name)
+void Effects::emitterGetName(ID id, ID id_part, char* name)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->NameGet(name);
+	ArrID[id]->Arr[id_part]->getName(name);
 }
 
-ID Effects::EmitterAdd(ID id, ParticlesData* data)
+ID Effects::emitterAdd(ID id, ParticlesData* data)
 {
 	EFFECTS_EFFECT_PRECOND(id, -1);
 
 	Emitter* tmppart = new Emitter();
-	tmppart->Init(data);
+	tmppart->init(data);
 	ArrID[id]->Arr.push_back(tmppart);
 	return ArrID[id]->Arr.size() - 1;
 }
 
-void Effects::EmitterReInit(ID id, ID id_part, ParticlesData* data)
+void Effects::emitterReInit(ID id, ID id_part, ParticlesData* data)
 {
 	EFFECTS_PARTICLES_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->Init(data);
+	ArrID[id]->Arr[id_part]->init(data);
 }
 
-int Effects::EmitterGetCount(ID id)
+int Effects::emitterGetCount(ID id)
 {
 	EFFECTS_EFFECT_PRECOND(id, -1);
 	return ArrID[id]->Arr.size();
 }
 
-void Effects::EmitterDelete(ID id, ID id_part)
+void Effects::emitterDelete(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 	mem_delete(ArrID[id]->Arr[id_part]);
 	ArrID[id]->Arr.erase(id_part);
 }
 
-ParticlesData* Effects::EmitterGetData(ID id, ID id_part)
+ParticlesData* Effects::emitterGetData(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, 0);
 
-	return ArrID[id]->Arr[id_part]->GetData();
+	return ArrID[id]->Arr[id_part]->getData();
 }
 
-void Effects::EmitterCountSet(ID id, ID id_part, int count)
+void Effects::emitterSetCount(ID id, ID id_part, int count)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->CountSet(count);
+	ArrID[id]->Arr[id_part]->setCount(count);
 }
 
-int Effects::EmitterCountGet(ID id, ID id_part)
+int Effects::emitterGetCount(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, 0);
 
-	return ArrID[id]->Arr[id_part]->CountGet();
+	return ArrID[id]->Arr[id_part]->getCount();
 }
 
-int Effects::EmitterCountLifeGet(ID id, ID id_part)
+int Effects::emitterGetCountLife(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, 0);
 
-	return ArrID[id]->Arr[id_part]->CountLifeGet();
+	return ArrID[id]->Arr[id_part]->getCountLife();
 }
 
-void Effects::EmitterEnableSet(ID id, ID id_part, bool enable)
+void Effects::emitterSetEnable(ID id, ID id_part, bool enable)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->EnableSet(enable);
+	ArrID[id]->Arr[id_part]->setEnable(enable);
 }
 
-bool Effects::EmitterEnableGet(ID id, ID id_part)
+bool Effects::emitterGetEnable(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, false);
 
-	return ArrID[id]->Arr[id_part]->EnableGet();
+	return ArrID[id]->Arr[id_part]->getEnable();
 }
 
 
-void Effects::EmitterTextureSet(ID id, ID id_part, const char* tex)
+void Effects::emitterSetTexture(ID id, ID id_part, const char* tex)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->TextureSet(tex);
+	ArrID[id]->Arr[id_part]->setTexture(tex);
 }
 
-void Effects::EmitterTextureSetID(ID id, ID id_part, ID tex)
+void Effects::emitterSetTextureID(ID id, ID id_part, ID tex)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->TextureSetID(tex);
+	ArrID[id]->Arr[id_part]->setTextureID(tex);
 }
 
-ID Effects::EmitterTextureGetID(ID id, ID id_part)
+ID Effects::emitterGetTextureID(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, -1);
 
-	return ArrID[id]->Arr[id_part]->TextureGetID();
+	return ArrID[id]->Arr[id_part]->getTextureID();
 }
 
-void Effects::EmitterTextureGet(ID id, ID id_part, char* tex)
+void Effects::emitterGetTexture(ID id, ID id_part, char* tex)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->TextureGet(tex);
+	ArrID[id]->Arr[id_part]->getTexture(tex);
 }
 
 
-void Effects::EmitterTextureTrackSet(ID id, ID id_part, const char* tex)
+void Effects::emitterSetTextureTrack(ID id, ID id_part, const char* tex)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->TextureTrackSet(tex);
+	ArrID[id]->Arr[id_part]->setTextureTrack(tex);
 }
 
-void Effects::EmitterTextureTrackSetID(ID id, ID id_part, ID tex)
+void Effects::emitterSetTextureTrackID(ID id, ID id_part, ID tex)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->TextureTrackSetID(tex);
+	ArrID[id]->Arr[id_part]->setTextureTrackID(tex);
 }
 
-ID Effects::EmitterTextureTrackGetID(ID id, ID id_part)
+ID Effects::emitterGetTextureTrackID(ID id, ID id_part)
 {
 	EFFECTS_PRECOND(id, id_part, -1);
 
-	return ArrID[id]->Arr[id_part]->TextureTrackGetID();
+	return ArrID[id]->Arr[id_part]->getTextureTrackID();
 }
 
-void Effects::EmitterTextureTrackGet(ID id, ID id_part, char* tex)
+void Effects::emitterGetTextureTrack(ID id, ID id_part, char* tex)
 {
 	EFFECTS_PRECOND(id, id_part, _VOID);
 
-	ArrID[id]->Arr[id_part]->TextureTrackGet(tex);
+	ArrID[id]->Arr[id_part]->getTextureTrack(tex);
 }
 
 
@@ -776,10 +776,10 @@ ID Effects::EffectCopyID(ID id)
 
 ID Effects::EffectCopyName(const char* name)
 {
-	return EffectCopyID(EffectGetByName(name));
+	return EffectCopyID(effectGetByName(name));
 }
 
-ID Effects::EffectGetByName(const char* name)
+ID Effects::effectGetByName(const char* name)
 {
 	for (int i = 0; i < ArrKey.size(); ++i)
 	{
@@ -790,7 +790,7 @@ ID Effects::EffectGetByName(const char* name)
 	return -1;
 }
 
-ID Effects::EffectAdd(const char* name)
+ID Effects::effectAdd(const char* name)
 {
 	Effect* tmpeffect = new Effect();
 	if (name)
@@ -881,7 +881,7 @@ ID Effects::EffectInstanceByID(ID id)
 
 ID Effects::EffectInstanceByName(const char* name)
 {
-	return EffectInstanceByID(EffectGetByName(name));
+	return EffectInstanceByID(effectGetByName(name));
 }
 
 void Effects::EffectPlayByID(ID id, float3* pos, float3* dir)
@@ -901,7 +901,7 @@ void Effects::EffectPlayByID(ID id, float3* pos, float3* dir)
 
 void Effects::EffectPlayByName(const char* name, float3* pos, float3* dir)
 {
-	EffectPlayByID(EffectGetByName(name), pos, dir);
+	EffectPlayByID(effectGetByName(name), pos, dir);
 }
 
 ID Effects::AddEffect(Effect* obj)
@@ -929,12 +929,12 @@ ID Effects::AddEffect(Effect* obj)
 	return idadd;
 }
 
-int Effects::EffectCountGet()
+int Effects::effectGetCount()
 {
 	return ArrKey.size();
 }
 
-ID Effects::EffectIdOfKey(ID key)
+ID Effects::effectGetIdOfKey(ID key)
 {
 	EFFECTS_EFFECT_PRECOND_KEY(key, -1);
 
@@ -1004,10 +1004,10 @@ void Effects::EffectCompute(ID id)
 	for (int i = 0, l = eff->Arr.size(); i < l; ++i)
 	{
 		if (eff->Arr[i])
-			eff->Arr[i]->Compute(&mattrans);
+			eff->Arr[i]->compute(&mattrans);
 
 		//если партиклы метрвы то инкрементируем счетчик
-		if (!eff->Arr[i]->EnableGet())
+		if (!eff->Arr[i]->getEnable())
 			++countdead;
 		else //иначе партиклы живы, считаем объем эффекта
 		{
@@ -1067,9 +1067,9 @@ void Effects::EffectComputeLighting(ID id)
 
 	for(int i = 0, l = eff->Arr.size(); i < l; ++i)
 	{
-		if (eff->Arr[i] && eff->Arr[i]->EnableGet())
+		if (eff->Arr[i] && eff->Arr[i]->getEnable())
 		{
-			eff->Arr[i]->ComputeLighting();
+			eff->Arr[i]->computeLighting();
 		}
 	}
 }
@@ -1088,9 +1088,9 @@ void Effects::EffectRender(ID id, DWORD timeDelta)
 
 	for(int i = 0, l = eff->Arr.size(); i < l; ++i)
 	{
-		if(eff->Arr[i] && eff->Arr[i]->EnableGet())
+		if(eff->Arr[i] && eff->Arr[i]->getEnable())
 		{
-			eff->Arr[i]->Render(timeDelta, &eff->MatRotate, &eff->MatTranslation);
+			eff->Arr[i]->render(timeDelta, &eff->MatRotate, &eff->MatTranslation);
 		}
 	}
 }
@@ -1231,7 +1231,7 @@ void Effects::EffectEnableSet(ID id, bool isenable)
 	
 	for (int i = 0; i < eff->Arr.size(); ++i)
 	{
-		eff->Arr[i]->EnableSet(isenable);
+		eff->Arr[i]->setEnable(isenable);
 	}
 
 	eff->Enable = isenable;
@@ -1259,7 +1259,7 @@ void Effects::EffectAlifeSet(ID id, bool alife)
 
 	for (int i = 0; i < eff->Arr.size(); ++i)
 	{
-		eff->Arr[i]->AlifeSet(alife);
+		eff->Arr[i]->setAlife(alife);
 	}
 }
 
diff --git a/source/particles/effect.h b/source/particles/effect.h
index e3c5bac0f..7823b6d49 100644
--- a/source/particles/effect.h
+++ b/source/particles/effect.h
@@ -87,48 +87,50 @@ public:
 		bool Original;
 	};
 
-	void Load(const char* file);
-	void Save(const char* file);
-	void Clear();
+	void load(const char* file);
+	void save(const char* file);
+	void clear();
 
-	void OnLostDevice();
-	void OnResetDevice();
+	void onLostDevice();
+	void onResetDevice();
 
-	ID EmitterAdd(ID id, ParticlesData* data);
-	void EmitterReInit(ID id, ID id_part, ParticlesData* data);
-	int EmitterGetCount(ID id);
-	void EmitterDelete(ID id, ID id_part);
-	ParticlesData* EmitterGetData(ID id, ID id_part);
+	ID emitterAdd(ID id, ParticlesData* data);
+	void emitterReInit(ID id, ID id_part, ParticlesData* data);
+	int emitterGetCount(ID id);
+	void emitterDelete(ID id, ID id_part);
+	ParticlesData* emitterGetData(ID id, ID id_part);
 
-	void EmitterCountSet(ID id, ID id_part, int count);
-	int EmitterCountGet(ID id, ID id_part);
-	int EmitterCountLifeGet(ID id, ID id_part);
+	void emitterSetCount(ID id, ID id_part, int count);
+	int emitterGetCount(ID id, ID id_part);
+	int emitterGetCountLife(ID id, ID id_part);
 
-	void EmitterEnableSet(ID id, ID id_part, bool enable);
-	bool EmitterEnableGet(ID id, ID id_part);
+	void emitterSetEnable(ID id, ID id_part, bool enable);
+	bool emitterGetEnable(ID id, ID id_part);
 
-	void EmitterTextureSet(ID id, ID id_part, const char* tex);
-	void EmitterTextureSetID(ID id, ID id_part, ID tex);
-	ID EmitterTextureGetID(ID id, ID id_part);
-	void EmitterTextureGet(ID id, ID id_part, char* tex);
+	void emitterSetTexture(ID id, ID id_part, const char* tex);
+	void emitterSetTextureID(ID id, ID id_part, ID tex);
+	ID emitterGetTextureID(ID id, ID id_part);
+	void emitterGetTexture(ID id, ID id_part, char* tex);
 
-	void EmitterTextureTrackSet(ID id, ID id_part, const char* tex);
-	void EmitterTextureTrackSetID(ID id, ID id_part, ID tex);
-	ID EmitterTextureTrackGetID(ID id, ID id_part);
-	void EmitterTextureTrackGet(ID id, ID id_part, char* tex);
+	void emitterSetTextureTrack(ID id, ID id_part, const char* tex);
+	void emitterSetTextureTrackID(ID id, ID id_part, ID tex);
+	ID emitterGetTextureTrackID(ID id, ID id_part);
+	void emitterGetTextureTrack(ID id, ID id_part, char* tex);
 
-	void EmitterNameSet(ID id, ID id_part, const char* name);
-	void EmitterNameGet(ID id, ID id_part, char* name);
+	void emitterSetName(ID id, ID id_part, const char* name);
+	void emitterGetName(ID id, ID id_part, char* name);
 
-	int EmitterTrackCountGet(ID id, ID id_part);
-	int EmitterTrackPosGet(ID id, ID id_part, float3** arr, int count);
+	int emitterGetTrackCount(ID id, ID id_part);
+	int emitterGetTrackPos(ID id, ID id_part, float3** arr, int count);
 
 	ID EffectInstanceByID(ID id);
 	ID EffectInstanceByName(const char* name);
-	ID EffectGetByName(const char* name);
-	ID EffectAdd(const char* name);
-	int EffectCountGet();
-	ID EffectIdOfKey(ID key);
+	
+	ID effectGetByName(const char* name);
+	ID effectAdd(const char* name);
+	int effectGetCount();
+	ID effectGetIdOfKey(ID key);
+
 	void EffectDelete(ID id);
 	void EffectNameSet(ID id, const char* name);
 	void EffectNameGet(ID id, char* name);
diff --git a/source/particles/emitter.cpp b/source/particles/emitter.cpp
index 6b7bf9e6e..5f511defc 100644
--- a/source/particles/emitter.cpp
+++ b/source/particles/emitter.cpp
@@ -6,7 +6,7 @@ See the license in LICENSE
 
 #include "Emitter.h"
 
-void Emitter::NullingInit()
+void Emitter::initNulling()
 {
 	OldTime = 0;
 	TimeNextSpawnParticle = 0;
@@ -34,16 +34,16 @@ void Emitter::NullingInit()
 
 Emitter::Emitter()
 {
-	NullingInit();
+	initNulling();
 }
 
 Emitter::Emitter(Emitter& part)
 {
-	NullingInit();
+	initNulling();
 	IDTex = part.IDTex;
 	IDTexTrack = part.IDTexTrack;
 	Data = part.Data;
-	CountSet(part.Count);
+	setCount(part.Count);
 }
 
 Emitter::~Emitter()
@@ -56,12 +56,12 @@ Emitter::~Emitter()
 	mem_release_del(IndexBuffQuad);
 }
 
-void Emitter::OnLostDevice()
+void Emitter::onLostDevice()
 {
 	mem_release_del(TransVertBuf);
 }
 
-void Emitter::OnResetDevice()
+void Emitter::onResetDevice()
 {
 	PESet::DXDevice->CreateVertexBuffer(
 		Count * sizeof(CommonParticleDecl2),
@@ -72,41 +72,41 @@ void Emitter::OnResetDevice()
 		0);
 }
 
-void Emitter::Init(ParticlesData* data)
+void Emitter::init(ParticlesData* data)
 {
 	if (data)
 		memcpy(&Data, data, sizeof(ParticlesData));
 
 	if (IDTex >= 0)
-		AnimTexDataInit();
+		initAnimTexData();
 
-	GeomDataCreate();
+	createGeomData();
 
 	if (Enable)
 	{
-		EnableSet(false);
-		EnableSet(true);
+		setEnable(false);
+		setEnable(true);
 	}
 }
 
-ParticlesData* Emitter::GetData()
+ParticlesData* Emitter::getData()
 {
 	return &Data;
 }
 
-void Emitter::NameSet(const char* name)
+void Emitter::setName(const char* name)
 {
 	if (name)
 		strcpy(Name,name);
 }
 
-void Emitter::NameGet(char* name)
+void Emitter::getName(char* name)
 {
 	if (name)
 		strcpy(name, Name);
 }
 
-void Emitter::TextureSetID(ID tex)
+void Emitter::setTextureID(ID tex)
 {
 	IDTex = tex;
 
@@ -114,10 +114,10 @@ void Emitter::TextureSetID(ID tex)
 	if (SGCore_LoadTexGetTex(IDTex))
 		isTexInit = true;
 
-	AnimTexDataInit();
+	initAnimTexData();
 }
 
-void Emitter::TextureSet(const char* tex)
+void Emitter::setTexture(const char* tex)
 {
 	IDTex = SGCore_LoadTexAddName(tex, LOAD_TEXTURE_TYPE_LOAD);
 	//SGCore_LoadTexLoadTextures();
@@ -125,15 +125,15 @@ void Emitter::TextureSet(const char* tex)
 	if (SGCore_LoadTexGetTex(IDTex))
 		isTexInit = true;
 
-	AnimTexDataInit();
+	initAnimTexData();
 }
 
-ID Emitter::TextureGetID()
+ID Emitter::getTextureID()
 {
 	return IDTex;
 }
 
-void Emitter::TextureGet(char* tex)
+void Emitter::getTexture(char* tex)
 {
 	if (IDTex >= 0)
 	{
@@ -142,23 +142,23 @@ void Emitter::TextureGet(char* tex)
 }
 
 
-void Emitter::TextureTrackSetID(ID tex)
+void Emitter::setTextureTrackID(ID tex)
 {
 	IDTexTrack = tex;
 }
 
-void Emitter::TextureTrackSet(const char* tex)
+void Emitter::setTextureTrack(const char* tex)
 {
 	IDTexTrack = SGCore_LoadTexAddName(tex, LOAD_TEXTURE_TYPE_LOAD);
 	//SGCore_LoadTexLoadTextures();
 }
 
-ID Emitter::TextureTrackGetID()
+ID Emitter::getTextureTrackID()
 {
 	return IDTexTrack;
 }
 
-void Emitter::TextureTrackGet(char* tex)
+void Emitter::getTextureTrack(char* tex)
 {
 	if (IDTexTrack >= 0)
 	{
@@ -167,7 +167,7 @@ void Emitter::TextureTrackGet(char* tex)
 }
 
 
-void Emitter::AnimTexDataInit()
+void Emitter::initAnimTexData()
 {
 	if (isTexInit && Data.AnimTexCountCadrsX != 0 && Data.AnimTexCountCadrsY != 0)
 	{
@@ -184,7 +184,7 @@ void Emitter::AnimTexDataInit()
 	}
 }
 
-void Emitter::AlifeSet(bool alife)
+void Emitter::setAlife(bool alife)
 {
 	if (Alife != alife)
 	{
@@ -197,14 +197,14 @@ void Emitter::AlifeSet(bool alife)
 		Enable = Alife;
 }
 
-bool Emitter::AlifeGet()
+bool Emitter::getAlife()
 {
 	return Alife;
 }
 
 ////////////////////
 
-void Emitter::ComputeLighting()
+void Emitter::computeLighting()
 {
 	if (!Enable)
 		return;
@@ -250,7 +250,7 @@ void Emitter::ComputeLighting()
 	}
 }
 
-void Emitter::CountSet(int count)
+void Emitter::setCount(int count)
 {
 	Count = count;
 
@@ -273,24 +273,24 @@ void Emitter::CountSet(int count)
 		&TransVertBuf,
 		0);
 
-	GeomDataCreate();
+	createGeomData();
 }
 
-int Emitter::CountGet()
+int Emitter::getCount()
 {
 	return Count;
 }
 
-int Emitter::CountLifeGet()
+int Emitter::getCountLife()
 {
 	return CountLifeParticle;
 }
 
-void Emitter::EnableSet(bool enable)
+void Emitter::setEnable(bool enable)
 {
 	if (!Enable && enable)
 	{
-		CreateParticles();
+		createParticles();
 
 		for (int i = 0; i < Count; ++i)
 		{
@@ -316,12 +316,12 @@ void Emitter::EnableSet(bool enable)
 	}
 }
 
-bool Emitter::EnableGet()
+bool Emitter::getEnable()
 {
 	return Enable;
 }
 
-void Emitter::VertexBuffModify()
+void Emitter::modifyVertexBuff()
 {
 	if (!VertexBuff)
 		return;
@@ -394,7 +394,7 @@ void Emitter::VertexBuffModify()
 	VertexBuff->Unlock();
 }
 
-void Emitter::GeomDataCreate()
+void Emitter::createGeomData()
 {
 	mem_release_del(VertexBuff);
 	mem_release_del(IndexBuff);
@@ -415,7 +415,7 @@ void Emitter::GeomDataCreate()
 		&IndexBuff,
 		0);
 
-	VertexBuffModify();
+	modifyVertexBuff();
 
 	WORD* indices = 0;
 	IndexBuff->Lock(0, 0, (void**)&indices, 0);
@@ -472,7 +472,7 @@ void Emitter::GeomDataCreate()
 	IndexBuffQuad->Unlock();
 }
 
-void Emitter::CreateParticles()
+void Emitter::createParticles()
 {
 	CountReCreate2 = 0;
 	CountLifeParticle = 0;
@@ -481,7 +481,7 @@ void Emitter::CreateParticles()
 	{
 		if (abs(Data.ReCreateCount) > CountReCreate2 || Data.ReCreateCount == 0)
 		{
-			ReCreateParticles(i);
+			reCreateParticles(i);
 			CountReCreate2++;
 			CountLifeParticle++;
 		}
@@ -496,7 +496,7 @@ void Emitter::CreateParticles()
 
 }
 
-void Emitter::ReCreateParticles(WORD id)
+void Emitter::reCreateParticles(WORD id)
 {
 	//если разброс недопустим то спавним только в точке
 	if (Data.SpawnPosType == PARTICLESTYPE_SPAWNPOS_STRICTLY)
@@ -761,7 +761,7 @@ void Emitter::ReCreateParticles(WORD id)
 	}
 }
 
-void Emitter::UpdateAnimTex(WORD idparticle, DWORD tmptime)
+void Emitter::updateAnimTex(WORD idparticle, DWORD tmptime)
 {
 	if (!isTexInit)
 		return;
@@ -835,7 +835,7 @@ bool Emitter::IsPointInBox(float3* point)
 		return false;
 }
 
-void Emitter::Compute(const float4x4 * mat)
+void Emitter::compute(const float4x4 * mat)
 {
 	if (!Enable)
 		return;
@@ -851,7 +851,7 @@ void Emitter::Compute(const float4x4 * mat)
 			{
 				if (!(Arr[i].IsAlife) && Data.ReCreateCount > CountReCreate2)
 				{
-					ReCreateParticles(i);
+					reCreateParticles(i);
 					CountReCreate2++;
 				}
 				else if (Data.ReCreateCount <= CountReCreate2)
@@ -956,7 +956,7 @@ void Emitter::Compute(const float4x4 * mat)
 
 			//если назначена анимация текстуры то обрабатываем
 			if (Arr[i].AnimTexRateMls > 0)
-				UpdateAnimTex(i, tmptime);
+				updateAnimTex(i, tmptime);
 			/*else if (Data.AnimTexRate > 0 && Data.AnimTexCountCadrsX > 0 && Data.AnimTexCountCadrsY > 0)
 			{
 				Arr[i].AnimTexRateMls = Data.AnimTexRate + (Data.AnimTexRateDisp>0 ? ((rand() % (Data.AnimTexRateDisp / 2)) - (Data.AnimTexRateDisp / 2)) : 0);
@@ -1216,7 +1216,7 @@ void Emitter::Compute(const float4x4 * mat)
 
 
 
-void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
+void Emitter::render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
 {
 	static const float *r_near = GET_PCVAR_FLOAT("r_near");
 	static const float *r_far = GET_PCVAR_FLOAT("r_far");
@@ -1229,7 +1229,7 @@ void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
 		if (SGCore_LoadTexGetTex(IDTex))
 		{
 			isTexInit = true;
-			AnimTexDataInit();
+			initAnimTexData();
 		}
 	}
 
@@ -1239,7 +1239,7 @@ void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
 		if (Data.Size.x != OldSize.x || Data.Size.y != OldSize.y)
 		{
 			OldSize = Data.Size;
-			VertexBuffModify();
+			modifyVertexBuff();
 		}
 
 		CommonParticleDecl2* RTGPUArrVerteces;
@@ -1496,7 +1496,7 @@ void Emitter::Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos)
 	}
 }
 
-int Emitter::TrackCountGet()
+int Emitter::getTrackCount()
 {
 	if (!Enable || !Data.Track || !Data.CollisionDelete)
 		return 0;
@@ -1512,7 +1512,7 @@ int Emitter::TrackCountGet()
 	return count_track;
 }
 
-int Emitter::TrackPosGet(float3** arr, int count)
+int Emitter::getTrackPos(float3** arr, int count)
 {
 	if (!arr || !Enable || !Data.Track || !Data.CollisionDelete)
 		return 0;
diff --git a/source/particles/emitter.h b/source/particles/emitter.h
index 62a2f30aa..965167c6e 100644
--- a/source/particles/emitter.h
+++ b/source/particles/emitter.h
@@ -128,45 +128,45 @@ public:
 
 	SX_ALIGNED_OP_MEM
 
-	void OnLostDevice();
-	void OnResetDevice();
+	void onLostDevice();
+	void onResetDevice();
 
-	void Init(ParticlesData* data);
-	ParticlesData* GetData();
+	void init(ParticlesData* data);
+	ParticlesData* getData();
 
-	void NameSet(const char* name);
-	void NameGet(char* name);
+	void setName(const char* name);
+	void getName(char* name);
 
-	void CountSet(int count);
-	int CountGet();
-	int CountLifeGet();
+	void setCount(int count);
+	int getCount();
+	int getCountLife();
 
-	void EnableSet(bool enable);
-	bool EnableGet();
+	void setEnable(bool enable);
+	bool getEnable();
 
-	void GeomDataCreate();
+	void createGeomData();
 	
-	void Compute(const float4x4 * mat);
-	void ComputeLighting();
-	void Render(DWORD timeDelta, float4x4* matrot, float4x4* matpos);
+	void compute(const float4x4 * mat);
+	void computeLighting();
+	void render(DWORD timeDelta, float4x4* matrot, float4x4* matpos);
 
-	void TextureSet(const char* tex);
-	void TextureSetID(ID tex);
-	ID TextureGetID();
-	void TextureGet(char* tex);
+	void setTexture(const char* tex);
+	void setTextureID(ID tex);
+	ID getTextureID();
+	void getTexture(char* tex);
 
-	void TextureTrackSet(const char* tex);
-	void TextureTrackSetID(ID tex);
-	ID TextureTrackGetID();
-	void TextureTrackGet(char* tex);
+	void setTextureTrack(const char* tex);
+	void setTextureTrackID(ID tex);
+	ID getTextureTrackID();
+	void getTextureTrack(char* tex);
 
-	void AnimTexDataInit();
+	void initAnimTexData();
 
-	void AlifeSet(bool alife);
-	bool AlifeGet();
+	void setAlife(bool alife);
+	bool getAlife();
 
-	int TrackCountGet();
-	int TrackPosGet(float3** arr, int count);
+	int getTrackCount();
+	int getTrackPos(float3** arr, int count);
 
 	float3_t CurrMin;
 	float3_t CurrMax;
@@ -174,7 +174,7 @@ public:
 
 protected:
 
-	void NullingInit();
+	void initNulling();
 
 	char Name[OBJECT_NAME_MAX_LEN];
 
@@ -182,12 +182,12 @@ protected:
 	bool IsPointInSphere(float3* point);
 	bool IsPointInBox(float3* point);
 
-	void CreateParticles();
-	void ReCreateParticles(WORD id);
+	void createParticles();
+	void reCreateParticles(WORD id);
 
-	void VertexBuffModify();
+	void modifyVertexBuff();
 
-	void UpdateAnimTex(WORD idparticle, DWORD tmptime);
+	void updateAnimTex(WORD idparticle, DWORD tmptime);
 	float2_t AnimTexSize;	//размер текстуры
 	float4 AnimSizeCadr;//размер одного кадра, xy - в пикселях, zw - в процентном соотношении к размеру текстуры
 
diff --git a/source/particles/sxparticles.cpp b/source/particles/sxparticles.cpp
index 4497c85ff..6115a6426 100644
--- a/source/particles/sxparticles.cpp
+++ b/source/particles/sxparticles.cpp
@@ -90,14 +90,14 @@ SX_LIB_API void SPE_OnLostDevice()
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->OnLostDevice();
+	ArrEffects->onLostDevice();
 }
 
 SX_LIB_API void SPE_OnResetDevice()
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->OnResetDevice();
+	ArrEffects->onResetDevice();
 }
 
 //**************************************************************************
@@ -106,21 +106,21 @@ SX_LIB_API void SPE_EffectLoad(const char* path)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->Load(path);
+	ArrEffects->load(path);
 }
 
 SX_LIB_API void SPE_EffectSave(const char* path)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->Save(path);
+	ArrEffects->save(path);
 }
 
 SX_LIB_API void SPE_EffectsClear()
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->Clear();
+	ArrEffects->clear();
 }
 
 SX_LIB_API ID SPE_EffectInstanceByName(const char* name)
@@ -141,28 +141,28 @@ SX_LIB_API ID SPE_EffectGetByName(const char* name)
 {
 	PE_PRECOND(-1);
 
-	return ArrEffects->EffectGetByName(name);
+	return ArrEffects->effectGetByName(name);
 }
 
 SX_LIB_API ID SPE_EffectAdd(const char* name)
 {
 	PE_PRECOND(-1);
 
-	return ArrEffects->EffectAdd(name);
+	return ArrEffects->effectAdd(name);
 }
 
 SX_LIB_API int SPE_EffectCountGet()
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EffectCountGet();
+	return ArrEffects->effectGetCount();
 }
 
 SX_LIB_API ID SPE_EffectIdOfKey(ID key)
 {
 	PE_PRECOND(-1);
 
-	return ArrEffects->EffectIdOfKey(key);
+	return ArrEffects->effectGetIdOfKey(key);
 }
 
 SX_LIB_API void SPE_EffectDelete(ID id)
@@ -360,70 +360,70 @@ SX_LIB_API ID SPE_EmitterAdd(ID id, ParticlesData* data)
 {
 	PE_PRECOND(-1);
 
-	return ArrEffects->EmitterAdd(id, data);
+	return ArrEffects->emitterAdd(id, data);
 }
 
 SX_LIB_API int SPE_EmitterSCountGet(ID id)
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EmitterGetCount(id);
+	return ArrEffects->emitterGetCount(id);
 }
 
 SX_LIB_API void SPE_EmitterDelete(ID id, ID id_part)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterDelete(id, id_part);
+	ArrEffects->emitterDelete(id, id_part);
 }
 
 SX_LIB_API ParticlesData* SPE_EmitterGetData(ID id, ID id_part)
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EmitterGetData(id, id_part);
+	return ArrEffects->emitterGetData(id, id_part);
 }
 
 SX_LIB_API void SPE_EmitterReInit(ID id, ID id_part, ParticlesData* data)
 {
 	PE_PRECOND(_VOID);
 
-	return ArrEffects->EmitterReInit(id, id_part, data);
+	return ArrEffects->emitterReInit(id, id_part, data);
 }
 
 SX_LIB_API void SPE_EmitterCountSet(ID id, ID id_part, int count)
 {
 	PE_PRECOND(_VOID);
 
-	return ArrEffects->EmitterCountSet(id, id_part, count);
+	return ArrEffects->emitterSetCount(id, id_part, count);
 }
 
 SX_LIB_API int SPE_EmitterCountGet(ID id, ID id_part)
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EmitterCountGet(id, id_part);
+	return ArrEffects->emitterGetCount(id, id_part);
 }
 
 SX_LIB_API int SPE_EmitterCountLifeGet(ID id, ID id_part)
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EmitterCountLifeGet(id, id_part);
+	return ArrEffects->emitterGetCountLife(id, id_part);
 }
 
 SX_LIB_API void SPE_EmitterEnableSet(ID id, ID id_part, bool enable)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterEnableSet(id, id_part, enable);
+	ArrEffects->emitterSetEnable(id, id_part, enable);
 }
 
 SX_LIB_API bool SPE_EmitterEnableGet(ID id, ID id_part)
 {
 	PE_PRECOND(false);
 
-	return ArrEffects->EmitterEnableGet(id, id_part);
+	return ArrEffects->emitterGetEnable(id, id_part);
 }
 
 
@@ -431,28 +431,28 @@ SX_LIB_API void SPE_EmitterTextureSet(ID id, ID id_part, const char* tex)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterTextureSet(id, id_part, tex);
+	ArrEffects->emitterSetTexture(id, id_part, tex);
 }
 
 SX_LIB_API void SPE_EmitterTextureSetID(ID id, ID id_part, ID tex)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterTextureSetID(id, id_part, tex);
+	ArrEffects->emitterSetTextureID(id, id_part, tex);
 }
 
 SX_LIB_API ID SPE_EmitterTextureGetID(ID id, ID id_part)
 {
 	PE_PRECOND(-1);
 
-	return ArrEffects->EmitterTextureGetID(id, id_part);
+	return ArrEffects->emitterGetTextureID(id, id_part);
 }
 
 SX_LIB_API void SPE_EmitterTextureGet(ID id, ID id_part, char* tex)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterTextureGet(id, id_part, tex);
+	ArrEffects->emitterGetTexture(id, id_part, tex);
 }
 
 
@@ -460,28 +460,28 @@ SX_LIB_API void SPE_EmitterTextureTrackSet(ID id, ID id_part, const char* tex)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterTextureTrackSet(id, id_part, tex);
+	ArrEffects->emitterSetTextureTrack(id, id_part, tex);
 }
 
 SX_LIB_API void SPE_EmitterTextureTrackSetID(ID id, ID id_part, ID tex)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterTextureTrackSetID(id, id_part, tex);
+	ArrEffects->emitterSetTextureTrackID(id, id_part, tex);
 }
 
 SX_LIB_API ID SPE_EmitterTextureTrackGetID(ID id, ID id_part)
 {
 	PE_PRECOND(-1);
 
-	return ArrEffects->EmitterTextureTrackGetID(id, id_part);
+	return ArrEffects->emitterGetTextureTrackID(id, id_part);
 }
 
 SX_LIB_API void SPE_EmitterTextureTrackGet(ID id, ID id_part, char* tex)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterTextureTrackGet(id, id_part, tex);
+	ArrEffects->emitterGetTextureTrack(id, id_part, tex);
 }
 
 
@@ -490,14 +490,14 @@ SX_LIB_API void SPE_EmitterNameSet(ID id, ID id_part, const char* name)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterNameSet(id, id_part, name);
+	ArrEffects->emitterSetName(id, id_part, name);
 }
 
 SX_LIB_API void SPE_EmitterNameGet(ID id, ID id_part, char* name)
 {
 	PE_PRECOND(_VOID);
 
-	ArrEffects->EmitterNameGet(id, id_part, name);
+	ArrEffects->emitterGetName(id, id_part, name);
 }
 
 
@@ -505,12 +505,12 @@ SX_LIB_API int SPE_EmitterTrackCountGet(ID id, ID id_part)
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EmitterTrackCountGet(id, id_part);
+	return ArrEffects->emitterGetTrackCount(id, id_part);
 }
 
 SX_LIB_API int SPE_EmitterTrackPosGet(ID id, ID id_part, float3** arr, int count)
 {
 	PE_PRECOND(0);
 
-	return ArrEffects->EmitterTrackPosGet(id, id_part, arr, count);
+	return ArrEffects->emitterGetTrackPos(id, id_part, arr, count);
 }
\ No newline at end of file
diff --git a/source/pp/sxpp.cpp b/source/pp/sxpp.cpp
index bab8c29ea..6eab4aee7 100644
--- a/source/pp/sxpp.cpp
+++ b/source/pp/sxpp.cpp
@@ -389,6 +389,8 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 	PP_PRECOND(_VOID);
 	PP_PRECOND_SECOND(_VOID);
 
+	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+
 	LPDIRECT3DSURFACE9 RenderSurf, BackBuf;
 	SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize)/*SGCore_RTGetTexture(PPSet::IDsRenderTargets::GetSendRT())*/->GetSurfaceLevel(0, &RenderSurf);
 	PPSet::DXDevice->GetRenderTarget(0, &BackBuf);
@@ -495,6 +497,14 @@ SX_LIB_API void SPP_RenderSSAO(float4_t* param, int quality)
 
 	PPSet::DXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
 	PPSet::IDsRenderTargets::IncrRT();
+
+	if (GetKeyState('N'))
+	{
+		//MessageBox(0,"PP GetKeyState",0,0);
+		char tmppath[1024];
+		sprintf(tmppath, "%sssao.jpg", "C:\\1\\");
+		D3DXSaveTextureToFile(tmppath, D3DXIFF_JPG, SGCore_RTGetTexture(PPSet::IDsRenderTargets::IntermediateWinSize), NULL);
+	}
 }
 
 
diff --git a/source/render/render_func.cpp b/source/render/render_func.cpp
index e989a729e..72a748fac 100644
--- a/source/render/render_func.cpp
+++ b/source/render/render_func.cpp
@@ -6,33 +6,6 @@ See the license in LICENSE
 
 #include "render_func.h"
 
-/*
-namespace SXRenderFunc
-{
-	namespace Delay
-	{
-		int64_t UpdateVisibleForCamera = 0;
-		int64_t UpdateVisibleForLight = 0;
-		int64_t UpdateVisibleForReflection = 0;
-
-		int64_t UpdateShadow = 0;
-		int64_t UpdateParticles = 0;
-		int64_t RenderMRT = 0;
-		int64_t ComLighting = 0;
-		int64_t PostProcess = 0;
-		int64_t ComReflection = 0;
-		int64_t GeomSortGroup = 0;
-
-		int64_t Present = 0;
-
-		int64_t FreeVal = 0;
-		float FreeValF1 = 0;
-		float FreeValF2 = 0;
-		float FreeValF3 = 0;
-	};
-};
-*/
-
 inline void SXRenderFunc::SetSamplerFilter(DWORD id, DWORD value)
 {
 	GData::DXDevice->SetSamplerState(id, D3DSAMP_MAGFILTER, value);
@@ -700,7 +673,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 	{
 		//SXDecals_Render();
 		if (SGeom_ModelsGetCount() > 0)
-			SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE);
+			SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE);
 
 		SXAnim_Render();
 
@@ -753,7 +726,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 	if (!isRenderSimulation)
 	{
 		//если есть что к отрисовке из полупрозрачной геометрии
-		if (SGeom_ModelsSortExistsForRender(MTLTYPE_TRANSPARENCY_ALPHA_LIGHT))
+		if (SGeom_ModelsSortExistsForRender(MTLTYPE_TRANSPARENCY))
 		{
 			//тут такая ситуация ... есть два рабочих варианта, причем работают чутка по разному, возможно я изработался и не могу сообразить что да как ...
 			//первый вариант, чистим в 4, метим 3 раза начиная с нуля (первый раз 0, второй 1 третий 2 НЕ ИНКРЕМЕНТ а метка)
@@ -829,7 +802,7 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 				SML_MtlSetIsIncrCountSurf(true);
 				SML_MtlSetCurrCountSurf(RENDER_LAYER_TRANSPARENT);
 
-				SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_ALPHA_LIGHT, 0, true);
+				SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY, 0, true);
 			}
 
 
@@ -846,10 +819,10 @@ void SXRenderFunc::BuildMRT(DWORD timeDelta, bool isRenderSimulation)
 	}
 	else
 	{
-		if (SML_MtlGetTypeTransparency(GData::Editors::SimModel->GetIDMtl()) != MTLTYPE_TRANSPARENCY_NONE)
+		if (SML_MtlGetSort(GData::Editors::SimModel->GetIDMtl()) != MTLSORT_OPAQUE)
 			SML_MtlSetForceblyAlphaTest(true);
 		GData::Editors::SimModel->Render(timeDelta);
-		if (SML_MtlGetTypeTransparency(GData::Editors::SimModel->GetIDMtl()) != MTLTYPE_TRANSPARENCY_NONE)
+		if (SML_MtlGetSort(GData::Editors::SimModel->GetIDMtl()) != MTLSORT_OPAQUE)
 			SML_MtlSetForceblyAlphaTest(false);
 	}
 
@@ -904,7 +877,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 							SML_LigthsShadowRenderPre(i, k);
 
 							if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k) > -1)
-								SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k));
+								SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k));
 
 							if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k) > -1)
 								SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k));
@@ -944,7 +917,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 					if (SML_LigthsGetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC)
 					{
 						if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0) > -1)
-							SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0));
+							SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, 0));
 							
 						if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, 0) > -1)
 							SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, 0));
@@ -977,7 +950,7 @@ void SXRenderFunc::UpdateShadow(DWORD timeDelta)
 							if (SML_LigthsGetTypeShadowed(i) == LTYPE_SHADOW_DYNAMIC)
 							{
 								if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k) > -1)
-									SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k));
+									SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GEOM, k));
 
 								if (SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k) > -1)
 									SGeom_GreenRender(timeDelta, &GData::ConstCurrCamPos, GREEN_TYPE_TREE, SML_LigthsGetIDArr(i, RENDER_IDARRCOM_GREEN, k));
@@ -1612,7 +1585,7 @@ void SXRenderFunc::UpdateReflectionScene(DWORD timeDelta)
 				if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM)
 				{
 					if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0) >= 0)
-						SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0), false, i, k);
+						SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, 0), false, i, k);
 				}
 
 				if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN)
@@ -1685,7 +1658,7 @@ void SXRenderFunc::UpdateReflectionScene(DWORD timeDelta)
 							if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM)
 							{
 								SGeom_ModelsComVisible(SML_MtlRefGetfrustum(idmat, j), &float3(center), GData::DefaultGeomIDArr);
-								SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE, GData::DefaultGeomIDArr, false, i, k);
+								SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, GData::DefaultGeomIDArr, false, i, k);
 							}
 
 							if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN)
@@ -1699,7 +1672,7 @@ void SXRenderFunc::UpdateReflectionScene(DWORD timeDelta)
 							if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GEOM)
 							{
 								if (SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k) >= 0)
-									SGeom_ModelsRender(timeDelta, MTLTYPE_TRANSPARENCY_NONE, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k), false, i, k);
+									SGeom_ModelsRender(timeDelta, MTLSORT_OPAQUE, SML_MtlRefGetIDArr(idmat, RENDER_IDARRCOM_GEOM, k), false, i, k);
 							}
 
 							if (r_reflection_render && (*r_reflection_render) >= REFLECTION_RENDER_GREEN)
diff --git a/source/score/sound.cpp b/source/score/sound.cpp
index 6c4d69ede..7e1ae3084 100644
--- a/source/score/sound.cpp
+++ b/source/score/sound.cpp
@@ -547,6 +547,11 @@ SOUND_FILEFORMAT CSoundManager::fileFormat(const char* file)
 	return SOUND_FILEFORMAT_UNKNOWN;
 }
 
+void CSoundManager::setMainVolume(float fVolume)
+{
+	m_pPrimaryBuffer->SetVolume(lerpf(-10000, 0, fVolume));
+}
+
 //#############################################################################
 
 void CSoundManager::load(CSound* snd, const char* fpath, SOUND_FILEFORMAT fmt)
diff --git a/source/score/sound.h b/source/score/sound.h
index ba46505b8..0a6b903ae 100644
--- a/source/score/sound.h
+++ b/source/score/sound.h
@@ -197,6 +197,8 @@ public:
 
 	void init(HWND hWnd);
 
+	void setMainVolume(float fVolume);
+
 	//! структура данных для воспроизведения с задержками
 	struct CPlayDelay
 	{
diff --git a/source/score/sxscore.cpp b/source/score/sxscore.cpp
index 6c8842c98..f22d61938 100644
--- a/source/score/sxscore.cpp
+++ b/source/score/sxscore.cpp
@@ -80,6 +80,13 @@ SX_LIB_API void SSCore_Update(const float3 *pViewPos, const float3 *pViewDir)
 	g_pManagerSound->update(pViewPos, pViewDir);
 }
 
+SX_LIB_API void SSCore_SetMainVolume(float fVolume)
+{
+	SCORE_PRECOND(_VOID);
+
+	g_pManagerSound->setMainVolume(fVolume);
+}
+
 SX_LIB_API int SSCore_SndsGetCountPlay()
 {
 	SCORE_PRECOND(0);
diff --git a/source/score/sxscore.h b/source/score/sxscore.h
index 720b23952..fcb24385c 100644
--- a/source/score/sxscore.h
+++ b/source/score/sxscore.h
@@ -184,7 +184,10 @@ SX_LIB_API void SSCore_Clear();
 SX_LIB_API void SSCore_Update(
 	const float3 *pViewPpos,//!< текущая позиция наблюдателя
 	const float3 *pViewDir	//!< текущее направление взгляда
-	);	
+	);
+
+//! установка общей громкости
+SX_LIB_API void SSCore_SetMainVolume(float fVolume);
 
 //! количество проигрываемых на данный момент звуков
 SX_LIB_API int SSCore_SndsGetCountPlay();
diff --git a/source/skyxengine.cpp b/source/skyxengine.cpp
index 66db341e6..eb868786c 100644
--- a/source/skyxengine.cpp
+++ b/source/skyxengine.cpp
@@ -174,7 +174,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 	Core_RIntSet(G_RI_INT_TIMER_RENDER, idTimerRender);
 	Core_RIntSet(G_RI_INT_TIMER_GAME, idTimerGame);
 
-	tm ct = { 0, 0, 8, 27, 5, 2030 - 1900, 0, 0, 0 };
+	tm ct = { 0, 0, 5, 27, 5, 2030 - 1900, 0, 0, 0 };
 	Core_TimeUnixStartSet(idTimerGame, mktime(&ct));
 
 	Core_TimeWorkingSet(idTimerRender, true);
@@ -221,7 +221,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 
 	SGCore_SetFunc_MtlSet(SkyXEngine_RFuncMtlSet);
 	SGCore_SetFunc_MtlLoad(SkyXEngine_RFuncMtlLoad);
-	SGCore_SetFunc_MtlGetSort((g_func_mtl_get_sort)SML_MtlGetTypeTransparency);
+	SGCore_SetFunc_MtlGetSort((g_func_mtl_get_sort)SML_MtlGetSort);
 	SGCore_SetFunc_MtlGroupRenderIsSingly((g_func_mtl_group_render_is_singly)SML_MtlGetTypeReflection);
 	SGCore_SetFunc_MtlGetPhysicType((g_func_mtl_get_physic_type)SML_MtlGetPhysicMaterial);
 
@@ -322,7 +322,7 @@ void SkyXEngine_Init(HWND hWnd3D, HWND hWndParent3D)
 
 
 #ifndef SX_GAME
-	ISXCamera *pCamera = SGCore_CrCamera();
+	ICamera *pCamera = SGCore_CrCamera();
 	static const float *r_default_fov = GET_PCVAR_FLOAT("r_default_fov");
 	pCamera->setFOV(*r_default_fov);
 
@@ -487,6 +487,8 @@ void SkyXEngine_CreateLoadCVar()
 	Core_0RegisterCVarFloat("env_weather_snd_volume", 1.f, "Громкость звуков погоды [0,1]");
 	Core_0RegisterCVarFloat("env_ambient_snd_volume", 1.f, "Громкость фоновых звуков на уровне [0,1]");
 
+	Core_0RegisterCVarFloat("snd_main_volume", 1.f, "Общая громкость звуков (первичного звукового буфера) [0, 1] ");
+
 	Core_0RegisterConcmd("screenshot", SRender_SaveScreenShot);
 	Core_0RegisterConcmd("save_worktex", SRender_SaveWorkTex);
 	Core_0RegisterConcmd("shader_reload", SGCore_ShaderReloadAll);
@@ -589,13 +591,6 @@ HWND SkyXEngine_CreateWindow(const char *szName, const char *szCaption, int iWid
 
 void SkyXEngine_Frame(DWORD timeDelta)
 {
-
-	if (SSInput_GetKeyState(SIK_O))
-	{
-		SLevel_Clear();
-		SLevel_Load("stalker_atp", true);
-	}
-
 	static IDirect3DDevice9 *pDXDevice = SGCore_GetDXDevice();
 	static float3 vCamPos, vCamDir;
 	static float4x4 mView, mProjLight;
@@ -786,6 +781,9 @@ void SkyXEngine_Frame(DWORD timeDelta)
 
 	pDXDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
 	pDXDevice->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE);
+	pDXDevice->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE);
+	pDXDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
+	pDXDevice->SetRenderState(D3DRS_STENCILENABLE, FALSE);
 
 #if defined(SX_GAME)
 	ttime = TimeGetMcsU(Core_RIntGet(G_RI_INT_TIMER_RENDER));
@@ -1185,6 +1183,10 @@ void SkyXEngind_UpdateDataCVar()
 		*r_win_windowed = true;
 #endif
 	}
+
+	static const float * snd_main_volume = GET_PCVAR_FLOAT("snd_main_volume");
+	if (snd_main_volume)
+		SSCore_SetMainVolume(*snd_main_volume);
 }
 
 //#############################################################################
diff --git a/source/sxgenpreview/sxgenpreview.cpp b/source/sxgenpreview/sxgenpreview.cpp
index 4e969c072..2381125f0 100644
--- a/source/sxgenpreview/sxgenpreview.cpp
+++ b/source/sxgenpreview/sxgenpreview.cpp
@@ -86,7 +86,7 @@ UINT CreatePreviewModels()
 	float4x4 mProjection = SMMatrixPerspectiveFovLH(SM_PIDIV2, 1.f, 0.025f, 100000.f);
 
 
-	ISXCamera *pCamera = SGCore_CrCamera();
+	ICamera *pCamera = SGCore_CrCamera();
 	//pCamera->setFOV(SM_PIDIV2);
 
 
diff --git a/source/sxleveleditor/common_callback.cpp b/source/sxleveleditor/common_callback.cpp
index 78c125b62..9c2c56ebd 100644
--- a/source/sxleveleditor/common_callback.cpp
+++ b/source/sxleveleditor/common_callback.cpp
@@ -58,7 +58,7 @@ void SXLevelEditor::LevelOpen()
 	//char szSelPath[2014];
 	gui_func::dialogs::SelectDirOwn(tmpname, tmppath, Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS), "Open level", false, false, 0, HandlerPreviewLevel);
 	
-	if (def_str_validate(tmppath))
+	if (STR_VALIDATE(tmppath))
 	{
 		//StrCutNameNEx(tmppath, tmpname);
 		SLevel_Load(tmpname, false);
@@ -108,7 +108,7 @@ void SXLevelEditor::LevelSaveAs()
 	char tmpname[1024];
 	//gui_func::dialogs::SelectFileStd(SXGUI_DIALOG_FILE_SAVE, tmppath, 0, Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS), FILE_FILTER_LEVEL);
 	gui_func::dialogs::SelectDirOwn(tmpname, tmppath, Core_RStringGet(G_RI_STRING_PATH_GS_LEVELS), "Save level", false, true, 0/*, HandlerPreviewLevel*/);
-	if(def_str_validate(tmppath))
+	if (STR_VALIDATE(tmppath))
 	{
 		//StrCutNameNEx(tmppath, tmpname);
 		SLevel_Save(tmpname);
@@ -282,17 +282,17 @@ LRESULT SXLevelEditor_RenderWindow_MouseMove(HWND hwnd, UINT msg, WPARAM wParam,
 	if (SSInput_GetKeyState(SIK_LCONTROL) || SSInput_GetKeyState(SIK_LSHIFT))
 		return 0;
 
-	SXLevelEditor::ObjAxesHelper->OnMouseMove(((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)));
+	SXLevelEditor::ObjAxesHelper->onMouseMove(((int)(short)LOWORD(lParam)), ((int)(short)HIWORD(lParam)));
 
 	if (SXLevelEditor::ObjAxesHelper->m_bIsDragging == false)
 		return 0;
 
 	if (SXLevelEditor::ActiveGroupType == EDITORS_LEVEL_GROUPTYPE_GEOM && SXLevelEditor::ActiveElement >= 0)
 	{
-		if (SXLevelEditor::ObjAxesHelper->GetType() == AxesHelper::HT_MOVE)
+		if (SXLevelEditor::ObjAxesHelper->getType() == CAxesHelper::HANDLER_TYPE_MOVE)
 		{
 			float3* pos = SGeom_ModelsMGetPosition(SXLevelEditor::ActiveElement);
-			float3 npos = (*pos) + (SXLevelEditor::ObjAxesHelper->GetPosition() - SXLevelEditor::HelperPos);
+			float3 npos = (*pos) + (SXLevelEditor::ObjAxesHelper->getPosition() - SXLevelEditor::HelperPos);
 			if ((*pos).x != npos.x || (*pos).y != npos.y || (*pos).z != npos.z)
 			{
 				*pos = npos;
@@ -304,17 +304,17 @@ LRESULT SXLevelEditor_RenderWindow_MouseMove(HWND hwnd, UINT msg, WPARAM wParam,
 				SXLevelEditor::HelperPos = (max + min) * 0.5f;
 			}
 		}
-		else if (SXLevelEditor::ObjAxesHelper->GetType() == AxesHelper::HT_ROTATE)
+		else if (SXLevelEditor::ObjAxesHelper->getType() == CAxesHelper::HANDLER_TYPE_ROTATE)
 		{
 			float3* rot = SGeom_ModelsMGetRotation(SXLevelEditor::ActiveElement);
-			float3 nrot = SXLevelEditor::ObjAxesHelper->GetRotation();
+			float3 nrot = SXLevelEditor::ObjAxesHelper->getRotation();
 			if ((*rot).x != nrot.x || (*rot).y != nrot.y || (*rot).z != nrot.z)
 			{
-				*rot = SXLevelEditor::ObjAxesHelper->GetRotation();
+				*rot = SXLevelEditor::ObjAxesHelper->getRotation();
 				SGeom_ModelsMApplyTransform(SXLevelEditor::ActiveElement);
 			}
 		}
-		else if (SXLevelEditor::ObjAxesHelper->GetType() == AxesHelper::HT_SCALE)
+		else if (SXLevelEditor::ObjAxesHelper->getType() == CAxesHelper::HANDLER_TYPE_SCALE)
 		{
 			float3* scale = SGeom_ModelsMGetScale(SXLevelEditor::ActiveElement);
 			float3 nscale = SXLevelEditor::ObjAxesHelper->getScale() - float3(1,1,1);
@@ -331,7 +331,7 @@ LRESULT SXLevelEditor_RenderWindow_MouseMove(HWND hwnd, UINT msg, WPARAM wParam,
 		{
 			float3_t pos;
 			SGeom_GreenGetPosObject(SXLevelEditor::ActiveElement, SXLevelEditor::ActiveGreenSplit, SXLevelEditor::ActiveGreenObject, &pos);
-			float3 helperpos = SXLevelEditor::ObjAxesHelper->GetPosition();
+			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);
@@ -344,10 +344,10 @@ LRESULT SXLevelEditor_RenderWindow_MouseMove(HWND hwnd, UINT msg, WPARAM wParam,
 		if (!bEnt)
 			return 0;
 
-		if (SXLevelEditor::ObjAxesHelper->GetType() == AxesHelper::HT_MOVE)
-			bEnt->setPos(SXLevelEditor::ObjAxesHelper->GetPosition());
-		else if (SXLevelEditor::ObjAxesHelper->GetType() == AxesHelper::HT_ROTATE)
-			bEnt->setOrient(SXLevelEditor::ObjAxesHelper->GetRotationQ());
+		if (SXLevelEditor::ObjAxesHelper->getType() == CAxesHelper::HANDLER_TYPE_MOVE)
+			bEnt->setPos(SXLevelEditor::ObjAxesHelper->getPosition());
+		else if (SXLevelEditor::ObjAxesHelper->getType() == CAxesHelper::HANDLER_TYPE_ROTATE)
+			bEnt->setOrient(SXLevelEditor::ObjAxesHelper->getRotationQ());
 
 		SXLevelEditor::GameUpdatePosRot();
 	}
@@ -439,9 +439,9 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 				SXLevelEditor::EditGreenSelY->setText(String(pos2.y).c_str());
 				SXLevelEditor::EditGreenSelZ->setText(String(pos2.z).c_str());
 				
-				SXLevelEditor::ObjAxesHelper->SetPosition(pos2);
-				SXLevelEditor::ObjAxesHelper->SetRotation(float3(0,0,0));
-				SXLevelEditor::ObjAxesHelper->SetScale(float3(1, 1, 1));
+				SXLevelEditor::ObjAxesHelper->setPosition(pos2);
+				SXLevelEditor::ObjAxesHelper->setRotation(float3(0,0,0));
+				SXLevelEditor::ObjAxesHelper->setScale(float3(1, 1, 1));
 
 				SXLevelEditor::IdMtl = idmtl;
 			}
@@ -462,9 +462,9 @@ LRESULT SXLevelEditor_RenderWindow_LClick(HWND hwnd, UINT msg, WPARAM wParam, LP
 				SXLevelEditor::EditGreenSelY->setText(String(_res.y).c_str());
 				SXLevelEditor::EditGreenSelZ->setText(String(_res.z).c_str());
 
-				SXLevelEditor::ObjAxesHelper->SetPosition(pos2);
-				SXLevelEditor::ObjAxesHelper->SetRotation(float3(0, 0, 0));
-				SXLevelEditor::ObjAxesHelper->SetScale(float3(1, 1, 1));
+				SXLevelEditor::ObjAxesHelper->setPosition(pos2);
+				SXLevelEditor::ObjAxesHelper->setRotation(float3(0, 0, 0));
+				SXLevelEditor::ObjAxesHelper->setScale(float3(1, 1, 1));
 				
 				int qwert = 0;
 			}
@@ -895,7 +895,7 @@ LRESULT SXLevelEditor_ToolBar1_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 			SXLevelEditor::CheckBoxTBPos->setCheck(false);
 			SXLevelEditor::CheckBoxTBRot->setCheck(false);
 			SXLevelEditor::CheckBoxTBScale->setCheck(false);
-			SXLevelEditor::ObjAxesHelper->SetType(AxesHelper::HT_NONE);
+			SXLevelEditor::ObjAxesHelper->setType(CAxesHelper::HANDLER_TYPE_NONE);
 		}
 		else if (SXLevelEditor::CheckBoxTBPos->getHWND() == handle_elem)
 		{
@@ -911,7 +911,7 @@ LRESULT SXLevelEditor_ToolBar1_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 				SXLevelEditor::CheckBoxTBArrow->setCheck(false);
 				SXLevelEditor::CheckBoxTBRot->setCheck(false);
 				SXLevelEditor::CheckBoxTBScale->setCheck(false);
-				SXLevelEditor::ObjAxesHelper->SetType(AxesHelper::HT_MOVE);
+				SXLevelEditor::ObjAxesHelper->setType(CAxesHelper::HANDLER_TYPE_MOVE);
 			}
 			else
 				SXLevelEditor::CheckBoxTBPos->setCheck(false);
@@ -923,7 +923,7 @@ LRESULT SXLevelEditor_ToolBar1_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 				SXLevelEditor::CheckBoxTBArrow->setCheck(false);
 				SXLevelEditor::CheckBoxTBPos->setCheck(false);
 				SXLevelEditor::CheckBoxTBScale->setCheck(false);
-				SXLevelEditor::ObjAxesHelper->SetType(AxesHelper::HT_ROTATE);
+				SXLevelEditor::ObjAxesHelper->setType(CAxesHelper::HANDLER_TYPE_ROTATE);
 			}
 			else
 				SXLevelEditor::CheckBoxTBRot->setCheck(false);
@@ -935,7 +935,7 @@ LRESULT SXLevelEditor_ToolBar1_CallWmCommand(HWND hwnd, UINT msg, WPARAM wParam,
 				SXLevelEditor::CheckBoxTBPos->setCheck(false);
 				SXLevelEditor::CheckBoxTBRot->setCheck(false);
 				SXLevelEditor::CheckBoxTBArrow->setCheck(false);
-				SXLevelEditor::ObjAxesHelper->SetType(AxesHelper::HT_SCALE);
+				SXLevelEditor::ObjAxesHelper->setType(CAxesHelper::HANDLER_TYPE_SCALE);
 			}
 			else
 				SXLevelEditor::CheckBoxTBScale->setCheck(false);
diff --git a/source/sxleveleditor/game_callback.cpp b/source/sxleveleditor/game_callback.cpp
index 2fbe3b32d..58a564383 100644
--- a/source/sxleveleditor/game_callback.cpp
+++ b/source/sxleveleditor/game_callback.cpp
@@ -187,9 +187,9 @@ void SXLevelEditor::GameSel(int sel)
 	}
 	//-------
 	
-	SXLevelEditor::ObjAxesHelper->SetPosition(bEnt->getPos());
-	SXLevelEditor::ObjAxesHelper->SetRotation(bEnt->getOrient());
-	SXLevelEditor::ObjAxesHelper->SetScale(float3(1, 1, 1));
+	SXLevelEditor::ObjAxesHelper->setPosition(bEnt->getPos());
+	SXLevelEditor::ObjAxesHelper->setRotation(bEnt->getOrient());
+	SXLevelEditor::ObjAxesHelper->setScale(float3(1, 1, 1));
 }
 
 void SXLevelEditor::GameUpdatePosRot()
diff --git a/source/sxleveleditor/green_callback.cpp b/source/sxleveleditor/green_callback.cpp
index efdf8d713..4db307b0d 100644
--- a/source/sxleveleditor/green_callback.cpp
+++ b/source/sxleveleditor/green_callback.cpp
@@ -297,7 +297,7 @@ LRESULT SXLevelEditor_ButtonGreenGenerate_Click(HWND hwnd, UINT msg, WPARAM wPar
 		return 0;
 	}
 
-	if (def_str_validate(tmp_navmesh) && !FileExistsFile(path_navmesh))
+	if (STR_VALIDATE(tmp_navmesh) && !FileExistsFile(path_navmesh))
 	{
 		char tmpstr[2048];
 		sprintf(tmpstr, "%s%s%s", "Model [", path_navmesh, "] not found");
@@ -324,7 +324,7 @@ LRESULT SXLevelEditor_ButtonGreenGenerate_Click(HWND hwnd, UINT msg, WPARAM wPar
 		}
 	}
 
-	if (!def_str_validate(tmp_name))
+	if (!STR_VALIDATE(tmp_name))
 	{
 		if (MessageBox(0, "No name for the model, enter the file name automatically?", 0, MB_YESNO | MB_ICONWARNING | MB_TASKMODAL) == IDYES)
 		{
diff --git a/source/sxleveleditor/level_editor.cpp b/source/sxleveleditor/level_editor.cpp
index c687cb701..ebac38b87 100644
--- a/source/sxleveleditor/level_editor.cpp
+++ b/source/sxleveleditor/level_editor.cpp
@@ -240,7 +240,7 @@ namespace SXLevelEditor
 
 
 	ID3DXMesh* FigureBox = 0;
-	AxesHelper* ObjAxesHelper = 0;
+	CAxesHelper* ObjAxesHelper = 0;
 
 	int ActiveGroupType = 0;		//!< ������� ���������� ������ ������� ��������� EDITORS_LEVEL_GROUPTYPE_
 	ID ActiveGreenSplit = -1;		//!< ������� ������������� ������ �������������� (���� �������� ��������������)
@@ -2161,7 +2161,7 @@ void SXLevelEditor::LevelEditorUpdate(DWORD timeDelta)
 	{
 		SGCore_GetDXDevice()->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
 		SGCore_GetDXDevice()->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_FALSE);
-		SXLevelEditor::ObjAxesHelper->Render();
+		SXLevelEditor::ObjAxesHelper->render();
 		SGCore_GetDXDevice()->SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE);
 		SGCore_GetDXDevice()->SetRenderState(D3DRS_ZWRITEENABLE, D3DZB_TRUE);
 	}
@@ -2171,7 +2171,7 @@ void SXLevelEditor::LevelEditorUpdate(DWORD timeDelta)
 
 void SXLevelEditor::LEcreateData()
 {
-	SXLevelEditor::ObjAxesHelper = new AxesHelper();
+	SXLevelEditor::ObjAxesHelper = new CAxesHelper();
 	D3DXCreateBox(SGCore_GetDXDevice(), 1, 1, 1, &SXLevelEditor::FigureBox, 0);
 }
 
diff --git a/source/sxleveleditor/level_editor.h b/source/sxleveleditor/level_editor.h
index 05682de07..e4881435e 100644
--- a/source/sxleveleditor/level_editor.h
+++ b/source/sxleveleditor/level_editor.h
@@ -281,7 +281,7 @@ namespace SXLevelEditor
 	void LEdeleteData();
 
 	extern ID3DXMesh* FigureBox;
-	extern AxesHelper* ObjAxesHelper;	//!< ������ ������� �������������
+	extern CAxesHelper* ObjAxesHelper;	//!< ������ ������� �������������
 
 	extern int ActiveGroupType;		//!< ������� ���������� ������ ������� ��������� EDITORS_LEVEL_GROUPTYPE_
 	extern ID ActiveGreenSplit;		//!< ������� ������������� ������ �������������� (���� �������� ��������������)
diff --git a/source/sxleveleditor/model_callback.cpp b/source/sxleveleditor/model_callback.cpp
index ad67fbbf3..c4868893e 100644
--- a/source/sxleveleditor/model_callback.cpp
+++ b/source/sxleveleditor/model_callback.cpp
@@ -74,9 +74,9 @@ void SXLevelEditor::GeomSel(int sel)
 		SXLevelEditor::HelperPos = (max + min) * 0.5f;
 		SXLevelEditor::HelperScale = *scale;
 
-		SXLevelEditor::ObjAxesHelper->SetPosition(SXLevelEditor::HelperPos);
-		SXLevelEditor::ObjAxesHelper->SetRotation(*rot);
-		SXLevelEditor::ObjAxesHelper->SetScale(float3(1,1,1));
+		SXLevelEditor::ObjAxesHelper->setPosition(SXLevelEditor::HelperPos);
+		SXLevelEditor::ObjAxesHelper->setRotation(*rot);
+		SXLevelEditor::ObjAxesHelper->setScale(float3(1,1,1));
 
 		SXLevelEditor::EditGeomName->setText(tmpname);
 
@@ -178,7 +178,7 @@ LRESULT SXLevelEditor_ButtonGeomFinish_Click(HWND hwnd, UINT msg, WPARAM wParam,
 	SXLevelEditor::EditGeomModel->getText(path_model, 1024);
 	SXLevelEditor::EditGeomLod1->getText(path_model_lod, 1024);
 
-	if (!def_str_validate(path_model))
+	if (!STR_VALIDATE(path_model))
 	{
 		return 0;
 	}
@@ -194,7 +194,7 @@ LRESULT SXLevelEditor_ButtonGeomFinish_Click(HWND hwnd, UINT msg, WPARAM wParam,
 	}
 
 	sprintf(tmppath, "%s%s", Core_RStringGet(G_RI_STRING_PATH_GS_MESHES), path_model_lod);
-	if (def_str_validate(path_model_lod) && !FileExistsFile(tmppath))
+	if (STR_VALIDATE(path_model_lod) && !FileExistsFile(tmppath))
 	{
 		char tmpstr[2048];
 		sprintf(tmpstr, "%s%s%s", "Model/lod [", path_model_lod, "] not found");
@@ -202,7 +202,7 @@ LRESULT SXLevelEditor_ButtonGeomFinish_Click(HWND hwnd, UINT msg, WPARAM wParam,
 		return 0;
 	}
 
-	if (!def_str_validate(model_name))
+	if (!STR_VALIDATE(model_name))
 	{
 		if (MessageBox(0, "No name for the model, enter the file name automatically?", 0, MB_YESNO | MB_ICONWARNING | MB_TASKMODAL) == IDYES)
 		{
@@ -220,7 +220,7 @@ LRESULT SXLevelEditor_ButtonGeomFinish_Click(HWND hwnd, UINT msg, WPARAM wParam,
 	}
 
 
-	SGeom_ModelsAddModel(path_model, (def_str_validate(path_model_lod) ? path_model_lod : 0), model_name);
+	SGeom_ModelsAddModel(path_model, (STR_VALIDATE(path_model_lod) ? path_model_lod : 0), model_name);
 
 	char tmpnamecountpoly[1024];
 	sprintf(tmpnamecountpoly, "%s | %d", SGeom_ModelsMGetName(SGeom_ModelsGetCount() - 1), SGeom_ModelsMGetCountPoly(SGeom_ModelsGetCount() - 1));
diff --git a/source/sxmaterialeditor/common_callback.cpp b/source/sxmaterialeditor/common_callback.cpp
index 9b1fd2eb5..437d1a244 100644
--- a/source/sxmaterialeditor/common_callback.cpp
+++ b/source/sxmaterialeditor/common_callback.cpp
@@ -18,6 +18,7 @@ void SXMaterialEditor::MtlOpen()
 	if (gui_func::dialogs::SelectFileOwn(tmpname, tmppath, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), "dds", "Select textures", true, Core_RStringGet(G_RI_STRING_PATH_GS_TEXTURES), SXMaterialEditor::JobWindow->getHWND(), SkyXEngine_EditorHandlerGetPreviewData, SkyXEngine_EditorHandlerGetTextureInfo))
 	{
 		SML_MtlReloadMaterial(SRender_SimModelGetIDMtl(), tmpname);
+		SML_MtlSetIsTextureLighting(SRender_SimModelGetIDMtl(), false);
 		SGCore_LoadTexAllLoad();
 
 		char headertest[1024];
@@ -193,96 +194,100 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa
 		{
 			SML_MtlSetLighting(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxLighting->getCheck());
 		}
+		else if (SXMaterialEditor::CheckBoxTransparent->getHWND() == handle_elem)
+		{
+			SML_MtlSetTransparency(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxTransparent->getCheck());
+		}
 		else if (SXMaterialEditor::CheckBoxTexLighting->getHWND() == handle_elem)
 		{
 			SML_MtlSetIsTextureLighting(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxTexLighting->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSVVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::CheckBoxDoSVVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::CheckBoxDoSVVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSWVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::CheckBoxDoSWVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::CheckBoxDoSWVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSWPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::CheckBoxDoSWPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLD, SXMaterialEditor::CheckBoxDoSWPS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSVPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::CheckBoxDoSVPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_VIEW, SXMaterialEditor::CheckBoxDoSVPS->getCheck());
 		}
 
 		else if (SXMaterialEditor::CheckBoxDoSPVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::CheckBoxDoSPVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::CheckBoxDoSPVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSPPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::CheckBoxDoSPPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_PROJECTION, SXMaterialEditor::CheckBoxDoSPPS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSWVVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::CheckBoxDoSWVVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::CheckBoxDoSWVVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSWVPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::CheckBoxDoSWVPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEW, SXMaterialEditor::CheckBoxDoSWVPS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSCamposVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::CheckBoxDoSCamposVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::CheckBoxDoSCamposVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSWVPVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::CheckBoxDoSWVPVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::CheckBoxDoSWVPVS->getCheck());
 		}
 
 		else if (SXMaterialEditor::CheckBoxDoSWVPPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::CheckBoxDoSWVPPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ, SXMaterialEditor::CheckBoxDoSWVPPS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSCamposPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::CheckBoxDoSCamposPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_CAMPOS, SXMaterialEditor::CheckBoxDoSCamposPS->getCheck());
 		}
 
 		else if (SXMaterialEditor::CheckBoxUDVSInPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetUDVS_InPS(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxUDVSInPS->getCheck());
+			SML_MtlSetUserDataVS_InPS(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxUDVSInPS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSTimeDeltaVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::CheckBoxDoSTimeDeltaVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::CheckBoxDoSTimeDeltaVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSTimeDeltaPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::CheckBoxDoSTimeDeltaPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_TIMEDELTA, SXMaterialEditor::CheckBoxDoSTimeDeltaPS->getCheck());
 		}
 
 		else if (SXMaterialEditor::CheckBoxDoSWinSizeVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::CheckBoxDoSWinSizeVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::CheckBoxDoSWinSizeVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxDoSWinSizePS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::CheckBoxDoSWinSizePS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_WINSIZE, SXMaterialEditor::CheckBoxDoSWinSizePS->getCheck());
 		}
 
 
 		else if (SXMaterialEditor::CheckBoxUDPSInVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetUDPS_InVS(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxUDPSInVS->getCheck());
+			SML_MtlSetUserDataPS_InVS(SXMaterialEditor::IDMat, SXMaterialEditor::CheckBoxUDPSInVS->getCheck());
 		}
 
 		else if (SXMaterialEditor::CheckBoxUDVS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::CheckBoxUDVS->getCheck());
+			SML_MtlSetStdVS(SXMaterialEditor::IDMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::CheckBoxUDVS->getCheck());
 		}
 		else if (SXMaterialEditor::CheckBoxUDPS->getHWND() == handle_elem)
 		{
-			SML_MtlSetSTDPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::CheckBoxUDPS->getCheck());
+			SML_MtlSetStdPS(SXMaterialEditor::IDMat, MTL_SHADERSTD_USERDATA, SXMaterialEditor::CheckBoxUDPS->getCheck());
 		}
 
 		else if (SXMaterialEditor::CheckBoxAlphaTest->getHWND() == handle_elem)
@@ -302,10 +307,10 @@ LRESULT SXMaterialEditor_JobWindow_CallWmCommand(HWND hwnd, UINT msg, WPARAM wPa
 		{
 			SRender_SimModelSetNumCurrModel(SXMaterialEditor::ComboBoxTestModel->getSel());
 		}
-		else if (SXMaterialEditor::ComboBoxTypeRefract->getHWND() == handle_elem)
+		/*else if (SXMaterialEditor::ComboBoxTypeRefract->getHWND() == handle_elem)
 		{
 			SML_MtlSetTypeTransparency(SXMaterialEditor::IDMat, (MTLTYPE_TRANSPARENCY)SXMaterialEditor::ComboBoxTypeRefract->getSel());
-		}
+		}*/
 		else if (SXMaterialEditor::ComboBoxTypeReflect->getHWND() == handle_elem)
 		{
 			SML_MtlSetTypeReflection(SXMaterialEditor::IDMat, (MTLTYPE_REFLECT)SXMaterialEditor::ComboBoxTypeReflect->getSel());
@@ -369,13 +374,13 @@ void SXMaterialEditor::Nulling()
 	SXMaterialEditor::EditF0->setText("0");
 	SXMaterialEditor::EditMR->setText("");
 	SXMaterialEditor::CheckBoxLighting->setCheck(true);
+	SXMaterialEditor::CheckBoxTransparent->setCheck(false);
 	SXMaterialEditor::TrackBarRoughness->setPos(0);
 	SXMaterialEditor::TrackBarThickness->setPos(100);
 	SXMaterialEditor::TrackBarF0->setPos(0);
 	SXMaterialEditor::TrackBarUDVSX->setPos(0);
 	SXMaterialEditor::EditTexLighting->setText("");
 	SXMaterialEditor::CheckBoxTexLighting->setCheck(false);
-	SXMaterialEditor::ComboBoxTypeRefract->setSel(0);
 	SXMaterialEditor::CheckBoxDoSVVS->setCheck(false);
 	SXMaterialEditor::ComboBoxTypeReflect->setSel(0);
 	SXMaterialEditor::ComboBoxPhysic->setSel(0);
@@ -462,20 +467,23 @@ void SXMaterialEditor::InitMtl(ID id)
 	SXMaterialEditor::EditRoughness->setText(String(SML_MtlGetRoughness(SRender_SimModelGetIDMtl())).c_str());
 	SXMaterialEditor::EditThickness->setText(String(SML_MtlGetThickness(SRender_SimModelGetIDMtl())).c_str());
 	SXMaterialEditor::EditF0->setText(String(SML_MtlGetF0(SRender_SimModelGetIDMtl())).c_str());
-	SXMaterialEditor::EditPenetration->setText(String(SML_MtlGetPenetration(SRender_SimModelGetIDMtl())).c_str());
+	SXMaterialEditor::EditHitChance->setText(String(SML_MtlGetHitChance(SRender_SimModelGetIDMtl())).c_str());
+	SXMaterialEditor::EditDurability->setText(String(SML_MtlGetDurability(SRender_SimModelGetIDMtl())).c_str());
+	SXMaterialEditor::EditDensity->setText(String(SML_MtlGetDensity(SRender_SimModelGetIDMtl())).c_str());
 	
 	SXMaterialEditor::CheckBoxLighting->setCheck(SML_MtlGetLighting(SRender_SimModelGetIDMtl()));
 
+	SXMaterialEditor::CheckBoxTransparent->setCheck(SML_MtlGetTransparency(SRender_SimModelGetIDMtl()));
+
 	SXMaterialEditor::TrackBarRoughness->setPos(SML_MtlGetRoughness(SRender_SimModelGetIDMtl())*100.f);
 	SXMaterialEditor::TrackBarThickness->setPos(SML_MtlGetThickness(SRender_SimModelGetIDMtl())*100.f);
 	SXMaterialEditor::TrackBarF0->setPos(SML_MtlGetF0(SRender_SimModelGetIDMtl()) * 100.f);
-	SXMaterialEditor::TrackBarPenetration->setPos(SML_MtlGetPenetration(SRender_SimModelGetIDMtl()) * 100.f);
+	SXMaterialEditor::TrackBarHitChance->setPos(SML_MtlGetHitChance(SRender_SimModelGetIDMtl()) * 100.f);
 
 	SML_MtlGetTextureLighting(SRender_SimModelGetIDMtl(), tmppath);
 	SXMaterialEditor::EditTexLighting->setText(tmppath);
 	SXMaterialEditor::CheckBoxTexLighting->setCheck(SML_MtlGetIsTextureLighting(SRender_SimModelGetIDMtl()));
 	
-	SXMaterialEditor::ComboBoxTypeRefract->setSel(SML_MtlGetTypeTransparency(SRender_SimModelGetIDMtl()));
 	SXMaterialEditor::ComboBoxTypeReflect->setSel(SML_MtlGetTypeReflection(SRender_SimModelGetIDMtl()));
 
 	SXMaterialEditor::ComboBoxPhysic->setSel(0);
@@ -501,66 +509,66 @@ void SXMaterialEditor::InitMtl(ID id)
 	SML_MtlGetDTex(SRender_SimModelGetIDMtl(), 3, tmppath);
 	SXMaterialEditor::EditDA->setText(tmppath);
 
-	SXMaterialEditor::CheckBoxDoSWVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD));
-	SXMaterialEditor::CheckBoxDoSWPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD));
+	SXMaterialEditor::CheckBoxDoSWVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD));
+	SXMaterialEditor::CheckBoxDoSWPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLD));
 
-	SXMaterialEditor::CheckBoxDoSVVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW));
-	SXMaterialEditor::CheckBoxDoSVPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW));
+	SXMaterialEditor::CheckBoxDoSVVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW));
+	SXMaterialEditor::CheckBoxDoSVPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_VIEW));
 
-	SXMaterialEditor::CheckBoxDoSPVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION));
-	SXMaterialEditor::CheckBoxDoSPPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION));
+	SXMaterialEditor::CheckBoxDoSPVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION));
+	SXMaterialEditor::CheckBoxDoSPPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_PROJECTION));
 
-	SXMaterialEditor::CheckBoxDoSWVVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW));
-	SXMaterialEditor::CheckBoxDoSWVPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW));
+	SXMaterialEditor::CheckBoxDoSWVVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW));
+	SXMaterialEditor::CheckBoxDoSWVPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEW));
 
-	SXMaterialEditor::CheckBoxDoSCamposVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS));
-	SXMaterialEditor::CheckBoxDoSCamposPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS));
+	SXMaterialEditor::CheckBoxDoSCamposVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS));
+	SXMaterialEditor::CheckBoxDoSCamposPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_CAMPOS));
 
-	SXMaterialEditor::CheckBoxDoSTimeDeltaVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA));
-	SXMaterialEditor::CheckBoxDoSTimeDeltaPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA));
+	SXMaterialEditor::CheckBoxDoSTimeDeltaVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA));
+	SXMaterialEditor::CheckBoxDoSTimeDeltaPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_TIMEDELTA));
 
-	SXMaterialEditor::CheckBoxDoSWVPVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ));
-	SXMaterialEditor::CheckBoxDoSWVPPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ));
+	SXMaterialEditor::CheckBoxDoSWVPVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ));
+	SXMaterialEditor::CheckBoxDoSWVPPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_MATRIX_WORLDVIEWPROJ));
 
-	SXMaterialEditor::CheckBoxDoSWinSizeVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE));
-	SXMaterialEditor::CheckBoxDoSWinSizePS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE));
+	SXMaterialEditor::CheckBoxDoSWinSizeVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE));
+	SXMaterialEditor::CheckBoxDoSWinSizePS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_WINSIZE));
 
-	SXMaterialEditor::CheckBoxUDVS->setCheck(SML_MtlGetSTDVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA));
-	SXMaterialEditor::CheckBoxUDPS->setCheck(SML_MtlGetSTDPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA));
+	SXMaterialEditor::CheckBoxUDVS->setCheck(SML_MtlGetStdVS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA));
+	SXMaterialEditor::CheckBoxUDPS->setCheck(SML_MtlGetStdPS(SRender_SimModelGetIDMtl(), MTL_SHADERSTD_USERDATA));
 
 	//
 
 	//
 	SXMaterialEditor::CheckBoxUDVSInPS->setCheck(false);
 
-	SXMaterialEditor::TrackBarUDVSX->setPos(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 0) * 100.f);
-	SXMaterialEditor::EditUDVSX->setText(String(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 0)).c_str());
+	SXMaterialEditor::TrackBarUDVSX->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 0) * 100.f);
+	SXMaterialEditor::EditUDVSX->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 0)).c_str());
 
-	SXMaterialEditor::TrackBarUDVSY->setPos(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 1) * 100.f);
-	SXMaterialEditor::EditUDVSY->setText(String(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 1)).c_str());
+	SXMaterialEditor::TrackBarUDVSY->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 1) * 100.f);
+	SXMaterialEditor::EditUDVSY->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 1)).c_str());
 	
-	SXMaterialEditor::TrackBarUDVSZ->setPos(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 2) * 100.f);
-	SXMaterialEditor::EditUDVSZ->setText(String(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 2)).c_str());
+	SXMaterialEditor::TrackBarUDVSZ->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 2) * 100.f);
+	SXMaterialEditor::EditUDVSZ->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 2)).c_str());
 	
-	SXMaterialEditor::TrackBarUDVSW->setPos(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 3) * 100.f);
-	SXMaterialEditor::EditUDVSW->setText(String(SML_MtlGetUDVS(SRender_SimModelGetIDMtl(), 3)).c_str());
+	SXMaterialEditor::TrackBarUDVSW->setPos(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 3) * 100.f);
+	SXMaterialEditor::EditUDVSW->setText(String(SML_MtlGetUserDataVS(SRender_SimModelGetIDMtl(), 3)).c_str());
 	
 	SXMaterialEditor::CheckBoxUDPSInVS->setCheck(false);
 
-	SXMaterialEditor::TrackBarUDPSX->setPos(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 0) * 100.f);
-	SXMaterialEditor::EditUDPSX->setText(String(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 0)).c_str());
+	SXMaterialEditor::TrackBarUDPSX->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 0) * 100.f);
+	SXMaterialEditor::EditUDPSX->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 0)).c_str());
 
-	SXMaterialEditor::TrackBarUDPSY->setPos(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 1) * 100.f);
-	SXMaterialEditor::EditUDPSY->setText(String(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 1)).c_str());
+	SXMaterialEditor::TrackBarUDPSY->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 1) * 100.f);
+	SXMaterialEditor::EditUDPSY->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 1)).c_str());
 	
-	SXMaterialEditor::TrackBarUDPSZ->setPos(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 2) * 100.f);
-	SXMaterialEditor::EditUDPSZ->setText(String(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 2)).c_str());
+	SXMaterialEditor::TrackBarUDPSZ->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 2) * 100.f);
+	SXMaterialEditor::EditUDPSZ->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 2)).c_str());
 	
-	SXMaterialEditor::TrackBarUDPSW->setPos(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 3) * 100.f);
-	SXMaterialEditor::EditUDPSW->setText(String(SML_MtlGetUDPS(SRender_SimModelGetIDMtl(), 3)).c_str());
+	SXMaterialEditor::TrackBarUDPSW->setPos(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 3) * 100.f);
+	SXMaterialEditor::EditUDPSW->setText(String(SML_MtlGetUserDataPS(SRender_SimModelGetIDMtl(), 3)).c_str());
 
-	SXMaterialEditor::CheckBoxUDPSInVS->setCheck(SML_MtlGetUDPS_InVS(SRender_SimModelGetIDMtl()));
-	SXMaterialEditor::CheckBoxUDVSInPS->setCheck(SML_MtlGetUDVS_InPS(SRender_SimModelGetIDMtl()));
+	SXMaterialEditor::CheckBoxUDPSInVS->setCheck(SML_MtlGetUserDataPS_InVS(SRender_SimModelGetIDMtl()));
+	SXMaterialEditor::CheckBoxUDVSInPS->setCheck(SML_MtlGetUserDataVS_InPS(SRender_SimModelGetIDMtl()));
 }
 
 void SXMaterialEditor::FinalImageUncheckedMenu()
diff --git a/source/sxmaterialeditor/edits_callback.cpp b/source/sxmaterialeditor/edits_callback.cpp
index 0b5f9cbe2..3f6402319 100644
--- a/source/sxmaterialeditor/edits_callback.cpp
+++ b/source/sxmaterialeditor/edits_callback.cpp
@@ -99,18 +99,51 @@ LRESULT SXMaterialEditor_EditPS_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 	return 0;
 }
 
-LRESULT SXMaterialEditor_EditPenetration_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+LRESULT SXMaterialEditor_EditHitChance_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 	char szStr[256];
 	szStr[0] = 0;
-	float tmpval = 0;
+	float fValue = 0;
 
-	SXMaterialEditor::EditPenetration->getText(szStr, 256);
+	SXMaterialEditor::EditHitChance->getText(szStr, 256);
 
-	sscanf(szStr, "%f", &tmpval);
+	sscanf(szStr, "%f", &fValue);
+
+	SXMaterialEditor::TrackBarHitChance->setPos(fValue * 100);
+	SML_MtlSetHitChance(SXMaterialEditor::IDMat, fValue*0.01f);
+	SXMaterialEditor::EditHitChance->setText(String(fValue).c_str());
+
+	return 0;
+}
+
+LRESULT SXMaterialEditor_EditDurability_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	char szStr[256];
+	szStr[0] = 0;
+	float fValue = 0;
+
+	SXMaterialEditor::EditDurability->getText(szStr, 256);
+
+	sscanf(szStr, "%f", &fValue);
+
+	SML_MtlSetDurability(SXMaterialEditor::IDMat, fValue);
+	SXMaterialEditor::EditDurability->setText(String(fValue).c_str());
+
+	return 0;
+}
+
+LRESULT SXMaterialEditor_EditDensity_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+{
+	char szStr[256];
+	szStr[0] = 0;
+	float fValue = 0;
+
+	SXMaterialEditor::EditDensity->getText(szStr, 256);
+
+	sscanf(szStr, "%f", &fValue);
 
-	SXMaterialEditor::TrackBarPenetration->setPos(tmpval * 100);
-	SML_MtlSetPenetration(SXMaterialEditor::IDMat, tmpval*0.01f);
+	SML_MtlSetDensity(SXMaterialEditor::IDMat, fValue);
+	SXMaterialEditor::EditDensity->setText(String(fValue).c_str());
 
 	return 0;
 }
@@ -399,7 +432,7 @@ LRESULT SXMaterialEditor_EditUDVSX_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDVSX->setPos(tmpval * 100);
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 0, tmpval);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 0, tmpval);
 	return 0;
 }
 
@@ -414,7 +447,7 @@ LRESULT SXMaterialEditor_EditUDVSY_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDVSY->setPos(tmpval * 100);
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 1, tmpval);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 1, tmpval);
 	return 0;
 }
 
@@ -429,7 +462,7 @@ LRESULT SXMaterialEditor_EditUDVSZ_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDVSZ->setPos(tmpval * 100);
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 2, tmpval);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 2, tmpval);
 	return 0;
 }
 
@@ -444,7 +477,7 @@ LRESULT SXMaterialEditor_EditUDVSW_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDVSW->setPos(tmpval * 100);
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 3, tmpval);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 3, tmpval);
 	return 0;
 }
 
@@ -460,7 +493,7 @@ LRESULT SXMaterialEditor_EditUDPSX_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDPSX->setPos(tmpval * 100);
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 0, tmpval);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 0, tmpval);
 	return 0;
 }
 
@@ -475,7 +508,7 @@ LRESULT SXMaterialEditor_EditUDPSY_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDPSY->setPos(tmpval * 100);
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 1, tmpval);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 1, tmpval);
 	return 0;
 }
 
@@ -490,7 +523,7 @@ LRESULT SXMaterialEditor_EditUDPSZ_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDPSZ->setPos(tmpval * 100);
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 2, tmpval);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 2, tmpval);
 	return 0;
 }
 
@@ -505,6 +538,6 @@ LRESULT SXMaterialEditor_EditUDPSW_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPA
 	sscanf(szStr, "%f", &tmpval);
 
 	SXMaterialEditor::TrackBarUDPSW->setPos(tmpval * 100);
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 3, tmpval);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 3, tmpval);
 	return 0;
 }
\ No newline at end of file
diff --git a/source/sxmaterialeditor/edits_callback.h b/source/sxmaterialeditor/edits_callback.h
index 5e9e7ce59..913ffbdec 100644
--- a/source/sxmaterialeditor/edits_callback.h
+++ b/source/sxmaterialeditor/edits_callback.h
@@ -19,7 +19,11 @@ LRESULT SXMaterialEditor_EditVS_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM
 
 LRESULT SXMaterialEditor_EditPS_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
-LRESULT SXMaterialEditor_EditPenetration_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+LRESULT SXMaterialEditor_EditHitChance_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+LRESULT SXMaterialEditor_EditDurability_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+
+LRESULT SXMaterialEditor_EditDensity_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
 
 LRESULT SXMaterialEditor_EditTexLighting_Enter(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
diff --git a/source/sxmaterialeditor/material_editor.cpp b/source/sxmaterialeditor/material_editor.cpp
index 44ee9742f..9c20007f0 100644
--- a/source/sxmaterialeditor/material_editor.cpp
+++ b/source/sxmaterialeditor/material_editor.cpp
@@ -28,9 +28,13 @@ namespace SXMaterialEditor
 	ISXGUIStatic* StaticTypeModel;
 	ISXGUIComboBox* ComboBoxTypeModel;
 
-	ISXGUIStatic* StaticPenetration;
-	ISXGUIEdit* EditPenetration;
-	ISXGUITrackBar* TrackBarPenetration;
+	ISXGUIStatic* StaticHitChance;
+	ISXGUIEdit* EditHitChance;
+	ISXGUITrackBar* TrackBarHitChance;
+	ISXGUIStatic* StaticDurability;
+	ISXGUIEdit* EditDurability;
+	ISXGUIStatic* StaticDensity;
+	ISXGUIEdit* EditDensity;
 
 	ISXGUIStatic* StaticTestModel;
 	ISXGUIComboBox* ComboBoxTestModel;
@@ -48,6 +52,7 @@ namespace SXMaterialEditor
 	ISXGUIButton* ButtonVS;
 	ISXGUIButton* ButtonPS;
 	ISXGUICheckBox* CheckBoxAlphaTest;
+	ISXGUICheckBox* CheckBoxTransparent;
 	ISXGUIStatic* StaticMR;
 	ISXGUIStatic* StaticRoughness;
 	ISXGUIStatic* StaticF0;
@@ -72,8 +77,6 @@ namespace SXMaterialEditor
 	ISXGUIStatic* StaticParamL;
 	ISXGUIComboBox* ComboBoxParamL;
 
-	ISXGUIStatic* StaticTypeRefract;
-	ISXGUIComboBox* ComboBoxTypeRefract;
 	ISXGUICheckBox* CheckBoxDoSVVS;
 	ISXGUIStatic* StaticTypeReflect;
 	ISXGUIComboBox* ComboBoxTypeReflect;
@@ -311,14 +314,14 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::ButtonRotAngle0->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::ButtonRotAngle0->addHandler(SXMaterialEditor_ButtonRotAngle0_Click, WM_LBUTTONUP);
 	
-	SXMaterialEditor::StaticTypeModel = SXGUICrStatic("Type model:",5,350,70,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::StaticTypeModel = SXGUICrStatic("Type model:",5,385,70,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::StaticTypeModel->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::StaticTypeModel->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticTypeModel->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticTypeModel->setTransparentTextBk(true);
 	SXMaterialEditor::StaticTypeModel->setColorBrush(RGB(220, 220, 220));
 
-	SXMaterialEditor::ComboBoxTypeModel = SXGUICrComboBox(100,347,200,100,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::ComboBoxTypeModel = SXGUICrComboBox(100,385,200,100,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::ComboBoxTypeModel->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::ComboBoxTypeModel->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::ComboBoxTypeModel->setColorTextBk(RGB(255, 255, 255));
@@ -330,13 +333,13 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::ComboBoxTypeModel->addItem("skin");
 	SXMaterialEditor::ComboBoxTypeModel->setSel(0);
 
-	SXMaterialEditor::StaticTestModel = SXGUICrStatic("Test model:",5,372,70,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::StaticTestModel = SXGUICrStatic("Test model:",5,350,70,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::StaticTestModel->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::StaticTestModel->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticTestModel->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticTestModel->setTransparentTextBk(true);
 	SXMaterialEditor::StaticTestModel->setColorBrush(RGB(220, 220, 220));
-	SXMaterialEditor::ComboBoxTestModel = SXGUICrComboBox(100,370,200,70,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::ComboBoxTestModel = SXGUICrComboBox(100,350,200,70,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::ComboBoxTestModel->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::ComboBoxTestModel->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::ComboBoxTestModel->setColorTextBk(RGB(255, 255, 255));
@@ -347,13 +350,13 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::ComboBoxTestModel->addItem("plane");
 	SXMaterialEditor::ComboBoxTestModel->setSel(0);
 
-	SXMaterialEditor::StaticTex = SXGUICrStatic("Tex:",5,400,30,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::StaticTex = SXGUICrStatic("Tex:",5,410,30,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::StaticTex->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::StaticTex->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticTex->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticTex->setTransparentTextBk(true);
 	SXMaterialEditor::StaticTex->setColorBrush(RGB(220, 220, 220));
-	SXMaterialEditor::EditTex = SXGUICrEdit("0",40,400,230,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::EditTex = SXGUICrEdit("0",40,410,230,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::EditTex->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::EditTex->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::EditTex->setColorTextBk(RGB(255, 255, 255));
@@ -362,19 +365,63 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::EditTex->addHandler(SXMaterialEditor_EditTex_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
 	SXMaterialEditor::EditTex->addHandler(SXMaterialEditor_EditTex_Enter, WM_KILLFOCUS);
 
-	SXMaterialEditor::ButtonTex = SXGUICrButton("...", 275, 400, 25, 15, SXGUI_BUTTON_IMAGE_NONE, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::ButtonTex = SXGUICrButton("...", 275, 410, 25, 15, SXGUI_BUTTON_IMAGE_NONE, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::ButtonTex->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::ButtonTex->addHandler(SXMaterialEditor_ButtonTex_Click, WM_LBUTTONUP);
 
 
-	SXMaterialEditor::StaticShaders = SXGUICrStatic("Shaders^", 5, 420, 40, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+
+	SXMaterialEditor::CheckBoxLighting = SXGUICrCheckBox("Lighting", 5, 430, 55, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0, false);
+	SXMaterialEditor::CheckBoxLighting->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::CheckBoxLighting->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::CheckBoxLighting->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::CheckBoxLighting->setTransparentTextBk(true);
+	SXMaterialEditor::CheckBoxLighting->setColorBrush(RGB(220, 220, 220));
+
+	SXMaterialEditor::CheckBoxAlphaTest = SXGUICrCheckBox("Use AlphaTest", 65, 430, 90, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0, false);
+	SXMaterialEditor::CheckBoxAlphaTest->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::CheckBoxAlphaTest->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::CheckBoxAlphaTest->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::CheckBoxAlphaTest->setTransparentTextBk(true);
+	SXMaterialEditor::CheckBoxAlphaTest->setColorBrush(RGB(220, 220, 220));
+
+	SXMaterialEditor::CheckBoxTransparent = SXGUICrCheckBox("Transparent", 160, 430, 90, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0, false);
+	SXMaterialEditor::CheckBoxTransparent->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::CheckBoxTransparent->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::CheckBoxTransparent->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::CheckBoxTransparent->setTransparentTextBk(true);
+	SXMaterialEditor::CheckBoxTransparent->setColorBrush(RGB(220, 220, 220));
+
+
+	SXMaterialEditor::StaticTypeReflect = SXGUICrStatic("Reflection:", 5, 450, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::StaticTypeReflect->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::StaticTypeReflect->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::StaticTypeReflect->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::StaticTypeReflect->setTransparentTextBk(true);
+	SXMaterialEditor::StaticTypeReflect->setColorBrush(RGB(220, 220, 220));
+
+	SXMaterialEditor::ComboBoxTypeReflect = SXGUICrComboBox(70, 448, 230, 115, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::ComboBoxTypeReflect->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::ComboBoxTypeReflect->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::ComboBoxTypeReflect->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::ComboBoxTypeReflect->setTransparentTextBk(true);
+	SXMaterialEditor::ComboBoxTypeReflect->setColorBrush(RGB(255, 255, 255));
+	SXMaterialEditor::ComboBoxTypeReflect->addItem("none");
+	SXMaterialEditor::ComboBoxTypeReflect->addItem("reflect plane");
+	SXMaterialEditor::ComboBoxTypeReflect->addItem("reflect cube dynamic");
+	SXMaterialEditor::ComboBoxTypeReflect->addItem("reflect cube static");
+	SXMaterialEditor::ComboBoxTypeReflect->setSel(0);
+
+
+
+	SXMaterialEditor::StaticShaders = SXGUICrStatic("Shaders:", 5, 485, 40, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::StaticShaders->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::StaticShaders->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticShaders->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticShaders->setTransparentTextBk(true);
 	SXMaterialEditor::StaticShaders->setColorBrush(RGB(220, 220, 220));
 
-	SXMaterialEditor::ComboBoxShaders = SXGUICrComboBoxEx(60, 418, 240, 150, 0, WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::ComboBoxShaders = SXGUICrComboBoxEx(60, 483, 240, 150, 0, WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST | CBS_HASSTRINGS | WS_VSCROLL, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::ComboBoxShaders->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::ComboBoxShaders->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::ComboBoxShaders->setColorTextBk(RGB(255, 255, 255));
@@ -383,14 +430,14 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::ComboBoxShaders->addItem("");
 
 
-	SXMaterialEditor::StaticVS = SXGUICrStatic("VS:",5,440,30,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::StaticVS = SXGUICrStatic("VS:",5,505,30,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::StaticVS->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::StaticVS->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticVS->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticVS->setTransparentTextBk(true);
 	SXMaterialEditor::StaticVS->setColorBrush(RGB(220, 220, 220));
 
-	SXMaterialEditor::EditVS = SXGUICrEdit("0",40,440,230,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::EditVS = SXGUICrEdit("0",40,505,230,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::EditVS->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::EditVS->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::EditVS->setColorTextBk(RGB(255, 255, 255));
@@ -399,18 +446,18 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::EditVS->addHandler(SXMaterialEditor_EditVS_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
 	SXMaterialEditor::EditVS->addHandler(SXMaterialEditor_EditVS_Enter, WM_KILLFOCUS);
 
-	SXMaterialEditor::ButtonVS = SXGUICrButton("...", 275, 440, 25, 15, SXGUI_BUTTON_IMAGE_NONE, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::ButtonVS = SXGUICrButton("...", 275, 505, 25, 15, SXGUI_BUTTON_IMAGE_NONE, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::ButtonVS->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::ButtonVS->addHandler(SXMaterialEditor_ButtonVS_Click, WM_LBUTTONUP);
 
-	SXMaterialEditor::StaticPS = SXGUICrStatic("PS:",5,460,30,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::StaticPS = SXGUICrStatic("PS:",5,525,30,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::StaticPS->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::StaticPS->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticPS->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticPS->setTransparentTextBk(true);
 	SXMaterialEditor::StaticPS->setColorBrush(RGB(220, 220, 220));
 
-	SXMaterialEditor::EditPS = SXGUICrEdit("0",40,460,230,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
+	SXMaterialEditor::EditPS = SXGUICrEdit("0",40,525,230,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
 	SXMaterialEditor::EditPS->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::EditPS->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::EditPS->setColorTextBk(RGB(255, 255, 255));
@@ -419,17 +466,18 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::EditPS->addHandler(SXMaterialEditor_EditPS_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
 	SXMaterialEditor::EditPS->addHandler(SXMaterialEditor_EditPS_Enter, WM_KILLFOCUS);
 
-	SXMaterialEditor::ButtonPS = SXGUICrButton("...", 275, 460, 25, 15, SXGUI_BUTTON_IMAGE_NONE, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::ButtonPS = SXGUICrButton("...", 275, 525, 25, 15, SXGUI_BUTTON_IMAGE_NONE, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::ButtonPS->setFont("MS Shell Dlg",-11,0,400,0,0,0);
 	SXMaterialEditor::ButtonPS->addHandler(SXMaterialEditor_ButtonPS_Click, WM_LBUTTONUP);
 
-	SXMaterialEditor::StaticPhysic = SXGUICrStatic("Physic material:", 5, 485, 80, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+
+	SXMaterialEditor::StaticPhysic = SXGUICrStatic("Physic material:", 5, 555, 80, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::StaticPhysic->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::StaticPhysic->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::StaticPhysic->setColorTextBk(RGB(255, 255, 255));
 	SXMaterialEditor::StaticPhysic->setTransparentTextBk(true);
 	SXMaterialEditor::StaticPhysic->setColorBrush(RGB(220, 220, 220));
-	SXMaterialEditor::ComboBoxPhysic = SXGUICrComboBox(100, 482, 200, 120, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::ComboBoxPhysic = SXGUICrComboBox(100, 553, 200, 120, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
 	SXMaterialEditor::ComboBoxPhysic->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
 	SXMaterialEditor::ComboBoxPhysic->setColorText(RGB(0, 0, 0));
 	SXMaterialEditor::ComboBoxPhysic->setColorTextBk(RGB(255, 255, 255));
@@ -446,75 +494,56 @@ void SXMaterialEditor::InitAllElements()
 	SXMaterialEditor::ComboBoxPhysic->addItem("leaf/grass (������/�����)");
 	SXMaterialEditor::ComboBoxPhysic->setSel(0);
 
-	SXMaterialEditor::StaticPenetration = SXGUICrStatic("Penetraion:", 5, 510, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::StaticPenetration->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::StaticPenetration->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::StaticPenetration->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::StaticPenetration->setTransparentTextBk(true);
-	SXMaterialEditor::StaticPenetration->setColorBrush(RGB(220, 220, 220));
-	SXMaterialEditor::EditPenetration = SXGUICrEdit("0", 60, 510, 65, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::EditPenetration->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::EditPenetration->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::EditPenetration->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::EditPenetration->setTransparentTextBk(true);
-	SXMaterialEditor::EditPenetration->setColorBrush(RGB(255, 255, 255));
-	SXMaterialEditor::EditPenetration->addHandler(SXMaterialEditor_EditPenetration_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
-	SXMaterialEditor::EditPenetration->addHandler(SXMaterialEditor_EditPenetration_Enter, WM_KILLFOCUS);
-	SXMaterialEditor::TrackBarPenetration = SXGUICrTrackBar("", 130, 510, 170, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::TrackBarPenetration->setMinMax(0, 100);
-	SXMaterialEditor::TrackBarPenetration->setTickFrequency(10);
-	SXMaterialEditor::TrackBarPenetration->addHandler(SXMaterialEditor_TrackBarPenetration_MouseMove, WM_MOUSEMOVE);
-
-	SXMaterialEditor::CheckBoxLighting = SXGUICrCheckBox("Lighting", 5, 535, 55, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0, false);
-	SXMaterialEditor::CheckBoxLighting->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::CheckBoxLighting->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::CheckBoxLighting->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::CheckBoxLighting->setTransparentTextBk(true);
-	SXMaterialEditor::CheckBoxLighting->setColorBrush(RGB(220, 220, 220));
-
-	SXMaterialEditor::CheckBoxAlphaTest = SXGUICrCheckBox("alphatest", 65, 535, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0, false);
-	SXMaterialEditor::CheckBoxAlphaTest->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::CheckBoxAlphaTest->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::CheckBoxAlphaTest->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::CheckBoxAlphaTest->setTransparentTextBk(true);
-	SXMaterialEditor::CheckBoxAlphaTest->setColorBrush(RGB(220, 220, 220));
-
-
-	SXMaterialEditor::StaticTypeRefract = SXGUICrStatic("Refraction:", 5, 560, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::StaticTypeRefract->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::StaticTypeRefract->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::StaticTypeRefract->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::StaticTypeRefract->setTransparentTextBk(true);
-	SXMaterialEditor::StaticTypeRefract->setColorBrush(RGB(220, 220, 220));
-
-	SXMaterialEditor::ComboBoxTypeRefract = SXGUICrComboBox(70, 558, 230, 115, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::ComboBoxTypeRefract->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::ComboBoxTypeRefract->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::ComboBoxTypeRefract->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::ComboBoxTypeRefract->setTransparentTextBk(true);
-	SXMaterialEditor::ComboBoxTypeRefract->setColorBrush(RGB(255, 255, 255));
-	SXMaterialEditor::ComboBoxTypeRefract->addItem("none");
-	SXMaterialEditor::ComboBoxTypeRefract->addItem("transparency lighting");
-	SXMaterialEditor::ComboBoxTypeRefract->setSel(0);
-
-	SXMaterialEditor::StaticTypeReflect = SXGUICrStatic("Reflection:", 5, 580, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::StaticTypeReflect->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::StaticTypeReflect->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::StaticTypeReflect->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::StaticTypeReflect->setTransparentTextBk(true);
-	SXMaterialEditor::StaticTypeReflect->setColorBrush(RGB(220, 220, 220));
+	SXMaterialEditor::StaticHitChance = SXGUICrStatic("Hit chance:", 5, 575, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::StaticHitChance->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::StaticHitChance->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::StaticHitChance->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::StaticHitChance->setTransparentTextBk(true);
+	SXMaterialEditor::StaticHitChance->setColorBrush(RGB(220, 220, 220));
+	SXMaterialEditor::EditHitChance = SXGUICrEdit("0", 60, 575, 65, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::EditHitChance->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::EditHitChance->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::EditHitChance->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::EditHitChance->setTransparentTextBk(true);
+	SXMaterialEditor::EditHitChance->setColorBrush(RGB(255, 255, 255));
+	SXMaterialEditor::EditHitChance->addHandler(SXMaterialEditor_EditHitChance_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
+	SXMaterialEditor::EditHitChance->addHandler(SXMaterialEditor_EditHitChance_Enter, WM_KILLFOCUS);
+	SXMaterialEditor::TrackBarHitChance = SXGUICrTrackBar("", 130, 575, 170, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::TrackBarHitChance->setMinMax(0, 100);
+	SXMaterialEditor::TrackBarHitChance->setTickFrequency(10);
+	SXMaterialEditor::TrackBarHitChance->addHandler(SXMaterialEditor_TrackBarHitChance_MouseMove, WM_MOUSEMOVE);
+
+	SXMaterialEditor::StaticDurability = SXGUICrStatic("Durability:", 5, 595, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::StaticDurability->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::StaticDurability->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::StaticDurability->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::StaticDurability->setTransparentTextBk(true);
+	SXMaterialEditor::StaticDurability->setColorBrush(RGB(220, 220, 220));
+	SXMaterialEditor::EditDurability = SXGUICrEdit("0", 60, 595, 65, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::EditDurability->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::EditDurability->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::EditDurability->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::EditDurability->setTransparentTextBk(true);
+	SXMaterialEditor::EditDurability->setColorBrush(RGB(255, 255, 255));
+	SXMaterialEditor::EditDurability->addHandler(SXMaterialEditor_EditDurability_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
+	SXMaterialEditor::EditDurability->addHandler(SXMaterialEditor_EditDurability_Enter, WM_KILLFOCUS);
+
+	SXMaterialEditor::StaticDensity = SXGUICrStatic("Density:", 135, 595, 60, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::StaticDensity->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::StaticDensity->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::StaticDensity->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::StaticDensity->setTransparentTextBk(true);
+	SXMaterialEditor::StaticDensity->setColorBrush(RGB(220, 220, 220));
+	SXMaterialEditor::EditDensity = SXGUICrEdit("0", 180, 595, 65, 15, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
+	SXMaterialEditor::EditDensity->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
+	SXMaterialEditor::EditDensity->setColorText(RGB(0, 0, 0));
+	SXMaterialEditor::EditDensity->setColorTextBk(RGB(255, 255, 255));
+	SXMaterialEditor::EditDensity->setTransparentTextBk(true);
+	SXMaterialEditor::EditDensity->setColorBrush(RGB(255, 255, 255));
+	SXMaterialEditor::EditDensity->addHandler(SXMaterialEditor_EditDensity_Enter, WM_KEYDOWN, VK_RETURN, 1, 0, 0, 0);
+	SXMaterialEditor::EditDensity->addHandler(SXMaterialEditor_EditDensity_Enter, WM_KILLFOCUS);
 
-	SXMaterialEditor::ComboBoxTypeReflect = SXGUICrComboBox(70, 578, 230, 115, SXMaterialEditor::JobWindow->getHWND(), 0, 0);
-	SXMaterialEditor::ComboBoxTypeReflect->setFont("MS Shell Dlg", -11, 0, 400, 0, 0, 0);
-	SXMaterialEditor::ComboBoxTypeReflect->setColorText(RGB(0, 0, 0));
-	SXMaterialEditor::ComboBoxTypeReflect->setColorTextBk(RGB(255, 255, 255));
-	SXMaterialEditor::ComboBoxTypeReflect->setTransparentTextBk(true);
-	SXMaterialEditor::ComboBoxTypeReflect->setColorBrush(RGB(255, 255, 255));
-	SXMaterialEditor::ComboBoxTypeReflect->addItem("none");
-	SXMaterialEditor::ComboBoxTypeReflect->addItem("reflect plane");
-	SXMaterialEditor::ComboBoxTypeReflect->addItem("reflect cube dynamic");
-	SXMaterialEditor::ComboBoxTypeReflect->addItem("reflect cube static");
-	SXMaterialEditor::ComboBoxTypeReflect->setSel(0);
+	
 
 
 	SXMaterialEditor::StaticMR = SXGUICrStatic("M R:",305,175,50,15,SXMaterialEditor::JobWindow->getHWND(),0,0);
@@ -1199,6 +1228,7 @@ void SXMaterialEditor::DeleteAllElements()
 	mem_delete(SXMaterialEditor::EditF0);
 	mem_delete(SXMaterialEditor::EditMR);
 	mem_delete(SXMaterialEditor::CheckBoxLighting);
+	mem_delete(SXMaterialEditor::CheckBoxTransparent);
 	mem_delete(SXMaterialEditor::TrackBarRoughness);
 	mem_delete(SXMaterialEditor::TrackBarF0);
 	mem_delete(SXMaterialEditor::TrackBarUDVSX);
@@ -1206,7 +1236,6 @@ void SXMaterialEditor::DeleteAllElements()
 	mem_delete(SXMaterialEditor::EditTexLighting);
 	mem_delete(SXMaterialEditor::ButtonTexLighting);
 	mem_delete(SXMaterialEditor::CheckBoxTexLighting);
-	mem_delete(SXMaterialEditor::ComboBoxTypeRefract);
 	mem_delete(SXMaterialEditor::CheckBoxDoSVVS);
 	mem_delete(SXMaterialEditor::ComboBoxTypeReflect);
 	mem_delete(SXMaterialEditor::StaticPhysic);
diff --git a/source/sxmaterialeditor/material_editor.h b/source/sxmaterialeditor/material_editor.h
index c84912bc2..bc633f098 100644
--- a/source/sxmaterialeditor/material_editor.h
+++ b/source/sxmaterialeditor/material_editor.h
@@ -48,8 +48,12 @@ namespace SXMaterialEditor
 	extern ISXGUIComboBox* ComboBoxTypeModel;
 
 	extern ISXGUIStatic* StaticPenetration;
-	extern ISXGUIEdit* EditPenetration;
-	extern ISXGUITrackBar* TrackBarPenetration;
+	extern ISXGUIEdit* EditHitChance;
+	extern ISXGUITrackBar* TrackBarHitChance;
+	extern ISXGUIStatic* StaticDurability;
+	extern ISXGUIEdit* EditDurability;
+	extern ISXGUIStatic* StaticDensity;
+	extern ISXGUIEdit* EditDensity;
 
 	extern ISXGUIStatic* StaticTestModel;
 	extern ISXGUIComboBox* ComboBoxTestModel;
@@ -67,6 +71,7 @@ namespace SXMaterialEditor
 	extern ISXGUIButton* ButtonVS;
 	extern ISXGUIButton* ButtonPS;
 	extern ISXGUICheckBox* CheckBoxAlphaTest;
+	extern ISXGUICheckBox* CheckBoxTransparent;
 	extern ISXGUIStatic* StaticMR;
 	extern ISXGUIStatic* StaticRoughness;
 	extern ISXGUIStatic* StaticF0;
@@ -91,8 +96,6 @@ namespace SXMaterialEditor
 	extern ISXGUIStatic* StaticParamL;
 	extern ISXGUIComboBox* ComboBoxParamL;
 
-	extern ISXGUIStatic* StaticTypeRefract;
-	extern ISXGUIComboBox* ComboBoxTypeRefract;
 	extern ISXGUICheckBox* CheckBoxDoSVVS;
 	extern ISXGUIStatic* StaticTypeReflect;
 	extern ISXGUIComboBox* ComboBoxTypeReflect;
diff --git a/source/sxmaterialeditor/trackbars_callback.cpp b/source/sxmaterialeditor/trackbars_callback.cpp
index f2a85ae51..bff2e42c4 100644
--- a/source/sxmaterialeditor/trackbars_callback.cpp
+++ b/source/sxmaterialeditor/trackbars_callback.cpp
@@ -1,16 +1,16 @@
 
 #include "trackbars_callback.h"
 
-LRESULT SXMaterialEditor_TrackBarPenetration_MouseMove(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
+LRESULT SXMaterialEditor_TrackBarHitChance_MouseMove(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
 {
 	char thickness[64];
 	thickness[0] = '0';
 
-	int pos = SXMaterialEditor::TrackBarPenetration->getPos();
+	int pos = SXMaterialEditor::TrackBarHitChance->getPos();
 	sprintf(thickness, "%.2f", float(pos)*0.01f);
-	SXMaterialEditor::EditPenetration->setText(thickness);
+	SXMaterialEditor::EditHitChance->setText(thickness);
 
-	SML_MtlSetPenetration(SXMaterialEditor::IDMat, float(pos)*0.01f);
+	SML_MtlSetHitChance(SXMaterialEditor::IDMat, float(pos)*0.01f);
 
 	return 0;
 }
@@ -68,7 +68,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSX_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDVSX->setText(roughness);
 
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 0, float(pos)*0.01f);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 0, float(pos)*0.01f);
 
 	return 0;
 }
@@ -82,7 +82,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSY_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDVSY->setText(roughness);
 
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 1, float(pos)*0.01f);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 1, float(pos)*0.01f);
 
 	return 0;
 }
@@ -96,7 +96,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSZ_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDVSZ->setText(roughness);
 
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 2, float(pos)*0.01f);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 2, float(pos)*0.01f);
 
 	return 0;
 }
@@ -110,7 +110,7 @@ LRESULT SXMaterialEditor_TrackBarUDVSW_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDVSW->setText(roughness);
 
-	SML_MtlSetUDVS(SXMaterialEditor::IDMat, 3, float(pos)*0.01f);
+	SML_MtlSetUserDataVS(SXMaterialEditor::IDMat, 3, float(pos)*0.01f);
 
 	return 0;
 }
@@ -126,7 +126,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSX_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDPSX->setText(roughness);
 
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 0, float(pos)*0.01f);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 0, float(pos)*0.01f);
 
 	return 0;
 }
@@ -140,7 +140,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSY_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDPSY->setText(roughness);
 
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 1, float(pos)*0.01f);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 1, float(pos)*0.01f);
 
 	return 0;
 }
@@ -154,7 +154,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSZ_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDPSZ->setText(roughness);
 
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 2, float(pos)*0.01f);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 2, float(pos)*0.01f);
 
 	return 0;
 }
@@ -168,7 +168,7 @@ LRESULT SXMaterialEditor_TrackBarUDPSW_MouseMove(HWND hwnd, UINT msg, WPARAM wPa
 	sprintf(roughness, "%.2f", float(pos)*0.01f);
 	SXMaterialEditor::EditUDPSW->setText(roughness);
 
-	SML_MtlSetUDPS(SXMaterialEditor::IDMat, 3, float(pos)*0.01f);
+	SML_MtlSetUserDataPS(SXMaterialEditor::IDMat, 3, float(pos)*0.01f);
 
 	return 0;
 }
\ No newline at end of file
diff --git a/source/sxmaterialeditor/trackbars_callback.h b/source/sxmaterialeditor/trackbars_callback.h
index 8489a9391..79ee150fa 100644
--- a/source/sxmaterialeditor/trackbars_callback.h
+++ b/source/sxmaterialeditor/trackbars_callback.h
@@ -11,7 +11,7 @@
 
 #include "material_editor.h"
 
-LRESULT SXMaterialEditor_TrackBarPenetration_MouseMove(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
+LRESULT SXMaterialEditor_TrackBarHitChance_MouseMove(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
 LRESULT SXMaterialEditor_TrackBarRoughness_MouseMove(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
 
-- 
GitLab