Advertisement
Guest User

Terrain Sample Output

a guest
Sep 6th, 2013
399
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.66 KB | None | 0 0
  1. Mesh: Loading sphere.mesh.
  2. DefaultWorkQueueBase('Root') - QUEUED(thread:2658): ID=1 channel=2 requestType=1
  3. DefaultWorkQueueBase('Root') - PROCESS_REQUEST_START(2658): ID=1 channel=2 requestType=1
  4. Terrain created; size=513 minBatch=33 maxBatch=65 treeDepth=4 lodLevels=5 leafLods=2
  5. Terrain::distributeVertexData processing source terrain size of 513
  6. Assigning vertex data, resolution=513 startDepth=2 endDepth=4 splits=4
  7. Assigning vertex data, resolution=129 startDepth=0 endDepth=2 splits=1
  8. Terrain::distributeVertexData finished
  9. DefaultWorkQueueBase('Root') - PROCESS_REQUEST_END(2658): ID=1 channel=2 requestType=1 processed=1
  10. DefaultWorkQueueBase('Root') - PROCESS_RESPONSE_START(thread:2658): ID=1 success=1 messages=[] channel=2 requestType=1
  11. DefaultWorkQueueBase('Root') - QUEUED(thread:2658): ID=2 channel=4 requestType=1
  12. DefaultWorkQueueBase('Root') - PROCESS_REQUEST_START(2658): ID=2 channel=4 requestType=1
  13. DefaultWorkQueueBase('Root') - PROCESS_REQUEST_END(2658): ID=2 channel=4 requestType=1 processed=1
  14. DefaultWorkQueueBase('Root') - PROCESS_RESPONSE_START(thread:2658): ID=2 success=1 messages=[] channel=4 requestType=1
  15. DefaultWorkQueueBase('Root') - PROCESS_RESPONSE_END(thread:2658): ID=2 success=1 messages=[] channel=4 requestType=1
  16. DefaultWorkQueueBase('Root') - QUEUED(thread:2658): ID=3 channel=3 requestType=1
  17. *** Terrain Vertex Program: OgreTerrain/1357558352/sm2/vp/hlod ***
  18. struct v2p
  19. {
  20. float4 oPos : POSITION;
  21. float4 oPosObj : TEXCOORD0;
  22. float4 oUVMisc : TEXCOORD1; // xy = uv, z = camDepth
  23. float4 oUV0 : TEXCOORD2;
  24. float4 oUV1 : TEXCOORD3;
  25. float fogVal : COLOR;
  26. float4 oLightSpacePos0 : TEXCOORD4 ;
  27. };
  28. v2p main_vp(
  29. float2 posIndex : POSITION,
  30. float height : TEXCOORD0,
  31. float2 delta : TEXCOORD1,
  32. uniform float4x4 worldMatrix,
  33. uniform float4x4 viewProjMatrix,
  34. uniform float2 lodMorph,
  35. uniform float4x4 posIndexToObjectSpace,
  36. uniform float baseUVScale,
  37. uniform float4 uvMul_0
  38. , uniform float4 fogParams
  39. )
  40. {
  41. float4 pos;
  42. pos = mul(posIndexToObjectSpace, float4(posIndex, height, 1));
  43. float2 uv = float2(posIndex.x * baseUVScale, 1.0 - (posIndex.y * baseUVScale));
  44. float4 worldPos = mul(worldMatrix, pos);
  45. v2p output;
  46. output.oPosObj = pos;
  47. float toMorph = -min(0, sign(delta.y - lodMorph.y));
  48. worldPos.y += delta.x * toMorph * lodMorph.x;
  49. output.oUV0.xy = uv.xy * uvMul_0.r;
  50. output.oUV0.zw = uv.xy * uvMul_0.g;
  51. output.oUV1.xy = uv.xy * uvMul_0.b;
  52. output.oUV1.zw = uv.xy * uvMul_0.a;
  53. output.oPos = mul(viewProjMatrix, worldPos);
  54. output.oUVMisc.xy = uv.xy;
  55. output.fogVal = saturate((output.oPos.z - fogParams.y) * fogParams.w);
  56. return output;}
  57.  
  58. *** ***
  59. *** Terrain Fragment Program: OgreTerrain/1357558352/sm2/fp/hlod ***
  60. SamplerState g_SamLinear
  61. {
  62. Filter = MIN_MAG_MIP_LINEAR;
  63. AddressU = Wrap;
  64. AddressV = Wrap;
  65. };
  66. float4 expand(float4 v)
  67. {
  68. return v * 2 - 1;
  69. }
  70.  
  71.  
  72. struct v2p
  73. {
  74. float4 oPos : POSITION;
  75. float4 oPosObj : TEXCOORD0;
  76. float4 oUVMisc : TEXCOORD1; // xy = uv, z = camDepth
  77. float4 oUV0 : TEXCOORD2;
  78. float4 oUV1 : TEXCOORD3;
  79. float fogVal : COLOR;
  80. float4 oLightSpacePos0 : TEXCOORD4 ;
  81. };
  82. Texture2D globalNormal : register(s0);
  83. Texture2D lightMap : register(s1);
  84. Texture2D blendTex0 : register(s2);
  85. Texture2D difftex0 : register(s3);
  86. Texture2D normtex0 : register(s4);
  87. Texture2D difftex1 : register(s5);
  88. Texture2D normtex1 : register(s6);
  89. Texture2D difftex2 : register(s7);
  90. Texture2D normtex2 : register(s8);
  91. float4 main_fp(
  92. v2p input,
  93. uniform float3 fogColour,
  94. uniform float3 ambient,
  95. uniform float4 lightPosObjSpace,
  96. uniform float3 lightDiffuseColour,
  97. uniform float3 lightSpecularColour,
  98. uniform float3 eyePosObjSpace,
  99. uniform float4 scaleBiasSpecular
  100. ) : SV_Target
  101. {
  102. float4 outputCol;
  103. float shadow = 1.0;
  104. float2 uv = input.oUVMisc.xy;
  105. outputCol = float4(0,0,0,1);
  106. float3 normal = expand(globalNormal.Sample(g_SamLinear, uv)).rgb;
  107. float3 lightDir =
  108. lightPosObjSpace.xyz - (input.oPosObj.xyz * lightPosObjSpace.w);
  109. float3 eyeDir = eyePosObjSpace - input.oPosObj.xyz;
  110. float3 diffuse = float3(0,0,0);
  111. float specular = 0;
  112. float4 blendTexVal0 = blendTex0.Sample(g_SamLinear, uv);
  113. float3 tangent = float3(1, 0, 0);
  114. float3 binormal = normalize(cross(tangent, normal));
  115. tangent = normalize(cross(normal, binormal));
  116. float3x3 TBN = float3x3(tangent, binormal, normal);
  117. float4 litRes, litResLayer;
  118. float3 TSlightDir, TSeyeDir, TShalfAngle, TSnormal;
  119. float displacement;
  120. TSlightDir = normalize(mul(TBN, lightDir));
  121. TSeyeDir = normalize(mul(TBN, eyeDir));
  122. float2 uv0 = input.oUV0.xy;
  123. displacement = normtex0.Sample(g_SamLinear, uv0).a
  124. * scaleBiasSpecular.x + scaleBiasSpecular.y;
  125. uv0 += TSeyeDir.xy * displacement;
  126. TSnormal = expand(normtex0.Sample(g_SamLinear, uv0)).rgb;
  127. TShalfAngle = normalize(TSlightDir + TSeyeDir);
  128. litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);
  129. litRes = litResLayer;
  130. float4 diffuseSpecTex0 = difftex0.Sample(g_SamLinear, uv0);
  131. diffuse = diffuseSpecTex0.rgb;
  132. specular = diffuseSpecTex0.a;
  133. float2 uv1 = input.oUV0.zw;
  134. displacement = normtex1.Sample(g_SamLinear, uv1).a
  135. * scaleBiasSpecular.x + scaleBiasSpecular.y;
  136. uv1 += TSeyeDir.xy * displacement;
  137. TSnormal = expand(normtex1.Sample(g_SamLinear, uv1)).rgb;
  138. TShalfAngle = normalize(TSlightDir + TSeyeDir);
  139. litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);
  140. litRes = lerp(litRes, litResLayer, blendTexVal0.r);
  141. float4 diffuseSpecTex1 = difftex1.Sample(g_SamLinear, uv1);
  142. diffuse = lerp(diffuse, diffuseSpecTex1.rgb, blendTexVal0.r);
  143. specular = lerp(specular, diffuseSpecTex1.a, blendTexVal0.r);
  144. float2 uv2 = input.oUV1.xy;
  145. displacement = normtex2.Sample(g_SamLinear, uv2).a
  146. * scaleBiasSpecular.x + scaleBiasSpecular.y;
  147. uv2 += TSeyeDir.xy * displacement;
  148. TSnormal = expand(normtex2.Sample(g_SamLinear, uv2)).rgb;
  149. TShalfAngle = normalize(TSlightDir + TSeyeDir);
  150. litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);
  151. litRes = lerp(litRes, litResLayer, blendTexVal0.g);
  152. float4 diffuseSpecTex2 = difftex2.Sample(g_SamLinear, uv2);
  153. diffuse = lerp(diffuse, diffuseSpecTex2.rgb, blendTexVal0.g);
  154. specular = lerp(specular, diffuseSpecTex2.a, blendTexVal0.g);
  155. shadow = lightMap.Sample(g_SamLinear, uv).r;
  156. outputCol.rgb += ambient.rgb * diffuse + litRes.y * lightDiffuseColour * diffuse * shadow;
  157. outputCol.rgb += litRes.z * lightSpecularColour * specular * shadow;
  158. outputCol.rgb = lerp(outputCol.rgb, fogColour, input.fogVal);
  159. return outputCol;
  160. }
  161.  
  162. *** ***
  163. *** Terrain Vertex Program: OgreTerrain/1357558352/sm2/vp/llod ***
  164. struct v2p
  165. {
  166. float4 oPos : POSITION;
  167. float4 oPosObj : TEXCOORD0;
  168. float4 oUVMisc : TEXCOORD1; // xy = uv, z = camDepth
  169. float fogVal : COLOR;
  170. float4 oLightSpacePos0 : TEXCOORD2 ;
  171. };
  172. v2p main_vp(
  173. float2 posIndex : POSITION,
  174. float height : TEXCOORD0,
  175. float2 delta : TEXCOORD1,
  176. uniform float4x4 worldMatrix,
  177. uniform float4x4 viewProjMatrix,
  178. uniform float2 lodMorph,
  179. uniform float4x4 posIndexToObjectSpace,
  180. uniform float baseUVScale,
  181. uniform float4 uvMul_0
  182. , uniform float4 fogParams
  183. )
  184. {
  185. float4 pos;
  186. pos = mul(posIndexToObjectSpace, float4(posIndex, height, 1));
  187. float2 uv = float2(posIndex.x * baseUVScale, 1.0 - (posIndex.y * baseUVScale));
  188. float4 worldPos = mul(worldMatrix, pos);
  189. v2p output;
  190. output.oPosObj = pos;
  191. float toMorph = -min(0, sign(delta.y - lodMorph.y));
  192. worldPos.y += delta.x * toMorph * lodMorph.x;
  193. output.oPos = mul(viewProjMatrix, worldPos);
  194. output.oUVMisc.xy = uv.xy;
  195. output.fogVal = saturate((output.oPos.z - fogParams.y) * fogParams.w);
  196. return output;}
  197.  
  198. *** ***
  199. *** Terrain Fragment Program: OgreTerrain/1357558352/sm2/fp/llod ***
  200. SamplerState g_SamLinear
  201. {
  202. Filter = MIN_MAG_MIP_LINEAR;
  203. AddressU = Wrap;
  204. AddressV = Wrap;
  205. };
  206. float4 expand(float4 v)
  207. {
  208. return v * 2 - 1;
  209. }
  210.  
  211.  
  212. struct v2p
  213. {
  214. float4 oPos : POSITION;
  215. float4 oPosObj : TEXCOORD0;
  216. float4 oUVMisc : TEXCOORD1; // xy = uv, z = camDepth
  217. float fogVal : COLOR;
  218. float4 oLightSpacePos0 : TEXCOORD2 ;
  219. };
  220. Texture2D compositeMap : register(s0);
  221. float4 main_fp(
  222. v2p input,
  223. uniform float3 fogColour,
  224. uniform float3 ambient,
  225. uniform float4 lightPosObjSpace,
  226. uniform float3 lightDiffuseColour,
  227. uniform float3 lightSpecularColour,
  228. uniform float3 eyePosObjSpace,
  229. uniform float4 scaleBiasSpecular
  230. ) : SV_Target
  231. {
  232. float4 outputCol;
  233. float shadow = 1.0;
  234. float2 uv = input.oUVMisc.xy;
  235. outputCol = float4(0,0,0,1);
  236. float3 lightDir =
  237. lightPosObjSpace.xyz - (input.oPosObj.xyz * lightPosObjSpace.w);
  238. float3 eyeDir = eyePosObjSpace - input.oPosObj.xyz;
  239. float3 diffuse = float3(0,0,0);
  240. float specular = 0;
  241. float4 composite = compositeMap.Sample(g_SamLinear, uv);
  242. diffuse = composite.rgb;
  243. outputCol.rgb = diffuse;
  244. outputCol.rgb = lerp(outputCol.rgb, fogColour, input.fogVal);
  245. return outputCol;
  246. }
  247.  
  248. *** ***
  249. WARNING: Texture instance 'OgreTerrain/1357558352/nm' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  250. WARNING: Texture instance 'OgreTerrain/1357558352/lm' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  251. WARNING: Texture instance 'TerrBlend1' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  252. WARNING: Texture instance 'OgreTerrain/1357558352/comp' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  253. WARNING: Texture instance 'OgreTerrain/1357558352/nm' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  254. WARNING: Texture instance 'OgreTerrain/1357558352/lm' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  255. WARNING: Texture instance 'TerrBlend1' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  256. Texture: dirt_grayrocky_diffusespecular.dds: Loading 1 faces(PF_DXT5,1024x1024x1) with 3 generated mipmaps from Image. Internal format is PF_DXT5,1024x1024x1.
  257. Texture: dirt_grayrocky_normalheight.dds: Loading 1 faces(PF_DXT5,1024x1024x1) with 3 generated mipmaps from Image. Internal format is PF_DXT5,1024x1024x1.
  258. Texture: grass_green-01_diffusespecular.dds: Loading 1 faces(PF_DXT5,1024x1024x1) with 3 generated mipmaps from Image. Internal format is PF_DXT5,1024x1024x1.
  259. Texture: grass_green-01_normalheight.dds: Loading 1 faces(PF_DXT5,1024x1024x1) with 3 generated mipmaps from Image. Internal format is PF_DXT5,1024x1024x1.
  260. Texture: growth_weirdfungus-03_diffusespecular.dds: Loading 1 faces(PF_DXT5,1024x1024x1) with 3 generated mipmaps from Image. Internal format is PF_DXT5,1024x1024x1.
  261. Texture: growth_weirdfungus-03_normalheight.dds: Loading 1 faces(PF_DXT5,1024x1024x1) with 3 generated mipmaps from Image. Internal format is PF_DXT5,1024x1024x1.
  262. WARNING: Texture instance 'OgreTerrain/1357558352/comp' was defined as manually loaded, but no manual loader was provided. This Resource will be lost if it has to be reloaded.
  263. *** Terrain Vertex Program: OgreTerrain/1357558352/sm2/vp/comp ***
  264. struct v2p
  265. {
  266. float4 oPos : POSITION;
  267. float4 oPosObj : TEXCOORD0;
  268. float4 oUVMisc : TEXCOORD1; // xy = uv, z = camDepth
  269. float4 oUV0 : TEXCOORD2;
  270. float4 oUV1 : TEXCOORD3;
  271. float4 oLightSpacePos0 : TEXCOORD4 ;
  272. };
  273. v2p main_vp(
  274. float4 pos : POSITION,
  275. float2 uv : TEXCOORD0,
  276. uniform float4x4 worldMatrix,
  277. uniform float4x4 viewProjMatrix,
  278. uniform float2 lodMorph,
  279. uniform float4 uvMul_0
  280. )
  281. {
  282. float4 worldPos = mul(worldMatrix, pos);
  283. v2p output;
  284. output.oPosObj = pos;
  285. output.oUV0.xy = uv.xy * uvMul_0.r;
  286. output.oUV0.zw = uv.xy * uvMul_0.g;
  287. output.oUV1.xy = uv.xy * uvMul_0.b;
  288. output.oUV1.zw = uv.xy * uvMul_0.a;
  289. output.oPos = mul(viewProjMatrix, worldPos);
  290. output.oUVMisc.xy = uv.xy;
  291. return output;}
  292.  
  293. *** ***
  294. *** Terrain Fragment Program: OgreTerrain/1357558352/sm2/fp/comp ***
  295. SamplerState g_SamLinear
  296. {
  297. Filter = MIN_MAG_MIP_LINEAR;
  298. AddressU = Wrap;
  299. AddressV = Wrap;
  300. };
  301. float4 expand(float4 v)
  302. {
  303. return v * 2 - 1;
  304. }
  305.  
  306.  
  307. struct v2p
  308. {
  309. float4 oPos : POSITION;
  310. float4 oPosObj : TEXCOORD0;
  311. float4 oUVMisc : TEXCOORD1; // xy = uv, z = camDepth
  312. float4 oUV0 : TEXCOORD2;
  313. float4 oUV1 : TEXCOORD3;
  314. float4 oLightSpacePos0 : TEXCOORD4 ;
  315. };
  316. Texture2D globalNormal : register(s0);
  317. Texture2D lightMap : register(s1);
  318. Texture2D blendTex0 : register(s2);
  319. Texture2D difftex0 : register(s3);
  320. Texture2D normtex0 : register(s4);
  321. Texture2D difftex1 : register(s5);
  322. Texture2D normtex1 : register(s6);
  323. Texture2D difftex2 : register(s7);
  324. Texture2D normtex2 : register(s8);
  325. float4 main_fp(
  326. v2p input,
  327. uniform float3 ambient,
  328. uniform float4 lightPosObjSpace,
  329. uniform float3 lightDiffuseColour,
  330. uniform float3 lightSpecularColour,
  331. uniform float3 eyePosObjSpace,
  332. uniform float4 scaleBiasSpecular
  333. ) : SV_Target
  334. {
  335. float4 outputCol;
  336. float shadow = 1.0;
  337. float2 uv = input.oUVMisc.xy;
  338. outputCol = float4(0,0,0,1);
  339. float3 normal = expand(globalNormal.Sample(g_SamLinear, uv)).rgb;
  340. float3 lightDir =
  341. lightPosObjSpace.xyz - (input.oPosObj.xyz * lightPosObjSpace.w);
  342. float3 eyeDir = eyePosObjSpace - input.oPosObj.xyz;
  343. float3 diffuse = float3(0,0,0);
  344. float specular = 0;
  345. float4 blendTexVal0 = blendTex0.Sample(g_SamLinear, uv);
  346. float3 tangent = float3(1, 0, 0);
  347. float3 binormal = normalize(cross(tangent, normal));
  348. tangent = normalize(cross(normal, binormal));
  349. float3x3 TBN = float3x3(tangent, binormal, normal);
  350. float4 litRes, litResLayer;
  351. float3 TSlightDir, TSeyeDir, TShalfAngle, TSnormal;
  352. float displacement;
  353. TSlightDir = normalize(mul(TBN, lightDir));
  354. TSeyeDir = normalize(mul(TBN, eyeDir));
  355. float2 uv0 = input.oUV0.xy;
  356. TSnormal = expand(normtex0.Sample(g_SamLinear, uv0)).rgb;
  357. TShalfAngle = normalize(TSlightDir + TSeyeDir);
  358. litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);
  359. litRes = litResLayer;
  360. float4 diffuseSpecTex0 = difftex0.Sample(g_SamLinear, uv0);
  361. diffuse = diffuseSpecTex0.rgb;
  362. specular = diffuseSpecTex0.a;
  363. float2 uv1 = input.oUV0.zw;
  364. TSnormal = expand(normtex1.Sample(g_SamLinear, uv1)).rgb;
  365. TShalfAngle = normalize(TSlightDir + TSeyeDir);
  366. litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);
  367. litRes = lerp(litRes, litResLayer, blendTexVal0.r);
  368. float4 diffuseSpecTex1 = difftex1.Sample(g_SamLinear, uv1);
  369. diffuse = lerp(diffuse, diffuseSpecTex1.rgb, blendTexVal0.r);
  370. specular = lerp(specular, diffuseSpecTex1.a, blendTexVal0.r);
  371. float2 uv2 = input.oUV1.xy;
  372. TSnormal = expand(normtex2.Sample(g_SamLinear, uv2)).rgb;
  373. TShalfAngle = normalize(TSlightDir + TSeyeDir);
  374. litResLayer = lit(dot(TSlightDir, TSnormal), dot(TShalfAngle, TSnormal), scaleBiasSpecular.z);
  375. litRes = lerp(litRes, litResLayer, blendTexVal0.g);
  376. float4 diffuseSpecTex2 = difftex2.Sample(g_SamLinear, uv2);
  377. diffuse = lerp(diffuse, diffuseSpecTex2.rgb, blendTexVal0.g);
  378. specular = lerp(specular, diffuseSpecTex2.a, blendTexVal0.g);
  379. shadow = lightMap.Sample(g_SamLinear, uv).r;
  380. outputCol.rgb += ambient.rgb * diffuse + litRes.y * lightDiffuseColour * diffuse * shadow;
  381. outputCol.a = shadow;
  382. return outputCol;
  383. }
  384.  
  385. *** ***
  386. Creating viewport on target 'rtt/288349280/0/SceneManagerInstance2/compRTT', rendering from camera 'cam', relative dimensions 8192L: 0 T: 0 W: 1 H: 1 ZOrder: 0
  387. Viewport for camera 'cam', actual dimensions 8192L: 0 T: 0 W: 1024 H: 1024
  388. D3D11 ERROR: ID3D11DeviceContext::DrawIndexed: Rasterization Unit is enabled (PixelShader is not NULL or Depth/Stencil test is enabled and RasterizedStream is not D3D11_SO_NO_RASTERIZED_STREAM) but position is not provided by the last shader before the Rasterization Unit. [ EXECUTION ERROR #362: DEVICE_DRAW_POSITION_NOT_PRESENT]
  389. First-chance exception at 0x000007FEFDBF9E5D in SampleBrowser_d.exe: Microsoft C++ exception: Ogre::RenderingAPIException at memory location 0x0000000000BA9740.
  390. First-chance exception at 0x000007FEFDBF9E5D in SampleBrowser_d.exe: Microsoft C++ exception: Ogre::RenderingAPIException at memory location 0x0000000000BA9740.
  391. DefaultWorkQueueBase('Root') - PROCESS_REQUEST_START(2690): ID=3 channel=3 requestType=1
  392. DefaultWorkQueueBase('Root') - PROCESS_REQUEST_END(2690): ID=3 channel=3 requestType=1 processed=1
  393. DefaultWorkQueueBase('Root') - PROCESS_RESPONSE_START(thread:2658): ID=3 success=1 messages=[] channel=3 requestType=1
  394. First-chance exception at 0x000007FEFDBF9E5D in SampleBrowser_d.exe: Microsoft C++ exception: Ogre::RenderingAPIException at memory location 0x0000000000BA2BB0.
  395. First-chance exception at 0x000007FEFDBF9E5D in SampleBrowser_d.exe: Microsoft C++ exception: Ogre::RenderingAPIException at memory location 0x0000000000BA2BB0.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement