Advertisement
Guest User

tess.h

a guest
May 24th, 2013
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.09 KB | None | 0 0
  1. #ifndef TESS_H_INCLUDED
  2. # define TESS_H_INCLUDED
  3.  
  4. // Output patch constant data.
  5. struct PNPatch
  6. {
  7. // Geometry cubic control points (excluding corners)
  8. float3 f3B210 : POSITION3;
  9. float3 f3B120 : POSITION4;
  10. float3 f3B021 : POSITION5;
  11. float3 f3B012 : POSITION6;
  12. float3 f3B102 : POSITION7;
  13. float3 f3B201 : POSITION8;
  14. float3 f3B111 : CENTER;
  15.  
  16. // Normal quadratic control points (excluding corners)
  17. float3 f3N110 : NORMAL3;
  18. float3 f3N011 : NORMAL4;
  19. float3 f3N101 : NORMAL5;
  20. };
  21.  
  22. struct HS_CONSTANT_DATA_OUTPUT
  23. {
  24. float Edges[3] : SV_TessFactor;
  25. float Inside : SV_InsideTessFactor;
  26. //float3 www : DUBBIES;
  27. #ifdef TESS_PN
  28. PNPatch patch;
  29. #endif
  30. };
  31.  
  32. float triLOD;
  33.  
  34. void ComputeTessFactor(out float Edges[3] : SV_TessFactor, out float Inside : SV_InsideTessFactor)
  35. {
  36. //float factor = clamp(triLOD, 1, 1);//factor = (Output.N.z>0)?-1:10;//max(factor*10, 1);
  37.  
  38. Edges[0] = Edges[1] = Edges[2] = /*63;//*/triLOD;//factor;
  39. Inside = /*63;//*/triLOD;//factor;
  40. }
  41.  
  42. void ComputePNPatch(float3 P[3], float3 N[3], out PNPatch patch)
  43. {
  44. // Compute the cubic geometry control points
  45. // Edge control points
  46. patch.f3B210 = (2.0f*P[0].xyz + P[1].xyz - dot(P[1].xyz-P[0].xyz, N[0])*N[0]) / 3.0f;
  47. patch.f3B120 = (2.0f*P[1].xyz + P[0].xyz - dot(P[0].xyz-P[1].xyz, N[1])*N[1]) / 3.0f;
  48. patch.f3B021 = (2.0f*P[1].xyz + P[2].xyz - dot(P[2].xyz-P[1].xyz, N[1])*N[1]) / 3.0f;
  49. patch.f3B012 = (2.0f*P[2].xyz + P[1].xyz - dot(P[1].xyz-P[2].xyz, N[2])*N[2]) / 3.0f;
  50. patch.f3B102 = (2.0f*P[2].xyz + P[0].xyz - dot(P[0].xyz-P[2].xyz, N[2])*N[2]) / 3.0f;
  51. patch.f3B201 = (2.0f*P[0].xyz + P[2].xyz - dot(P[2].xyz-P[0].xyz, N[0])*N[0]) / 3.0f;
  52.  
  53. // Center control point
  54. float3 f3E = ( patch.f3B210 + patch.f3B120 + patch.f3B021 + patch.f3B012 + patch.f3B102 + patch.f3B201 ) / 6.0f;
  55. float3 f3V = ( P[0].xyz + P[1].xyz + P[2].xyz ) / 3.0f;
  56. patch.f3B111 = f3E + ( ( f3E - f3V ) / 2.0f );
  57.  
  58. // Compute the quadratic normal control points, and rotate into world space
  59. float fV12 = 2.0f * dot( P[1].xyz - P[0].xyz, N[0] + N[1] ) / dot( P[1].xyz - P[0].xyz, P[1].xyz - P[0].xyz );
  60. patch.f3N110 = normalize( N[0] + N[1] - fV12 * ( P[1].xyz - P[0].xyz ));
  61. float fV23 = 2.0f * dot( P[2].xyz - P[1].xyz, N[1] + N[2] ) / dot( P[2].xyz - P[1].xyz, P[2].xyz - P[1].xyz );
  62. patch.f3N011 = normalize( N[1] + N[2] - fV23 * ( P[2].xyz - P[1].xyz ));
  63. float fV31 = 2.0f * dot( P[0].xyz - P[2].xyz, N[2] + N[0] ) / dot( P[0].xyz - P[2].xyz, P[0].xyz - P[2].xyz );
  64. patch.f3N101 = normalize( N[2] + N[0] - fV31 * ( P[0].xyz - P[2].xyz ));
  65. }
  66.  
  67. void ComputePatchVertex(float3 P[3], float3 N[3], float3 uvw, in PNPatch patch, out float3 Pos, out float3 Norm)
  68. {
  69. float u = uvw.y;
  70. float v = uvw.x;
  71. float w = uvw.z;
  72.  
  73. Pos = P[0] * w * w * w +
  74. P[1] * u * u * u +
  75. P[2] * v * v * v +
  76. patch.f3B210 * 3.0f * w * w * u +
  77. patch.f3B120 * 3.0f * w * u * u +
  78. patch.f3B201 * 3.0f * w * w * v +
  79. patch.f3B021 * 3.0f * u * u * v +
  80. patch.f3B102 * 3.0f * w * v * v +
  81. patch.f3B012 * 3.0f * u * v * v +
  82. patch.f3B111 * 6.0f * w * u * v;
  83.  
  84.  
  85. // Compute normal from quadratic control points and barycentric coords
  86. Norm = N[0] * w * w +
  87. N[1] * u * u +
  88. N[2] * v * v +
  89. patch.f3N110 * w * u +
  90. patch.f3N011 * u * v +
  91. patch.f3N101 * w * v;
  92. }
  93.  
  94. sampler smp_bump_ds; // Use D3DTADDRESS_WRAP, D3DTEXF_ANISOTROPIC, D3DTEXF_LINEAR, D3DTEXF_ANISOTROPIC
  95. Texture2D s_tbump; //
  96. Texture2D s_tbumpX; //
  97. Texture2D s_tdetailBumpX; // Error for bump detail
  98.  
  99. void ComputeDisplacedVertex(inout float3 P, float3 N, float2 tc, float2 tcd)
  100. {
  101. #ifdef USE_TDETAIL
  102. float4 Nu = s_tbump.SampleLevel (smp_bump_ds, tc, 0); // IN: normal.gloss
  103. float4 NuE = s_tbumpX.SampleLevel(smp_bump_ds, tc, 0); // IN: normal_error.height
  104.  
  105. float3 Ne = Nu.wzy + (NuE.xyz - 1.0h); //(Nu.wzyx - .5h) + (E-.5)
  106. float height = NuE.w;
  107.  
  108. # ifdef USE_TDETAIL_BUMP
  109. float4 NDetailX = s_tdetailBumpX.SampleLevel(smp_bump_ds, tcd, 0);
  110. height += (NDetailX.w-0.5)*0.2;
  111. # endif
  112.  
  113. P += N*height*0.07;
  114. #endif
  115. }
  116.  
  117. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement