daily pastebin goal
56%
SHARE
TWEET

Untitled

a guest May 26th, 2014 366 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. float4 RayIntersectsCone(float3 rayStart, float3 rayDir)
  2. {
  3.         float a = rayDir.x*rayDir.x + rayDir.y*rayDir.y                                 -       rayDir.z*rayDir.z;
  4.         float b = 2 * (rayStart.x*rayDir.x + rayStart.y*rayDir.y                -       rayStart.z*rayDir.z);
  5.         float c = rayStart.x*rayStart.x + rayStart.y*rayStart.y         -       rayStart.z*rayStart.z;
  6.        
  7.         float delta = b * b - 4 * a * c;
  8.        
  9.         float sqDelta = sqrt(delta);
  10.         float side1 = (-b - sqDelta) / (2 * a); // outside
  11.         float side2 = (-b + sqDelta) / (2 * a); // inside
  12.        
  13.         float3 planeO = -rayStart.z + 1;
  14.         float cap = planeO / rayDir.z;
  15.        
  16.         return float4(side1, side2, cap, rayDir.z);
  17. }
  18.  
  19. float sqrDistance(float3 A, float3 B)
  20. {
  21.         float3 vec = B-A;
  22.         return dot(vec,vec);
  23. }
  24.  
  25. bool SpotVisible(Light light, float3 rayDir, float sqrMinDepth, float sqrMaxDepth)
  26. {
  27.                 float3 conePos = light.object2World[3];
  28.                
  29.                 float3 rayStart = PosCam - conePos;
  30.  
  31.                 rayDir = mul(rayDir, (float3x3)light.world2Object);
  32.                 rayStart = mul(rayStart, (float3x3)light.world2Object);
  33.                
  34.                
  35.                 float4 cone = RayIntersectsCone(rayStart, rayDir);
  36.                 float3 coneCapWPos                      = rayStart + rayDir*cone.z;
  37.                 bool visibleCap                  = coneCapWPos.x*coneCapWPos.x + coneCapWPos.y*coneCapWPos.y < 1;
  38.                 if (visibleCap)
  39.                 {
  40.                         if (cone.w < 0)
  41.                         {
  42.                                 cone.x = cone.z;
  43.                         }
  44.                         else
  45.                         {
  46.                                 cone.y = cone.z;
  47.                         }
  48.                 }
  49.  
  50.                 float3 coneOutsideWPos  = rayStart + rayDir*cone.x;
  51.                 float3 coneInsideWPos           = rayStart + rayDir*cone.y;
  52.                
  53.                 float3 coneOutsideWPos2 = mul(coneOutsideWPos, (float3x3)light.object2World) + conePos;
  54.                 float3 coneInsideWPos2 = mul(coneInsideWPos, (float3x3)light.object2World) + conePos;
  55.                
  56.                 bool visibleOutside = (cone.x >= 0) && (coneOutsideWPos.z>0) && (coneOutsideWPos.z<1.0001);
  57.                 bool visibleInside       = (cone.y >= 0) && (coneInsideWPos.z> 0) && (coneInsideWPos.z<1.0001);
  58.  
  59.  
  60.                 float outsideDistToCone =       visibleOutside? sqrDistance(PosCam, coneOutsideWPos2)   : -1;
  61.                 float insideDistToCone =        visibleInside? sqrDistance(PosCam, coneInsideWPos2)                     : -1;
  62.                 bool lightVisible = (visibleOutside||visibleInside) && (insideDistToCone > sqrMinDepth) && (outsideDistToCone < sqrMaxDepth);
  63.                
  64.                 return lightVisible;
  65. }
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
 
Top