void BuildTestingGrid() { gameObject.GetComponent<MeshFilter>().mesh = mesh = new Mesh(); mesh.name = "Variable Mesh"; vertices = new List<Vector3>(); triangles = new List<int>(); uvs = new List<Vector2>(); gridPoints = new List<GridPoint03>(); for (int y = 0; y < depthHeight; y += gridStep) { for (int x = 0; x < depthWidth; x += gridStep) { int depthIndex = x + (y * depthWidth); GridPoint03 gp = new GridPoint03(x, y, depthIndex); gp.Reset(); gridPoints.Add(gp); } } gridWidth = (int)Mathf.Floor(depthWidth / gridStep); gridHeight = (int)Mathf.Floor(depthHeight / gridStep); }
void GenerateMeshPerFrame() { mesh.Clear(); vertices.Clear(); triangles.Clear(); uvs.Clear(); int halfDepthWidth = depthWidth / 2; int halfDepthHeight = depthHeight / 2; // FIRST RESET ANY EXISTING GRID VERTEX DATA foreach ( GridPoint03 gp in gridPoints) { gp.Reset(); } GridPoint03[] testingSquare = new GridPoint03[4]; // NOW REEVALUATE THE GRID, CALCULATING EACH SQUARE TO FIND ACCEPTABLE TRIANGLES for (int gridIndex = 0, y = 0; y < gridHeight; y++, gridIndex++) { for (int x = 0; x < gridWidth; x++, gridIndex++) { GridPoint03 a = testingSquare[0] = gridPoints[gridIndex]; GridPoint03 b = testingSquare[1] = gridPoints[gridIndex + 1]; GridPoint03 c = testingSquare[2] = gridPoints[gridIndex + gridWidth + 1]; GridPoint03 d = testingSquare[3] = gridPoints[gridIndex + gridWidth + 2]; // EVALUATE THE TESTING SQUARE FOR GridPoints THAT SHOULD BE CONVERTED TO VERTICES foreach ( GridPoint03 gp in testingSquare) { // IF THE GRIDPOINT IS IN THE BODY SILHOUETTE... if (bodyIndexData[gp.DepthIndex] != 255) { // CALUCATE THE WORLD POSITION CameraSpacePoint csp = cameraSpacePoints[gp.DepthIndex]; gp.CameraPosition = new Vector3(csp.X, csp.Y, csp.Z); if (float.IsInfinity(gp.CameraPosition.x) || float.IsInfinity(gp.CameraPosition.y) || float.IsInfinity(gp.CameraPosition.z)) { // THE VERTEX WOULD BE OUT OF BOUNDS SO SKIP continue; } else { // IF IT IS NOT ALREADY A CALCULATED VERTEX FROM A PREVIOUS TESTINGSQUARE if (!gp.IsVertex()) { // AND IT LIES WITHIN THE USER DEFINED DEPTH RANGE if (gp.CameraPosition.z > DepthMinimum && gp.CameraPosition.z < DepthMaximum) { // ADD IT TO OUR VERTEX COLLECTION AND RECORD IT'S VERTEX INDEX gp.VertexID = vertices.Count; vertices.Add(gp.CameraPosition); uvs.Add(new Vector2(gp.DepthX / (float)depthWidth, gp.DepthY / (float)depthHeight)); } } } } } // CALCULATE THE BIT KEY FOR ALL ACCEPTABLE VERTICES IN OUR TESTING SQUARE int SquareKey = 0; if (a.IsVertex()) SquareKey |= 1; if (b.IsVertex()) SquareKey |= 2; if (c.IsVertex()) SquareKey |= 4; if (d.IsVertex()) SquareKey |= 8; switch ( SquareKey) { case 0: // NO VERTICES WERE FOUND. DO NOTHING. break; case 7: // A, B, C ARE GOOD addTriangle(a.VertexID, b.VertexID, c.VertexID); break; case 11: // A, B, D ARE GOOD addTriangle(a.VertexID, b.VertexID, d.VertexID); break; case 13: addTriangle(a.VertexID, d.VertexID, c.VertexID); break; case 14: // B, C, D ARE GOOD addTriangle(b.VertexID, d.VertexID, c.VertexID); break; case 15: // ALL GRID POINTS ARE VALID, BUILD TWO TRIANGLES addTriangle(a.VertexID, b.VertexID, c.VertexID); addTriangle(b.VertexID, d.VertexID, c.VertexID); break; } } } mesh.vertices = vertices.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); mesh.RecalculateNormals(); }