home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 18759 / ROE.7z / QSSHADER_INDIRECT_MORPH.h < prev    next >
Encoding:
C/C++ Source or Header  |  2020-09-17  |  1.5 KB  |  91 lines

  1. #ifndef QSSHADER_INDIRECT_MORPH_H
  2. #define QSSHADER_INDIRECT_MORPH_H
  3.  
  4. #if INDIRECT_EXECUTE
  5.  
  6. sampler2D LodMap;
  7.  
  8. float GetLodSampleDir(float v)
  9. {
  10.     if(v==0.0f)
  11.     {
  12.         return -1.0f;
  13.     }
  14.     if(v==1.0f)
  15.     {
  16.         return 1.0f;
  17.     }
  18.     return 0.0f;
  19. }
  20.  
  21. bool EuqalEpsilon(float a, float b)
  22. {
  23.     return abs(a-b)<0.00001f;
  24. }
  25.  
  26.  float2 MorphLodPos(float2 pos, float2 uv, float lodBase, float2 terrainMultiplier, float gridNum) 
  27. {
  28.     //dir
  29.     bool edge = pos.x==0.0f || pos.y==0.0f || pos.x==1.0f || pos.y==1.0f;
  30.     float2 result = pos;
  31.     float curLod = tex2Dlod(LodMap, NoMipMapPointClamp, float4(uv,0,0));
  32.  
  33.     float lodRatio = saturate(curLod - lodBase);//0 is current, 1 is next lod
  34.  
  35.     if(edge)
  36.     {
  37.         float2 biasDir;
  38.         biasDir.x = GetLodSampleDir(pos.x);
  39.         biasDir.y = GetLodSampleDir(pos.y);
  40.         
  41.         float2 neighborUv = uv + biasDir * terrainMultiplier;
  42.         float neighborLod = tex2Dlod(LodMap, NoMipMapPointClamp, float4(neighborUv,0,0));
  43.         if(EuqalEpsilon(floor(neighborLod)-1.0f,lodBase))
  44.         {
  45.              lodRatio = 1.0f;
  46.         }
  47.         else
  48.         {
  49.              lodRatio = 0.0f;
  50.         }
  51.     }
  52.     else
  53.     {
  54.         // lodRatio = 0.0f;//for debug edge
  55.     }
  56.  
  57.     {
  58.         int2 uvLod = floor(pos*gridNum);
  59.         if(uvLod.x%2==1)
  60.         {
  61.             if(((uvLod.x-1)/2)%2==0)
  62.             {                
  63.                 result.x -= lodRatio/gridNum;
  64.             }
  65.             else
  66.             {
  67.                 result.x += lodRatio/gridNum;
  68.             }
  69.         }
  70.  
  71.         if(uvLod.y%2==1)
  72.         {
  73.  
  74.             if(((uvLod.y-1)/2)%2==0)
  75.             {
  76.                 result.y -= lodRatio/gridNum;
  77.             }
  78.             else
  79.             {
  80.                 result.y += lodRatio/gridNum;
  81.             }
  82.         }
  83.         return result;
  84.     }
  85.  
  86.     return result;
  87. }
  88.  
  89. #endif
  90.  
  91. #endif//QSSHADER_INDIRECT_MORPH_H