Advertisement
Guest User

Untitled

a guest
Feb 18th, 2023
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.18 KB | None | 0 0
  1.         private List<int>[] IndexLookupTable;
  2.  
  3.         public void CreateIndexReverseLookup(SpherizedCubed mesh)
  4.         {
  5.             IndexLookupTable = new List<int>[mesh.Vertices.Length];
  6.  
  7.             for (int i = 0; i < mesh.Vertices.Length; i ++)
  8.             {
  9.                 IndexLookupTable[i] = new List<int>();
  10.             }
  11.  
  12.             for (int i = 0; i < mesh.Indices.Length; i += 3)
  13.             {
  14.                 for (int j = 0; j < 3; j++)
  15.                 {
  16.                     IndexLookupTable[mesh.Indices[i + j]].Add(i + j);
  17.                 }
  18.             }
  19.         }
  20.  
  21.         public List<int[]> lookupTrianglesAttachedToVertex(int vertexIndex)
  22.         {
  23.             List<int[]> triangles = new List<int[]>();
  24.  
  25.             foreach (int index in IndexLookupTable[vertexIndex])
  26.             {
  27.                 int[] triangle = new int[3];
  28.  
  29.                 int i1;
  30.                 int i2;
  31.                 int i3;
  32.  
  33.                 if (index % 3 == 0)
  34.                 {
  35.                     i1 = index;
  36.                     i2 = index + 1;
  37.                     i3 = index + 2;
  38.                 } else if ((index - 1) % 3 == 0)
  39.                 {
  40.                     i1 = index - 1;
  41.                     i2 = index;
  42.                     i3 = index + 1;
  43.                 } else {
  44.                     i1 = index - 2;
  45.                     i2 = index - 1;
  46.                     i3 = index;
  47.                 }
  48.  
  49.                 triangle[0] = i1;
  50.                 triangle[1] = i2;
  51.                 triangle[2] = i3;
  52.  
  53.                 triangles.Add(triangle);
  54.             }
  55.  
  56.             return triangles;
  57.         }
  58.  
  59.         private void RecalculateNormals(Terrain terrain, List<int> uniqueVertexIndex)
  60.         {
  61.             List<int[]> totalTriangles = new List<int[]>();
  62.             List<int> verticesToNormalize = new List<int>();
  63.             foreach (int vertexIndex in uniqueVertexIndex)
  64.             {
  65.                 Console.WriteLine("Vertex Position Changed: " + vertexIndex);
  66.                 foreach (int[] triangle in terrain.Collider.lookupTrianglesAttachedToVertex(vertexIndex))
  67.                 {
  68.                     bool skip = false;
  69.                     foreach (int[] testTriangle in totalTriangles)
  70.                         if (triangle[0] == testTriangle[0])
  71.                         {
  72.                             skip = true;
  73.                         }
  74.                     if (!skip)
  75.                     {
  76.                         totalTriangles.Add(triangle);
  77.                         foreach (int index in triangle)
  78.                         {
  79.                             if (!verticesToNormalize.Contains(terrain.Mesh.Indices[index]))
  80.                             {
  81.                                 verticesToNormalize.Add(terrain.Mesh.Indices[index]);
  82.                             }
  83.                         }
  84.                     }
  85.                 }
  86.             }
  87.  
  88.             foreach (int vertex in verticesToNormalize)
  89.             {
  90.                 terrain.Mesh.Vertices[vertex].Normal = new Vector3(0, 0, 0);
  91.                 Console.WriteLine("Vertex Updating: " + vertex);
  92.             }
  93.  
  94.             foreach (int[] triangle in totalTriangles)
  95.             {
  96.                 int index1 = terrain.Mesh.Indices[triangle[0]];
  97.                 int index2 = terrain.Mesh.Indices[triangle[1]];
  98.                 int index3 = terrain.Mesh.Indices[triangle[2]];
  99.                 Vector3 side1 = terrain.Mesh.Vertices[index3].Position - terrain.Mesh.Vertices[index2].Position;
  100.                 Vector3 side2 = terrain.Mesh.Vertices[index2].Position - terrain.Mesh.Vertices[index1].Position;
  101.                 Vector3 normal = Vector3.Cross(side1, side2);
  102.            
  103.                 terrain.Mesh.Vertices[index1].Normal += normal;
  104.                 terrain.Mesh.Vertices[index2].Normal += normal;
  105.                 terrain.Mesh.Vertices[index3].Normal += normal;
  106.  
  107.                 Console.WriteLine("Recalculated Normals on Triangle: " + triangle[0] + " " + index1 + " | " + triangle[1] + " " + index2 + " | " + triangle[2] + " " + index3);
  108.  
  109.             }
  110.  
  111.             foreach (int vertex in verticesToNormalize)
  112.                terrain.Mesh.Vertices[vertex].Normal.Normalize();
  113.  
  114.         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement