/// <summary> /// Get most recent updated depthTexture. /// </summary> /// <param name="usingFilter"> If use the depth noise filter.</param> /// <param name="maxLength"> Farest(max) value from depth.</param> /// <param name="filterLevel"> Levels of surrounding points check in filter.</param> /// <returns>Depth texture.</returns> public Texture2D GetDepthTexture(bool usingFilter, float maxLength, int filterLevel) { DepthProvider.GetLatestFrame(ref m_depthMillimeterArr, ref m_timeStamp); if (m_timeStamp == m_prevTimeStamp) { return(m_depthTexture); } m_prevTimeStamp = m_timeStamp; _GetZFromRaw(ref m_depthMeterArr, m_depthMillimeterArr); float[] zarray; if (usingFilter) { Helper.Filter(m_depthMeterArr, m_filteredDepthMeterArr, filterLevel); zarray = m_filteredDepthMeterArr; } else { zarray = m_depthMeterArr; } float maxLengthInverse = 1.0f / maxLength; for (int i = 0; i < DEPTH_TEX_WIDTH * DEPTH_TEX_HEIGHT; i++) { m_depthColorArr[i].r = zarray[i] * maxLengthInverse; m_depthColorArr[i].g = zarray[i] * maxLengthInverse; m_depthColorArr[i].b = zarray[i] * maxLengthInverse; } m_depthTexture.SetPixels(m_depthColorArr); m_depthTexture.Apply(); return(m_depthTexture); }
/// <summary> /// Update the mesh m_vertices and m_triangles /// separated computation into different frame. /// </summary> private void _UpdateMesh() { if (m_frameCounter == 0) { DepthProvider.GetLatestFrame(ref m_depthArr_int, ref m_timeStamp); if (m_prevTimestamp == m_timeStamp) { return; } m_prevTimestamp = m_timeStamp; // convert the compressed int array to z meters array _GetZFromRaw(ref m_depthMeter, m_depthArr_int); m_frameCounter++; return; } if (m_frameCounter == 1) { int vertexCounter = 0; float xd = m_screenWidth / m_traverseWidth; float yd = m_screenHeight / m_traverseHeight; for (int i = 0; i < m_traverseHeight; i++) { for (int j = 0; j < m_traverseWidth; j++) { m_vertices[vertexCounter] = m_camObj.camera.ScreenToWorldPoint(new Vector3(j * (float)xd, i * (float)yd, m_depthMeter[(i * m_stepSize * m_texWidth) + (j * m_stepSize)])); vertexCounter++; } } m_frameCounter++; return; } if (m_frameCounter == 2) { int w = m_traverseWidth - 1; int h = m_traverseHeight - 1; int triCounter = 0; int len = 6 * w * h; for (int i = 0; i < len; i++) { m_triangles[i] = 0; } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { // w + 1 is the real width of m_vertices // vertex index map // 1 3 // 0 2 int index0 = (i * m_stepSize * m_texWidth) + (j * m_stepSize); int index1 = ((i + 1) * m_stepSize * m_texWidth) + (j * m_stepSize); int index2 = (i * m_stepSize * m_texWidth) + ((j + 1) * m_stepSize); int index3 = ((i + 1) * m_stepSize * m_texWidth) + ((j + 1) * m_stepSize); // triangle 1 float distance = Mathf.Abs(m_depthMeter[index0] - m_depthMeter[index1]); distance += Mathf.Abs(m_depthMeter[index0] - m_depthMeter[index2]); distance += Mathf.Abs(m_depthMeter[index1] - m_depthMeter[index2]); if (m_depthMeter[index0] > m_depthDistThreshold && m_depthMeter[index1] > m_depthDistThreshold && m_depthMeter[index2] > m_depthDistThreshold && distance < m_neighborDistThreshold) { m_triangles[triCounter] = (i * (w + 1)) + j; m_triangles[triCounter + 1] = ((i + 1) * (w + 1)) + j; m_triangles[triCounter + 2] = (i * (w + 1)) + (j + 1); } // triangle 2 distance = 0.0f; distance += Mathf.Abs(m_depthMeter[index1] - m_depthMeter[index2]); distance += Mathf.Abs(m_depthMeter[index2] - m_depthMeter[index3]); distance += Mathf.Abs(m_depthMeter[index1] - m_depthMeter[index3]); if (m_depthMeter[index1] > m_depthDistThreshold && m_depthMeter[index3] > m_depthDistThreshold && m_depthMeter[index2] > m_depthDistThreshold && distance < m_neighborDistThreshold) { m_triangles[triCounter + 3] = ((i + 1) * (w + 1)) + j; m_triangles[triCounter + 4] = ((i + 1) * (w + 1)) + (j + 1); m_triangles[triCounter + 5] = (i * (w + 1)) + (j + 1); } triCounter += 6; } } m_frameCounter++; return; } if (m_frameCounter == 3) { // update the m_vertices m_mesh.vertices = m_vertices; m_mesh.triangles = m_triangles; m_mesh.RecalculateBounds(); m_mesh.RecalculateNormals(); m_mesh.SetIndices(m_triangles, m_renderMode, 0); _UpdateTexture(); m_frameCounter = 0; } }