/// <summary> /// Moves a vertex by index in a direction (-1, +1 or 0) by a factor delta. /// A direction can be Vector2(-1,0); move the display in a negative X direction. /// The factor delta sets the "speed/distance" of the movement. /// </summary> /// <param name="direction">the direction to move in</param> /// <param name="delta">movement factor</param> /// <param name="selectedIndex">the display to move vertex on</param> /// <param name="vertexIndex">the vertex to move</param> private void LocalShift(Vector2 direction, float delta, int selectedIndex, int vertexIndex) { PhysicalDisplayCalibration lastCalibration = allOptions[lastSelectedIndex].calibration; lastCalibration.HideVisualMarker(); PhysicalDisplayCalibration calibration = allOptions[selectedIndex].calibration; calibration.SetVisualMarkerVertextPoint(vertexIndex); Debug.Log("RealtimeCalibration: LocalShift called " + delta + ", " + selectedIndex + ", " + vertexIndex); MeshFilter lastWarpedFilter = null; foreach (Dewarp dewarp in calibration.GetDisplayWarpsValues()) { MeshFilter meshFilter = dewarp.GetDewarpMeshFilter(); lastWarpedFilter = meshFilter; Vector3[] verts = meshFilter.sharedMesh.vertices; // verts[vertexIndex] = new Vector3(verts[vertexIndex].x + direction.x * delta, verts[vertexIndex].y + direction.y * delta, verts[vertexIndex].z); Dictionary <int, float> vertsToShift = this.getIndexesSurrounding(dewarp.xSize, vertexIndex); foreach (var ind in vertsToShift) { verts[ind.Key] = new Vector3(verts[ind.Key].x + (direction.x * delta * ind.Value), verts[ind.Key].y + (direction.y * delta * ind.Value), verts[ind.Key].z); } meshFilter.sharedMesh.vertices = verts; meshFilter.sharedMesh.UploadMeshData(false); meshFilter.mesh.RecalculateBounds(); meshFilter.mesh.RecalculateTangents(); } calibration.UpdateMeshPositions(lastWarpedFilter?.sharedMesh.vertices); }
/// <summary> /// Assign all point positions based on positions of the four corner points; /// positions are linearly interpolated /// </summary> public void LocalInterpolateFromCorners(int selectedIndex) { PhysicalDisplayCalibration lastCalibration = allOptions[lastSelectedIndex].calibration; lastCalibration.HideVisualMarker(); PhysicalDisplayCalibration calibration = allOptions[selectedIndex].calibration; calibration.SetVisualMarkerVertextPoint(vertexIndex); Debug.Log("RealtimeCalibration: InterpolateFromCorners called, selectedIndex " + selectedIndex); MeshFilter lastWarpedFilter = null; foreach (Dewarp dewarp in calibration.GetDisplayWarpsValues()) { MeshFilter meshFilter = dewarp.GetDewarpMeshFilter(); lastWarpedFilter = meshFilter; Vector3[] verts = meshFilter.sharedMesh.vertices; // verts[vertexIndex] = new Vector3(verts[vertexIndex].x + direction.x * delta, verts[vertexIndex].y + direction.y * delta, verts[vertexIndex].z); Vector3 corner_0 = verts[0]; Vector3 corner_1 = verts[7]; Vector3 corner_2 = verts[63]; Vector3 corner_3 = verts[56]; for (int x = 0; x < 8; x++) { float xfac = x / 7.0f; Vector3 xmix_0 = corner_0 * (1.0f - xfac) + corner_1 * xfac; Vector3 xmix_1 = corner_3 * (1.0f - xfac) + corner_2 * xfac; for (int y = 0; y < 8; y++) { float yfac = y / 7.0f; verts[y * 8 + x] = xmix_0 * (1.0f - yfac) + xmix_1 * yfac; } } meshFilter.sharedMesh.vertices = verts; meshFilter.sharedMesh.UploadMeshData(false); meshFilter.mesh.RecalculateBounds(); meshFilter.mesh.RecalculateTangents(); } calibration.UpdateMeshPositions(lastWarpedFilter?.sharedMesh.vertices); }