Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma kernel ComputeNeighbors
- static const int NumThreads = 8;
- struct Triangle {
- uint VertexIndexA;
- uint VertexIndexB;
- uint VertexIndexC;
- uint EdgeCount;
- uint Edges[3];
- };
- struct Edge {
- uint VertexIndexA;
- uint VertexIndexB;
- };
- RWStructuredBuffer<Triangle> PreTriangles;
- RWStructuredBuffer<Edge> PreEdges;
- uint PreTrianglesCount;
- uint PreEdgesCount;
- bool GetEdgeIndex(uint vertexIndexA, uint vertexIndexB, inout uint edgeIndex) {
- for (uint i = 0; i < PreEdgesCount; i++) {
- Edge edge = PreEdges[i];
- if (edge.VertexIndexA == vertexIndexA || edge.VertexIndexB == vertexIndexA || edge.VertexIndexB == vertexIndexA || edge.VertexIndexB == vertexIndexB) {
- edgeIndex = i;
- return true;
- }
- }
- edgeIndex = 0;
- return false;
- }
- [numthreads(NumThreads, NumThreads, 1)]
- void ComputeNeighbors(uint3 id:SV_DispatchThreadID) {
- uint triangleIndexA = id.x;
- uint triangleIndexB = id.y;
- if (triangleIndexA == triangleIndexB || triangleIndexA >= PreTrianglesCount || triangleIndexB >= PreTrianglesCount)
- {
- return;
- }
- Triangle triangleA = PreTriangles[triangleIndexA];
- Triangle triangleB = PreTriangles[triangleIndexB];
- uint sharedVertexIndexA = -1;
- uint sharedVertexIndexB = -1;
- if (triangleA.VertexIndexA == triangleB.VertexIndexA || triangleA.VertexIndexA == triangleB.VertexIndexB || triangleA.VertexIndexA == triangleB.VertexIndexC)
- {
- if (sharedVertexIndexA == -1)
- {
- sharedVertexIndexA = triangleA.VertexIndexA;
- }
- else if (sharedVertexIndexB == -1)
- {
- sharedVertexIndexB = triangleA.VertexIndexA;
- }
- }
- if (triangleA.VertexIndexB == triangleB.VertexIndexA || triangleA.VertexIndexB == triangleB.VertexIndexB || triangleA.VertexIndexB == triangleB.VertexIndexC)
- {
- if (sharedVertexIndexA == -1)
- {
- sharedVertexIndexA = triangleA.VertexIndexB;
- }
- else if (sharedVertexIndexB == -1)
- {
- sharedVertexIndexB = triangleA.VertexIndexB;
- }
- }
- if (triangleA.VertexIndexC == triangleB.VertexIndexA || triangleA.VertexIndexC == triangleB.VertexIndexB || triangleA.VertexIndexC == triangleB.VertexIndexC)
- {
- if (sharedVertexIndexA == -1)
- {
- sharedVertexIndexA = triangleA.VertexIndexC;
- }
- else if (sharedVertexIndexB == -1)
- {
- sharedVertexIndexB = triangleA.VertexIndexC;
- }
- }
- if (sharedVertexIndexA > -1 && sharedVertexIndexB > -1)
- {
- uint edgeIndex;
- if (!GetEdgeIndex(sharedVertexIndexA, sharedVertexIndexB, edgeIndex)) {
- Edge edge;
- edge.VertexIndexA = sharedVertexIndexA;
- edge.VertexIndexB = sharedVertexIndexB;
- PreEdges[PreEdgesCount] = edge;
- edgeIndex = PreEdgesCount++;
- }
- triangleA.Edges[triangleA.EdgeCount++] = edgeIndex;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement