Advertisement
Guest User

Untitled

a guest
Apr 5th, 2018
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.33 KB | None | 0 0
  1. SamplerState samp[8] : register(s0);
  2. Texture2DArray Tex[16] : register(t0);
  3.  
  4. int4 CHK_O_U8(int4 x)
  5. {
  6. return x & 255;
  7. }
  8. #define BOR(x, n) ((x) | (n))
  9. #define BSHR(x, n) ((x) >> (n))
  10. int2 BSH(int2 x, int n)
  11. {
  12. if(n >= 0)
  13. {
  14. return x >> n;
  15. }
  16. else
  17. {
  18. return x << (-n);
  19. }
  20. }
  21. int remainder(int x, int y)
  22. {
  23. return x % y;
  24. }
  25. // dot product for integer vectors
  26. int idot(int3 x, int3 y)
  27. {
  28. int3 tmp = x * y;
  29. return tmp.x + tmp.y + tmp.z;
  30. }
  31. int idot(int4 x, int4 y)
  32. {
  33. int4 tmp = x * y;
  34. return tmp.x + tmp.y + tmp.z + tmp.w;
  35. }
  36. // rounding + casting to integer at once in a single function
  37. int wuround(float x) { return int(round(x)); }
  38. int2 wuround(float2 x) { return int2(round(x)); }
  39. int3 wuround(float3 x) { return int3(round(x)); }
  40. int4 wuround(float4 x) { return int4(round(x)); }
  41. cbuffer TSBlock : register(b0) {
  42. float4 ctess;
  43. int4 ccullp;
  44. };
  45. cbuffer VSBlock : register(b1) {
  46. float4 cproj[4];
  47. float4 cDepth;
  48. float4 cViewport;
  49. };
  50. cbuffer PSBlock : register(b2) {
  51. int4 color[4];
  52. int4 knst[4];
  53. int4 alphaRef;
  54. float4 texdim[8];
  55. int4 czbias[2];
  56. int4 cindscale[2];
  57. int4 cindmtx[6];
  58. int4 cfogcolor;
  59. int4 cfogi;
  60. float4 cfogf[2];
  61. float4 czslope;
  62. int4 cflags;
  63. float4 cefbscale;
  64. };
  65. struct VS_OUTPUT {
  66. float4 pos : SV_Position;
  67. float4 colors_0 : COLOR0;
  68. float4 colors_1 : COLOR1;
  69. float4 clipPos : TEXCOORD0;
  70. float4 Normal : TEXCOORD1;
  71. float2 clipDist : SV_ClipDistance0;
  72. };
  73. struct ConstantOutput
  74. {
  75. float EFactor[3] : SV_TessFactor;
  76. float InsideFactor : SV_InsideTessFactor;
  77. float4 edgesize : TEXCOORD0;
  78. float4 Normal[3]: TEXCOORD1;
  79. };
  80.  
  81. struct HSOutput
  82. {
  83. float4 pos: BEZIERPOS;
  84. float4 colors_0: COLOR0;
  85. float4 colors_1: COLOR1;
  86. float2 clipDist: TANGENT;
  87. };
  88.  
  89. [domain("tri")]
  90. [partitioning("fractional_even")]
  91. [outputtopology("triangle_cw")]
  92. [outputcontrolpoints(3)]
  93. [patchconstantfunc("TConstFunc")]
  94. HSOutput HS_TFO(InputPatch<VS_OUTPUT, 3> patch, uint id : SV_OutputControlPointID,uint patchID : SV_PrimitiveID)
  95. {
  96. HSOutput result = (HSOutput)0;
  97. result.pos = float4(patch[id].clipPos.x,patch[id].clipPos.y,patch[id].Normal.w, 1.0);
  98. result.colors_0 = patch[id].colors_0;
  99. result.colors_1 = patch[id].colors_1;
  100. result.clipDist = patch[id].clipDist;
  101. return result;
  102. }
  103.  
  104.  
  105. float GetScreenSize(float3 Origin, float Diameter)
  106. {
  107. float w = dot(cproj[3], float4( Origin, 1.0 ));
  108. return abs(Diameter * cproj[1].y / w);
  109. }
  110.  
  111. float CalcTessFactor(float3 Origin, float Diameter)
  112. {
  113. float distance = 1.0 - saturate(length(Origin) * ctess.x);
  114. distance = distance * distance;
  115. return round(max(4.0,ctess.y * GetScreenSize(Origin,Diameter) * distance));
  116. }
  117. ConstantOutput TConstFunc(InputPatch<VS_OUTPUT, 3> patch)
  118. {
  119. ConstantOutput result = (ConstantOutput)0;
  120. if (ccullp.y != 0) {
  121. float3 spos0 = patch[0].pos.xyz / patch[0].pos.w;
  122. float3 spos1 = patch[1].pos.xyz / patch[1].pos.w;
  123. float3 spos2 = patch[2].pos.xyz / patch[2].pos.w;
  124. float3 posmax = max(max(spos0, spos1), spos2);
  125. float3 posmin = min(min(spos0, spos1), spos2);
  126. if (
  127. (posmin.x > 1.5 || posmax.x < -1.5 || posmin.y > 1.5 || posmax.y < -1.5 || posmin.z > 1.5 || posmax.z < -0.5))
  128. {
  129. result.EFactor[0] = 0;
  130. result.EFactor[1] = 0;
  131. result.EFactor[2] = 0;
  132. result.InsideFactor = 0;
  133. return result; // culled, so no further processing
  134. }
  135. }
  136. float4 pos[3];
  137. [unroll]
  138. for(int i = 0; i < 3; i++)
  139. {
  140. pos[i] = float4(patch[i].clipPos.x,patch[i].clipPos.y,patch[i].Normal.w, 1.0);
  141. result.Normal[i] = patch[i].Normal;
  142. }
  143. float3 edge0 = pos[1].xyz - pos[0].xyz;
  144. float3 edge2 = pos[2].xyz - pos[0].xyz;
  145. float3 faceNormal = normalize(cross(edge2, edge0));
  146. if (ccullp.x != 0) {
  147. float3 view = normalize(-pos[0].xyz);
  148. float visibility = dot(view, faceNormal);
  149. bool notvisible = ccullp.x < 0 ? (visibility < -0.25) : (visibility > 0.25);
  150. if (notvisible) {
  151. result.EFactor[0] = 0;
  152. result.EFactor[1] = 0;
  153. result.EFactor[2] = 0;
  154. result.InsideFactor = 0;
  155. return result; // culled, so no further processing
  156. }
  157. }
  158. float l0 = distance(pos[1].xyz,pos[2].xyz);
  159. float l1 = distance(pos[2].xyz,pos[0].xyz);
  160. float l2 = distance(pos[0].xyz,pos[1].xyz);
  161. result.edgesize = float4(l0, l1, l2, 1.0);
  162. result.EFactor[0] = CalcTessFactor((pos[1].xyz+pos[2].xyz) * 0.5, l0);
  163. result.EFactor[1] = CalcTessFactor((pos[2].xyz+pos[0].xyz) * 0.5, l1);
  164. result.EFactor[2] = CalcTessFactor((pos[0].xyz+pos[1].xyz) * 0.5, l2);
  165. result.InsideFactor = (result.EFactor[0] + result.EFactor[1] + result.EFactor[2]) / 3;
  166. return result;
  167. };
  168.  
  169. float3 PrjToPlane(float3 planeNormal, float3 planePoint, float3 pointToProject)
  170. {
  171. return pointToProject - dot(pointToProject-planePoint, planeNormal) * planeNormal;
  172. }
  173.  
  174. float BInterpolate(float v0, float v1, float v2, float3 barycentric)
  175. {
  176. return barycentric.z * v0 + barycentric.x * v1 + barycentric.y * v2;
  177. }
  178.  
  179. float2 BInterpolate(float2 v0, float2 v1, float2 v2, float3 barycentric)
  180. {
  181. return barycentric.z * v0 + barycentric.x * v1 + barycentric.y * v2;
  182. }
  183.  
  184. float2 BInterpolate(float2 v[3], float3 barycentric)
  185. {
  186. return BInterpolate(v[0], v[1], v[2], barycentric);
  187. }
  188.  
  189. float3 BInterpolate(float3 v0, float3 v1, float3 v2, float3 barycentric)
  190. {
  191. return barycentric.z * v0 + barycentric.x * v1 + barycentric.y * v2;
  192. }
  193.  
  194. float3 BInterpolate(float3 v[3], float3 barycentric)
  195. {
  196. return BInterpolate(v[0], v[1], v[2], barycentric);
  197. }
  198.  
  199. float4 BInterpolate(float4 v0, float4 v1, float4 v2, float3 barycentric)
  200. {
  201. return barycentric.z * v0 + barycentric.x * v1 + barycentric.y * v2;
  202. }
  203.  
  204. float4 BInterpolate(float4 v[3], float3 barycentric)
  205. {
  206. return BInterpolate(v[0], v[1], v[2], barycentric);
  207. }
  208.  
  209. [domain("tri")]
  210. VS_OUTPUT DS_TFO(ConstantOutput pconstans, const OutputPatch<HSOutput, 3> patch, float3 bCoords : SV_DomainLocation )
  211. {
  212. VS_OUTPUT result = (VS_OUTPUT)0;
  213. float displacement = 0.0, displacementcount = 0.0, borderdistance = bCoords.x * bCoords.y * bCoords.z;
  214. int3 tevcoord=int3(0,0,0);
  215. int2 wrappedcoord = int2(0, 0);
  216. if(cflags.x != 0)
  217. {
  218. float4 uv[0];
  219. int2 t_coord;
  220.  
  221. {
  222. }
  223. }
  224. float3 pos0 = patch[0].pos.xyz;
  225. float3 pos1 = patch[1].pos.xyz;
  226. float3 pos2 = patch[2].pos.xyz;
  227. float3 position = BInterpolate(pos0, pos1, pos2, bCoords);
  228. float3 norm0 = pconstans.Normal[0].xyz;
  229. float3 norm1 = pconstans.Normal[1].xyz;
  230. float3 norm2 = pconstans.Normal[2].xyz;
  231. float3 normal = normalize(BInterpolate(norm0, norm1, norm2, bCoords));
  232. pos0 = PrjToPlane(norm0, pos0, position);
  233. pos1 = PrjToPlane(norm1, pos1, position);
  234. pos2 = PrjToPlane(norm2, pos2, position);
  235. position = lerp(position, BInterpolate(pos0, pos1, pos2, bCoords),saturate(ctess.zzz * borderdistance * 16.0));
  236. position += displacement * normal * ctess.w;
  237. float4 pos = float4(position, 1.0);
  238. result.pos = float4(dot(cproj[0], pos), dot(cproj[1], pos), dot(cproj[2], pos), dot(cproj[3], pos));
  239. result.pos.xy = result.pos.xy + result.pos.w * cDepth.zw;
  240. result.colors_0 = BInterpolate(patch[0].colors_0, patch[1].colors_0, patch[2].colors_0, bCoords);
  241. result.colors_1 = BInterpolate(patch[0].colors_1, patch[1].colors_1, patch[2].colors_1, bCoords);
  242. result.clipDist = BInterpolate(patch[0].clipDist, patch[1].clipDist, patch[2].clipDist, bCoords);
  243. result.clipPos = float4(position.xy, result.pos.zw);
  244. result.Normal = float4(normal.xyz, position.z);
  245. result.pos.z = result.pos.w * cDepth.x - result.pos.z * cDepth.y;
  246. return result;
  247. }C:\Users\HenrikoMagnifico\Documents\Ishiiruka Dolphin\Shader@0x000002CCB111D1C0(218,8-12): error X3059: array dimension must be between 1 and 65536
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement