//Adds the vertex into grid vertices used for the new sliced triangle
 public void AddNewTriangleVertex(MeshGridIndicator meshGridIndicator, int v)
 {
     meshGridIndicator.finalVertices.Add(new Vector3(meshGridIndicator.finalVertices[v].x, meshGridIndicator.finalVertices[v].y, meshGridIndicator.finalVertices[v].z));
     meshGridIndicator.finalNormals.Add(meshGridIndicator.finalNormals[v]);
     meshGridIndicator.finalUvs.Add(meshGridIndicator.finalUvs[v]);
     meshGridIndicator.finalColors.Add(meshGridIndicator.defaultColor);
 }
 //Slices the triangle into three default , firstTris and secondTris
 //Each slice can make a triangle and a quad that gets split into two triangles (firstTris and secondTris)
 public void SliceByPlane(Vector3 planePoint, Vector3 planeNormal, MeshGridIndicator meshGridIndicator)
 {
     triangleSide = 0;
     int[] sides = new int[3];
     sides[0] = CalculatePointSideOfPlane(meshGridIndicator.finalVertices[v[0]], planePoint, planeNormal);
     sides[1] = CalculatePointSideOfPlane(meshGridIndicator.finalVertices[v[1]], planePoint, planeNormal);
     sides[2] = CalculatePointSideOfPlane(meshGridIndicator.finalVertices[v[2]], planePoint, planeNormal);
     if (sides[0] == sides[1] && sides[0] == sides[2])
     {
         triangleSide = sides[0];
     }
     else if (sides[0] != sides[1] && sides[1] != sides[2] && sides[0] != sides[2])
     {
         int z = 0; int f = 1; int s = 2; int t;
         if (sides[1] == -1)
         {
             z = 1; f = 2; s = 0;
         }
         if (sides[2] == -1)
         {
             z = 2; f = 0; s = 1;
         }
         meshGridIndicator.finalVertices.Add(LinePlaneIntersection(meshGridIndicator.finalVertices[v[f]], meshGridIndicator.finalVertices[v[s]], planePoint, planeNormal));
         meshGridIndicator.finalNormals.Add((meshGridIndicator.finalNormals[v[f]] + meshGridIndicator.finalNormals[v[s]]) / 2);
         meshGridIndicator.finalUvs.Add((meshGridIndicator.finalUvs[v[f]] + meshGridIndicator.finalUvs[v[s]]) / 2);
         meshGridIndicator.finalColors.Add(meshGridIndicator.defaultColor);
         t = meshGridIndicator.finalVertices.Count - 1;
         int[] temp = new int[3] {
             v[0], v[1], v[2]
         };
         v[0] = temp[z]; v[1] = temp[f]; v[2] = t;
         AddNewTriangleVertex(meshGridIndicator, temp[z]);
         AddNewTriangleVertex(meshGridIndicator, t);
         firstTris = new MeshGridTriangle(temp[s], t + 1, t + 2, meshGridIndicator.defaultColor);
         firstTris.triangleSide = sides[s];
         triangleSide           = sides[f];
     }
     else if (sides[0] == -1 || sides[1] == -1 || sides[2] == -1)
     {
         if (sides[0] == 1 || sides[1] == 1 || sides[2] == 1)
         {
             triangleSide = 1;
         }
         else
         {
             triangleSide = 0;
         }
     }
     else
     {
         int z = 0; int f = 1; int s = 2; int t; int t2;
         if (sides[1] == sides[2])
         {
             z = 0; f = 1; s = 2;
         }
         if (sides[0] == sides[2])
         {
             z = 1; f = 2; s = 0;
         }
         if (sides[1] == sides[0])
         {
             z = 2; f = 0; s = 1;
         }
         meshGridIndicator.finalVertices.Add(LinePlaneIntersection(meshGridIndicator.finalVertices[v[z]], meshGridIndicator.finalVertices[v[f]], planePoint, planeNormal));
         t = meshGridIndicator.finalVertices.Count - 1;
         meshGridIndicator.finalNormals.Add((meshGridIndicator.finalNormals[v[z]] + meshGridIndicator.finalNormals[v[f]]) / 2);
         meshGridIndicator.finalUvs.Add((meshGridIndicator.finalUvs[v[z]] + meshGridIndicator.finalUvs[v[f]]) / 2);
         meshGridIndicator.finalColors.Add(meshGridIndicator.defaultColor);
         //second
         meshGridIndicator.finalVertices.Add(LinePlaneIntersection(meshGridIndicator.finalVertices[v[s]], meshGridIndicator.finalVertices[v[z]], planePoint, planeNormal));
         meshGridIndicator.finalNormals.Add((meshGridIndicator.finalNormals[v[s]] + meshGridIndicator.finalNormals[v[z]]) / 2);
         meshGridIndicator.finalUvs.Add((meshGridIndicator.finalUvs[v[s]] + meshGridIndicator.finalUvs[v[z]]) / 2);
         meshGridIndicator.finalColors.Add(meshGridIndicator.defaultColor);
         int[] temp = new int[3] {
             v[0], v[1], v[2]
         };
         AddNewTriangleVertex(meshGridIndicator, temp[s]);
         AddNewTriangleVertex(meshGridIndicator, t);
         firstTris = new MeshGridTriangle(temp[f], t + 2, t + 3, meshGridIndicator.defaultColor);
         firstTris.triangleSide = sides[s];
         AddNewTriangleVertex(meshGridIndicator, t);
         AddNewTriangleVertex(meshGridIndicator, t + 1);
         secondTris = new MeshGridTriangle(t + 4, temp[s], t + 5, meshGridIndicator.defaultColor);
         secondTris.triangleSide = sides[s];
         v[0]         = temp[z]; v[1] = t; v[2] = t + 1;
         triangleSide = sides[z];
     }
 }
 void OnEnable()
 {
     gridIndicator = target as MeshGridIndicator;
 }