Skip to content
Snippets Groups Projects
Commit 921edaeb authored by D-AIRY's avatar D-AIRY
Browse files

Some refactoring

parent 8edd62ff
Branches
Tags
No related merge requests found
Showing
with 81 additions and 153 deletions
......@@ -12,6 +12,17 @@ const.h
float4 vWinSize;
float4 vNearFarLayers;
}; */
cbuffer CDataObserverCamera: register(b5)
{
// float4x4 mV;
float4x4 g_mObserverVP;
float4 g_vObserverPosCam;
float4x4 g_mObserverInvVP;
float4x4 g_mObserverInvV;
float4 g_vObserverNearFar;
float3 g_vObserverParamProj;
};
cbuffer CDataFrame: register(b4)
{
float g_fFrameTime;
......@@ -26,6 +37,10 @@ cbuffer CDataCamera: register(b2)
float4x4 g_mVP;
float4 g_vPosCam;
float4x4 g_mInvVP;
float4x4 g_mInvV;
float4 g_vNearFar;
float3 g_vParamProj;
};
cbuffer CDataObject: register(b1)
{
......@@ -33,13 +48,13 @@ cbuffer CDataObject: register(b1)
// float4x4 g_mWV;
// float4x4 g_mWVP;
};
cbuffer CDataMaterial: register(b0)
/* cbuffer CDataMaterial: register(b0)
{
float4 g_vUserVS;
float4 g_vUserPS;
float4 g_vDestColor;
float4 g_vNearFarLayers;
};
}; */
......
......@@ -5,21 +5,7 @@ terrax_colored.vs
*/
#include <struct.h>
//##########################################################################
cbuffer perFrame: register(b1)
{
float4x4 g_mVP;
float4x4 g_mViewInv;
float2 g_vNearFar;
float3 g_vParamProj;
};
/* cbuffer b10: register(b10)
{
float4 g_vCurrentCascade;
}; */
#include <const.h>
//##########################################################################
......@@ -34,14 +20,14 @@ void main(point VSO_GICubes input[1], inout TriangleStream<GSO_GICubes> OutputSt
float3 vCenter = input[0].vPosition.xyz;
const GSO_GICubes vertices[8] = {
{mul(input[0].vPosition + float4(fSize, fSize, fSize, 0), g_mVP), float3(fNormal, fNormal, fNormal), vCenter},// 0
{mul(input[0].vPosition + float4(fSize, -fSize, fSize, 0), g_mVP), float3(fNormal, -fNormal, fNormal), vCenter},// 1
{mul(input[0].vPosition + float4(fSize, fSize, -fSize, 0), g_mVP), float3(fNormal, fNormal, -fNormal), vCenter},// 2
{mul(input[0].vPosition + float4(fSize, -fSize, -fSize, 0), g_mVP), float3(fNormal, -fNormal, -fNormal), vCenter},// 3
{mul(input[0].vPosition + float4(-fSize, -fSize, -fSize, 0), g_mVP), float3(-fNormal, -fNormal, -fNormal), vCenter},// 4
{mul(input[0].vPosition + float4(-fSize, -fSize, fSize, 0), g_mVP), float3(-fNormal, -fNormal, fNormal), vCenter},// 5
{mul(input[0].vPosition + float4(-fSize, fSize, fSize, 0), g_mVP), float3(-fNormal, fNormal, fNormal), vCenter},// 6
{mul(input[0].vPosition + float4(-fSize, fSize, -fSize, 0), g_mVP), float3(-fNormal, fNormal, -fNormal), vCenter}// 7
{mul(input[0].vPosition + float4(fSize, fSize, fSize, 0), g_mObserverVP), float3(fNormal, fNormal, fNormal), vCenter},// 0
{mul(input[0].vPosition + float4(fSize, -fSize, fSize, 0), g_mObserverVP), float3(fNormal, -fNormal, fNormal), vCenter},// 1
{mul(input[0].vPosition + float4(fSize, fSize, -fSize, 0), g_mObserverVP), float3(fNormal, fNormal, -fNormal), vCenter},// 2
{mul(input[0].vPosition + float4(fSize, -fSize, -fSize, 0), g_mObserverVP), float3(fNormal, -fNormal, -fNormal), vCenter},// 3
{mul(input[0].vPosition + float4(-fSize, -fSize, -fSize, 0), g_mObserverVP), float3(-fNormal, -fNormal, -fNormal), vCenter},// 4
{mul(input[0].vPosition + float4(-fSize, -fSize, fSize, 0), g_mObserverVP), float3(-fNormal, -fNormal, fNormal), vCenter},// 5
{mul(input[0].vPosition + float4(-fSize, fSize, fSize, 0), g_mObserverVP), float3(-fNormal, fNormal, fNormal), vCenter},// 6
{mul(input[0].vPosition + float4(-fSize, fSize, -fSize, 0), g_mObserverVP), float3(-fNormal, fNormal, -fNormal), vCenter}// 7
};
OutputStream.Append(vertices[0]);
......
......@@ -14,13 +14,6 @@ Texture3D g_txIllumRed: register(t0);
Texture3D g_txIllumGreen: register(t1);
Texture3D g_txIllumBlue: register(t2);
cbuffer b8: register(b8)
{
// float4x4 mV;
float4x4 g_mVP;
float4 g_vPosCam;
};
//##########################################################################
float4 main(GSO_GICubes IN):COLOR0
......
......@@ -9,16 +9,6 @@ terrax_colored.vs
//##########################################################################
cbuffer perFrame: register(b1)
{
float4x4 g_mVP;
float4x4 g_mViewInv;
float2 g_vNearFar;
float3 g_vParamProj;
};
//##########################################################################
VSO_GICubes main(VSI_GICubes IN)
{
uint uCurrentCascade = g_vCurrentCascade.x;
......
#include <lpv.h>
#include <const.h>
cbuffer perLight: register(b7)
{
......@@ -13,14 +14,7 @@ cbuffer perLight: register(b7)
cbuffer b6 :register(b6)
{
float4x4 g_mInvVP;
};
cbuffer b8: register(b8)
{
// float4x4 mV;
float4x4 g_mVP;
float4 g_vPosCam;
float4x4 g_mLightInvVP;
};
struct VS_IN
......@@ -68,7 +62,7 @@ RsmTexel GetRsmTexel(int2 coords, uint2 vTexSize)
tx.normalWS = rsmWsNorMap.Load(int3(coords, 0)).xyz * 2.0 - 1.0;
vScreenSpace.y *= -1.0;
float4 vWS = mul(vScreenSpace, g_mInvVP);
float4 vWS = mul(vScreenSpace, g_mLightInvVP);
tx.positionWS = vWS.xyz / vWS.w;
#ifndef IS_SUN
......@@ -100,7 +94,7 @@ GS_IN main(VS_IN input)
GS_IN output1 = (GS_IN)0;
// rsmTexel.positionWS = float4(((float2)rsmCoords + 0.5f) / (float2)RSMsize * 2.0 - 1.0, 0.0f, 1.0);
// rsmTexel.positionWS = float4(float3((float)(input.posIndex % 512), 0.0f, (float)(input.posIndex / 512)) / 512, 1.0);
output1.cellIndex = mul(float4(rsmTexel.positionWS, 1.0), g_mVP);
output1.cellIndex = mul(float4(rsmTexel.positionWS, 1.0), g_mObserverVP);
return(output1);
#endif
......
#include <lpv.h>
#include <const.h>
cbuffer perLight: register(b7)
{
......@@ -11,18 +12,6 @@ cbuffer perLight: register(b7)
#endif
};
/* cbuffer b6 :register(b6)
{
float4x4 g_mInvVP[6];
}; */
cbuffer b8: register(b8)
{
// float4x4 mV;
float4x4 g_mVP;
float4 g_vPosCam;
};
struct VS_IN
{
uint posIndex :SV_VertexID;
......@@ -132,7 +121,7 @@ GS_IN main(VS_IN input)
GS_IN output1 = (GS_IN)0;
// rsmTexel.positionWS = float4(((float2)rsmCoords + 0.5f) / (float2)RSMsize * 2.0 - 1.0, 0.0f, 1.0);
// rsmTexel.positionWS = float4(float3((float)(input.posIndex % 512), 0.0f, (float)(input.posIndex / 512)) / 512, 1.0);
output1.cellIndex = mul(float4(rsmTexel.positionWS, 1.0), g_mVP);
output1.cellIndex = mul(float4(rsmTexel.positionWS, 1.0), g_mObserverVP);
return(output1);
#endif
......
......@@ -5,29 +5,13 @@ lighting_bound.vs
*/
#include <struct.h>
//##########################################################################
// half4x4 g_mWVP;
cbuffer perLight: register(b0)
{
float4x4 g_mW;
};
cbuffer perFrame: register(b1)
{
float4x4 g_mVP;
float4x4 g_mViewInv;
float2 g_vNearFar;
float3 g_vParamProj;
};
#include <const.h>
//##########################################################################
VSO_LightBound main(VSI_LightBound IN)
{
VSO_LightBound OUT = (VSO_LightBound)0;
OUT.vPosition = mul(float4(IN.vPosition, 1.0), mul(g_mW, g_mVP));
OUT.vPosition = mul(float4(IN.vPosition, 1.0), mul(g_mW, g_mObserverVP));
return(OUT);
}
......@@ -6,14 +6,10 @@ lighting_blend.ps
#include <struct.h>
#include <mtrl.h>
#include <const.h>
//##########################################################################
cbuffer CDataScene: register(b3)
{
float4 g_vNearFarInvWinSize;
};
cbuffer perLight: register(b0)
{
float4 g_vLightColorPower;
......@@ -24,11 +20,6 @@ cbuffer perLight: register(b0)
#endif
};
cbuffer perFrame: register(b1)
{
float3 g_vPosCam;
};
//##########################################################################
......@@ -142,9 +133,14 @@ float4 main(VSO_ResPos IN):SV_TARGET
float4 vParam = g_txParameters.Sample(g_sPointClamp, IN.vTexUV);
float fDepth = g_txDepthView.Sample(g_sPointClamp, IN.vTexUV).r;
float4 vPosition = float4(g_vPosCam.xyz + IN.vWorldRay * fDepth, 1.0);
float4 vPosition = float4(g_vObserverPosCam.xyz + IN.vWorldRay * fDepth, 1.0);
float3 vNormalPixel = normalize(NormalDecode(vNormals.xyz).xyz);
// return(float4(g_vObserverPosCam.xyz, 1.0f));
// return(float4(frac(vPosition.zzz), 1.0f));
// return(float4((float3)fDepth, 1.0f));
// return(float4(frac(IN.vWorldRay), 1.0f));
float fF0 = vNormals.w;
float fRoughness = lerp(PARAM_LIGHTING_ROUGHNESS_MIN, PARAM_LIGHTING_ROUGHNESS_MAX, vParam.x);
float fMetallic = vParam.y;
......@@ -177,7 +173,7 @@ float4 main(VSO_ResPos IN):SV_TARGET
fShadow *= saturate(fNdotD - g_vLightSpotInnerOuterAngles.y) / (g_vLightSpotInnerOuterAngles.x - g_vLightSpotInnerOuterAngles.y);
#endif
float3 vVertexToEye = normalize(g_vPosCam.xyz - vPosition.xyz);
float3 vVertexToEye = normalize(g_vObserverPosCam.xyz - vPosition.xyz);
float fNdotL = dot(vNormalPixel, vLigth);
......
......@@ -7,13 +7,7 @@ lighting_gi.ps
#include <lpv.h>
#include <struct.h>
#include <mtrl.h>
//##########################################################################
cbuffer perFrame: register(b1)
{
float3 g_vViewPos;
};
#include <const.h>
//##########################################################################
......@@ -38,12 +32,12 @@ PSO_Lbuffer main(VSO_ResPos IN)
float fMetallic = vParams.y;
float3 vOrigin = float3(0, 0, 0); // Центр сетки
float3 vPosition = g_vViewPos + IN.vWorldRay * fDepth; // Мировая позиция пиксела
float3 vPosition = g_vObserverPosCam + IN.vWorldRay * fDepth; // Мировая позиция пиксела
float3 vNormalPixel = normalize(NormalDecode(vNormals.xyz).xyz);
float3 vReflectDir = -normalize(reflect(g_vViewPos - vPosition, vNormalPixel));
float3 vReflectDir = -normalize(reflect(g_vObserverPosCam - vPosition, vNormalPixel));
// OUT.vAmdient.xyz = lerp(vAlbedo.xyz, GetPixelLight(vPosition, vNormalPixel) * vAlbedo.xyz, vAlbedo.w);
OUT.vAmdient.xyz = lerp(vAlbedo.xyz, GetPixelLight(vPosition, lerp(vNormalPixel, vReflectDir, fMetallic)) * vAlbedo.xyz, vAlbedo.w);
......
......@@ -17,7 +17,7 @@ PSO_Gbuffer main(PSI_XMaterial IN)
IN.vNormal = normalize(IN.vNormal);
#ifndef WANT_WRITE_DEPTH
float fDepth = 1.0f - (IN.vPos.z / g_vNearFarInvWinSize.x);
float fDepth = 1.0f - (IN.vPos.z / g_vNearFar.x);
#endif
XMaterial mtrl = XMATERIAL_MAIN(IN);
......@@ -39,7 +39,7 @@ PSO_Gbuffer main(PSI_XMaterial IN)
//float fDepth =
#ifdef WANT_WRITE_DEPTH
float fDepth = (mtrl.fDepth + g_vNearFarInvWinSize.x) / g_vNearFarInvWinSize.y;
float fDepth = (mtrl.fDepth + g_vNearFar.x) / g_vNearFar.y;
#else
// 1.0f - IN.vPos.z / g_vNearFarInvWinSize.x;
//(IN.vPos.z / IN.vPos.w);
......
......@@ -5,16 +5,7 @@ pp_res_pos.vs
*/
#include <struct.h>
//##########################################################################
cbuffer perFrame: register(b1)
{
float4x4 g_mVP;
float4x4 g_mViewInv;
float4 g_vNearFar;
float3 g_vParamProj;
};
#include <const.h>
//##########################################################################
......@@ -24,13 +15,13 @@ VSO_ResPos main(VSI_PP IN)
OUT.vPosition = float4(IN.vPosition, 1.0);
OUT.vTexUV = IN.vTexUV.xy;
float fTanHalfFOV = tan(g_vParamProj.z * 0.5) ;
float aspectRatio = g_vParamProj.x / g_vParamProj.y;
float fFarY = fTanHalfFOV * g_vNearFar.y;
float fTanHalfFOV = tan(g_vObserverParamProj.z * 0.5) ;
float aspectRatio = g_vObserverParamProj.x / g_vObserverParamProj.y;
float fFarY = fTanHalfFOV * g_vObserverNearFar.y;
float fFarX = fFarY * aspectRatio;
OUT.vEyeRay = float3(sign(OUT.vPosition.x) * fFarX, sign(OUT.vPosition.y) * fFarY, g_vNearFar.y);
OUT.vWorldRay = mul(float4(OUT.vEyeRay, 0.0), g_mViewInv).xyz;
OUT.vEyeRay = float3(sign(OUT.vPosition.x) * fFarX, sign(OUT.vPosition.y) * fFarY, g_vObserverNearFar.y);
OUT.vWorldRay = mul(float4(OUT.vEyeRay, 0.0), g_mObserverInvV).xyz;
return OUT;
}
\ No newline at end of file
......@@ -61,7 +61,7 @@ float4 main(VSO_ResPos IN):COLOR0
//g_txDepthShadow.Sample(g_sLinearClamp, IN.vTexUV)
float fDepth = g_txDepthView.Sample(g_sPointClamp, IN.vTexUV).r;
float4 vPixelPos = float4(g_vPosCam + IN.vWorldRay * fDepth,1.f);
float4 vPixelPos = float4(g_vObserverPosCam + IN.vWorldRay * fDepth,1.f);
float4 vTexCoord = mul(vPixelPos, g_mMatrixTexture);
vTexCoord.xyz = vTexCoord.xyz / vTexCoord.w;
......
......@@ -55,7 +55,7 @@ cbuffer perShadow: register(b6)
{
float4x4 g_mMatrixTextureV[6];
float4x4 g_mMatrixTextureP[6];
float4 vSizeBoundNearFar;
float4 g_vSizeBoundNearFar;
};
SamplerComparisonState g_sComparisonLinearClamp: register(s1);
......@@ -71,9 +71,9 @@ float4 main(VSO_ResPos IN): COLOR0
float fShadow = 1.0f;
float fDepth = g_txDepthView.Sample(g_sPointClamp, IN.vTexUV).r;
float3 vNormalWS = normalize(NormalDecode(g_txNormals.Sample(g_sPointClamp, IN.vTexUV).xyz).xyz);
float4 vPixelPosWS = float4(g_vPosCam + IN.vWorldRay * fDepth, 1.f);
float4 vPixelPosWS = float4(g_vObserverPosCam + IN.vWorldRay * fDepth, 1.f);
float delta = 1.0f / vSizeBoundNearFar.x;
float delta = 1.0f / g_vSizeBoundNearFar.x;
[unroll]for(int split = 0; split < NUM_SPLITS; split++)
{
......@@ -93,18 +93,18 @@ float4 main(VSO_ResPos IN): COLOR0
float3 vNormalLS = normalize(mul(float4(vNormalWS, 0.0f), g_mMatrixTextureV[split]).xyz);
// Locate corresponding light space shadow map grid center
float2 index = floor(vTexCoord.xy * vSizeBoundNearFar.xx);
float2 index = floor(vTexCoord.xy * g_vSizeBoundNearFar.xx);
// Normalized coordinate in [0,1]
float2 nlsGridCenter = 2.0f * delta * (index + float2(0.5f, 0.5f)); // Normalized eye space grid center --- [0,1]
// Unnormalized coordinate in [-lightLeft,lightLeft]
float2 lsGridCenter = vSizeBoundNearFar.y * (2.0f * nlsGridCenter - float2(1.0f, 1.0f));
float2 lsGridCenter = g_vSizeBoundNearFar.y * (2.0f * nlsGridCenter - float2(1.0f, 1.0f));
/** Define light ray **/
// Light ray direction in light space
// float3 lsGridLineDir = normalize(float3(lsGridCenter, -vSizeBoundNearFar.z)); // Light space grid line direction
float3 lsGridLineDir = normalize(float3(0.0f, 0.0f, -vSizeBoundNearFar.z)); // Light space grid line direction
// float3 lsGridLineDir = normalize(float3(lsGridCenter, -g_vSizeBoundNearFar.z)); // Light space grid line direction
float3 lsGridLineDir = normalize(float3(0.0f, 0.0f, -g_vSizeBoundNearFar.z)); // Light space grid line direction
/** Plane ray intersection **/
// Locate the potential occluder for the shading fragment
......@@ -124,8 +124,8 @@ float4 main(VSO_ResPos IN): COLOR0
float SMDepth = g_txDepthShadow.Sample(g_sPointClamp, cubeCoord).r;
// A and B are computed bnased on light near and far planes.
// They can be retrieved directly from light projection matrix
float A = vSizeBoundNearFar.w * g_mMatrixTextureP[split][2][2];
float B = vSizeBoundNearFar.w * g_mMatrixTextureP[split][3][2];
float A = g_vSizeBoundNearFar.w * g_mMatrixTextureP[split][2][2];
float B = g_vSizeBoundNearFar.w * g_mMatrixTextureP[split][3][2];
float adaptiveDepthBias = 0.5f * pow(1.0f - A - 2.0f * SMDepth, 2) * constantBias / B;
......
......@@ -4,7 +4,7 @@ terrax_colored.vs
*/
#include <../struct.h>
#include <struct.h>
//##########################################################################
......
......@@ -216,7 +216,6 @@
<ClCompile Include="..\..\..\source\gcore\sxgcore_dll.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\..\..\source\common\file_utils.h" />
<ClInclude Include="..\..\..\source\common\string.h" />
<ClInclude Include="..\..\..\source\common\string_utils.h" />
<ClInclude Include="..\..\..\source\gcore\bound.h" />
......
......@@ -53,9 +53,6 @@
<ClInclude Include="..\..\..\source\common\string.h">
<Filter>Header</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\common\file_utils.h">
<Filter>Header</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\common\string_utils.h">
<Filter>Header</Filter>
</ClInclude>
......
......@@ -192,6 +192,8 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\..\source\light\plugin_main.cpp" />
<ClCompile Include="..\..\..\source\light\shadow.cpp" />
<ClCompile Include="..\..\..\source\light\ShadowCache.cpp" />
<ClCompile Include="..\..\..\source\light\sxlight.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</ExcludedFromBuild>
......@@ -206,6 +208,8 @@
<ClInclude Include="..\..\..\source\light\IXLightSystem.h" />
<ClInclude Include="..\..\..\source\light\light.h" />
<ClInclude Include="..\..\..\source\light\ml_data.h" />
<ClInclude Include="..\..\..\source\light\shadow.h" />
<ClInclude Include="..\..\..\source\light\ShadowCache.h" />
<ClInclude Include="..\..\..\source\light\sxlight.h" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
......
......@@ -19,6 +19,12 @@
<ClCompile Include="..\..\..\source\light\LightSystem.cpp">
<Filter>Source</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\light\shadow.cpp">
<Filter>Source</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\light\ShadowCache.cpp">
<Filter>Source</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<Filter Include="Source">
......@@ -47,5 +53,11 @@
<ClInclude Include="..\..\..\source\light\LightSystem.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\light\ShadowCache.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\light\shadow.h">
<Filter>Headers</Filter>
</ClInclude>
</ItemGroup>
</Project>
\ No newline at end of file
......@@ -187,8 +187,6 @@
<ClInclude Include="..\..\..\source\render\RenderableVisibility.h" />
<ClInclude Include="..\..\..\source\render\RenderPipeline.h" />
<ClInclude Include="..\..\..\source\render\render_func.h" />
<ClInclude Include="..\..\..\source\render\shadow.h" />
<ClInclude Include="..\..\..\source\render\ShadowCache.h" />
<ClInclude Include="..\..\..\source\render\sxrender.h" />
</ItemGroup>
<ItemGroup>
......@@ -200,8 +198,6 @@
<ClCompile Include="..\..\..\source\render\RenderableVisibility.cpp" />
<ClCompile Include="..\..\..\source\render\RenderPipeline.cpp" />
<ClCompile Include="..\..\..\source\render\render_func.cpp" />
<ClCompile Include="..\..\..\source\render\shadow.cpp" />
<ClCompile Include="..\..\..\source\render\ShadowCache.cpp" />
<ClCompile Include="..\..\..\source\render\sxrender.cpp" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
......
......@@ -36,12 +36,6 @@
<ClInclude Include="..\..\..\source\render\RenderPipeline.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\render\ShadowCache.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\render\shadow.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\..\..\source\render\RenderableVisibility.h">
<Filter>Header Files</Filter>
</ClInclude>
......@@ -71,12 +65,6 @@
<ClCompile Include="..\..\..\source\render\RenderPipeline.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\render\ShadowCache.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\render\shadow.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\..\source\render\RenderableVisibility.cpp">
<Filter>Source Files</Filter>
</ClCompile>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment