diff --git a/build/config_game.cfg b/build/config_game.cfg index 0e67865f01f4a8abb4229c2dd879f5c88a73a015..d070e368bcb032342490741196510581118c7f94 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 7d5fa00ee611441e644d48466f464f0fb87de6cf..b5bceb03e67a674e7a54ca20ae06b2d439f90570 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 8c39041c86ce11191f1b4f7cc96c3f3d18aaab0e..fbbba4db9f9d843dd3d26d5d9f544f5359c43737 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 7902d20e9bae0002e54df5dc743536f1b0f629b9..0b2508c17a29d49a437c47b39e1de96e96b19647 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 e627492b2c9d6cce8b766b463fe9fce444f5ca75..09f62264ba50c3a66da869e284a2ec3e43ae16f4 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 2fd63a041ba51b176f58b0b059242ab1fb1961a2..1f2518911ddabc10bd5e28faaa3f91e68314af17 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 fba2eee47730c05e7ed6c17c4417b58e40109d00..b80ec01578bb61cb78afc5a6433d9d15963d6a72 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 eadc51c6e331717284f2721a0c1d641a691b7dc8..36ab548682ba543e50584158d7fc3bc19aab67f2 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 91ff88a0a478e0d0da2003e8442fb3af9612d094..29dc0be8de1941ebf670007688c10d5542624fbd 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 988073f894c3f817d5a496352869ebf834bcc191..2afaaedddfeb1828f0abc306af1b08baf323ad3e 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 a2c93c58d06897ac08ee600386287eebc843a0b7..421fb404399605d8c7db7d83bb63685958e54002 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 591dd09db4d006c7f6ee8ce93075235deb908870..60413f9421594ba5ee979ee9a9044209f014c6e9 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 62dc8b60fdf77cc3685d981c9fc3ecc40bcf2015..b10d310e00a592e4e83d6e7ecda2ecdbe7d6ecd8 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 65ed5463e0fa84569873b4be6a1d1364f212e0b7..b12e5e56c94f8cf09c3323c144e7da75d984a8fe 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 858b2f394c3dab95abc66ea12a9e5023f80d67f9..0ecf7fdeac70bb2ee4acfe3560c7623ae2657e9c 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 fdf7232a3c1806388342c4bf23eed286dd1819f6..0a3f7e427973cef54fe2b70929fc79b9b30eed9f 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 2a3318c78df19649a99a974d35c08a8ae72399ac..9230e3852fa25f6b6fa3646586e47b67959973fc 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 07ff82c1e3075362774286c8fc78c45e5c1f8cb9..f09890587896a6a261ba1a053315a74395601db9 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 caf84f1334c2f08dc88e4d487f5a89335cb53f12..3b3ef866cbf754e20af43d49d97e2ff00113ab9a 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 7ca2250e30831dda9fbf255e9d762f84ed063cac..fd55f7a01ebc72bdb4c185071011b5a6b3a796d3 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 5726e2f884719a71c0b3567e3a9a11079782d599..0f580b0dd851687eb8adc4f66b955c59533dacad 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 5c47ae69d34eaa1767292e099973a945822c86d1..84a700d0aca09d026a37e4f9e65bf00205918c8a 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 e1646d432e2748c2ecd7caefdd3fb694c4636e23..4d3c6d20d811b82ce2ea14e2421c7946d72f0757 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 e283542a7b2ecbf2c1749c3f5b25efa6b7ad8f5f..da669290248943fe10c6cb474a2c7503f104e2ae 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 d83d7fd8688a0ee4c6c0ded82845c57d489795ef..c3703b9a9bed821de3762427d915f3523d18b468 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 30cf1d733bcd18078fa45a62ae8713386986839b..178a98953b276ced8c5fbd57f291fc51e9368c55 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 0730474e41131316b19b39a81de60ffe1f56bc89..d2b1f20ad26edd891c50f615520852abf58d66fd 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 ba4dda39e10190558f9a4a7cb14dc0a5b8c90209..700908ff9895ca10b0e0e44c6957376d9cdc57a7 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 586727e022d85f3ab1552b93e69b1f7e3ff297cd..fd323b7e230bd0c32c984f50eeb1cd0b87937330 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 30b3f1069fd33fc8de255d8c9fb22715f84727a1..0d215885450eb29d755d6c64a3dace5aea5a3b56 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 561d46735c4a5692f7510857416e339ef12c282a..232655a8e2bf7e48365bac6cde17c532ee2cea6f 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 41440c58ab9740e74317383ceac0b8d571d14e9d..1938770629bb66606f81e3921909c3ea00a49cc6 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 63cb685a383bc0495833e4b06ec4e5ca58654774..4965c6fcf689d324c6a93853898962b9b16dfdc7 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 d9fdb6a22679e0d165579e2600e3f3e94d908bcd..acd4c344bb4a63ded826c9a0f18fd0e112694fe4 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 5cf2ba1ce8bcd291257d5370fb74898bff818429..2e63e57e7c178e27cd1391b6e014ef17e4f6ba55 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 0000000000000000000000000000000000000000..7a035cf3b59d4a9408218e81493e2c51918688b8 --- /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 0000000000000000000000000000000000000000..097f3ea2dfa881db14c2569d698c8adc9f0e1981 --- /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 a4d93d93e03e6d458070fb4d9e5a5f2d8e8d56d1..8ba9ab038a1208ebf409f74a9b97f9da5d2f2ed5 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 1ca4ec22692e8bfaebdbe2cd64347b3ff66e054c..7a5617d86067e8b3d2c5a5ec43357d8b397ab9dd 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 d4a6567fb458935b2440db57dfe9065f862e5d0e..36a2a5fd6ad574be950c632da072452261f70455 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 4302a2a8c310dd4f13cbd51b24875ee345e58c29..66926c6dd49009fdfd13942d2cc806d0c6369b9b 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 db31a11cd887fc54038ea2a04640d2b5d972820d..0d0e0f6a8c79c3c0501bf6a698aecff63506f559 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 0000000000000000000000000000000000000000..e632478d2e45429952a41d6773df81bd6969c9a8 --- /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 0000000000000000000000000000000000000000..6092009aa0964006a887c3f450af4e4e7800308d --- /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 7fe7c48bb836afed8808ef094584f48748649917..edbf8f16c0433dc5b235220767744a174d755492 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 6bb2102dbaad3165f1145a4ca13e6676efe55b13..edd34cb0c245e1e34a2c065af0fc6f1e3385f0b7 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 1e912425762aec4e0d33e8fcb76ade99a6f0af6d..d623cfc7e7a317e8c1c54ff073d554f8ceeb20ef 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 e3c5bac0f2cc15f81356b8f3226487018731bc2d..7823b6d49172e0585563c74c15a56cc6a1eb2a5a 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 6b7bf9e6e51e21fa94021185238b8233a60a615d..5f511defca65042420362cbd0d38819c7a5f936d 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 62a2f30aa3899745b3a12b046d2103018bce3984..965167c6e4f541813c8adf041ec2af33bbee0c76 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 4497c85ff902a1cc7a0fb4cf270143e7f60205d9..6115a6426d53c7eb769b715686e1d25079826b0c 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 bab8c29eab1fb029fdb6da504d3b0fb1575d1fb9..6eab4aee7e63da6d4cde9ea6b364c185d0b01224 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 e989a729eb3de4d7c290a6dc1bd3607b9a6d4ec4..72a748facae5d62a95ca58e42bcd793c30ebb497 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 6c4d69edefb6902ee2a8a7dc8aaade743b6a0a3c..7e1ae3084dca84836c0ee63bd70094461af480be 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 ba46505b86e8a583e444130b7c415a95c5691a07..0a6b903ae44286212316e4a9e62ccb6161cd4273 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 6c8842c988aec793bb28de2a00a4953618d43ab7..f22d61938631d33816b9d42172e2a7daa2872e05 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 720b23952a27f0aa5e20fd74a9f9cf6f82f87513..fcb24385c2fd52a5ef4daac78f9d85e2eb90ac35 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 66db341e6eb2901a543ab6599d980291ad0e317c..eb868786c53c6387bad43e0b0692829732742d6e 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 4e969c072de0ec47de573699ce332e63d4c7cbc5..2381125f0db2cda246bdce81d6c43ae0ff2add32 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 78c125b6256d87218caad07160016f1f6bd95588..9c2c56ebdca761e6a96224931a81277866c5d400 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 2fbe3b32db669f4698110e2b6fb40ac972762148..58a564383a61eba15a24e620093fe8a55b74cf6e 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 efdf8d7136267ddc2245300ca251cb2cb2fffb67..4db307b0d2221f22a7802f3b4f95856161f93c2a 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 c687cb701ab2e62a775bd95b055ba3409fa101a7..ebac38b87ee84d719a1714eedfeb2ef54f47ff37 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 05682de07deffa7a27b2279fe5d024a38cb58fbb..e4881435ef8a58de0a8c88a9f78d94ced42738db 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 ad67fbbf3742c14a9a29fad100fe46a27b1987ea..c4868893e44f1a8a48429d11130a73cd16930343 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 9b1fd2eb5b7aa3c68c61c6189fc1aa91ea1a04a9..437d1a24475863e9cd416569538b964159244976 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 0b5f9cbe204a2901a4c02dacb8855b5a83895f38..3f640231934021ea329976942aef35ccdf490bcf 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 5e9e7ce591037dcbe565d0d53ff85c957328efdd..913ffbdecda0d74684a5fb8913a4df2076fad9b1 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 44ee9742faf491ceff2667aa454fc9a184e2d3ba..9c20007f043da16c61adfc7ef00386a4051bd025 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 c84912bc2ca7424d8a6e91014be3fd7c8f89f6fa..bc633f098f7b2d365bc9afee2ffa67f8f1535f06 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 f2a85ae51cbf13170188cca892813d0db44b934a..bff2e42c4612d7a59ef5fb768d97916a66cbd6d6 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 8489a939115dfc5211d394e222b6a6cc097c578e..79ee150fa8a9be24ae69819fc187b106e14239c6 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);