Advertisement
Guest User

Untitled

a guest
May 20th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 KB | None | 0 0
  1. #pragma kernel ComputeNeighbors
  2.  
  3. static const int NumThreads = 8;
  4.  
  5. struct Triangle {
  6.     uint VertexIndexA;
  7.     uint VertexIndexB;
  8.     uint VertexIndexC;
  9.     uint EdgeCount;
  10.     uint Edges[3];
  11. };
  12.  
  13. struct Edge {
  14.     uint VertexIndexA;
  15.     uint VertexIndexB;
  16. };
  17.  
  18. RWStructuredBuffer<Triangle> PreTriangles;
  19. RWStructuredBuffer<Edge> PreEdges;
  20.  
  21. uint PreTrianglesCount;
  22. uint PreEdgesCount;
  23.  
  24. bool GetEdgeIndex(uint vertexIndexA, uint vertexIndexB, inout uint edgeIndex) {
  25.     for (uint i = 0; i < PreEdgesCount; i++) {
  26.         Edge edge = PreEdges[i];
  27.         if (edge.VertexIndexA == vertexIndexA || edge.VertexIndexB == vertexIndexA || edge.VertexIndexB == vertexIndexA || edge.VertexIndexB == vertexIndexB) {
  28.             edgeIndex = i;
  29.             return true;
  30.         }
  31.     }
  32.     edgeIndex = 0;
  33.     return false;
  34. }
  35.  
  36. [numthreads(NumThreads, NumThreads, 1)]
  37. void ComputeNeighbors(uint3 id:SV_DispatchThreadID) {
  38.     uint triangleIndexA = id.x;
  39.     uint triangleIndexB = id.y;
  40.     if (triangleIndexA == triangleIndexB || triangleIndexA >= PreTrianglesCount || triangleIndexB >= PreTrianglesCount)
  41.     {
  42.         return;
  43.     }
  44.     Triangle triangleA = PreTriangles[triangleIndexA];
  45.     Triangle triangleB = PreTriangles[triangleIndexB];
  46.     uint sharedVertexIndexA = -1;
  47.     uint sharedVertexIndexB = -1;
  48.     if (triangleA.VertexIndexA == triangleB.VertexIndexA || triangleA.VertexIndexA == triangleB.VertexIndexB || triangleA.VertexIndexA == triangleB.VertexIndexC)
  49.     {
  50.         if (sharedVertexIndexA == -1)
  51.         {
  52.             sharedVertexIndexA = triangleA.VertexIndexA;
  53.         }
  54.         else if (sharedVertexIndexB == -1)
  55.         {
  56.             sharedVertexIndexB = triangleA.VertexIndexA;
  57.         }
  58.     }
  59.     if (triangleA.VertexIndexB == triangleB.VertexIndexA || triangleA.VertexIndexB == triangleB.VertexIndexB || triangleA.VertexIndexB == triangleB.VertexIndexC)
  60.     {
  61.         if (sharedVertexIndexA == -1)
  62.         {
  63.             sharedVertexIndexA = triangleA.VertexIndexB;
  64.         }
  65.         else if (sharedVertexIndexB == -1)
  66.         {
  67.             sharedVertexIndexB = triangleA.VertexIndexB;
  68.         }
  69.     }
  70.     if (triangleA.VertexIndexC == triangleB.VertexIndexA || triangleA.VertexIndexC == triangleB.VertexIndexB || triangleA.VertexIndexC == triangleB.VertexIndexC)
  71.     {
  72.         if (sharedVertexIndexA == -1)
  73.         {
  74.             sharedVertexIndexA = triangleA.VertexIndexC;
  75.         }
  76.         else if (sharedVertexIndexB == -1)
  77.         {
  78.             sharedVertexIndexB = triangleA.VertexIndexC;
  79.         }
  80.     }
  81.     if (sharedVertexIndexA > -1 && sharedVertexIndexB > -1)
  82.     {
  83.         uint edgeIndex;
  84.         if (!GetEdgeIndex(sharedVertexIndexA, sharedVertexIndexB, edgeIndex)) {
  85.             Edge edge;
  86.             edge.VertexIndexA = sharedVertexIndexA;
  87.             edge.VertexIndexB = sharedVertexIndexB;
  88.             PreEdges[PreEdgesCount] = edge;
  89.             edgeIndex = PreEdgesCount++;
  90.         }
  91.         triangleA.Edges[triangleA.EdgeCount++] = edgeIndex;
  92.     }
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement