// Render loop private void NativeWindow_Render(object sender, NativeWindowEventArgs e) { OpenGL.CoreUI.NativeWindow nativeWindow = (OpenGL.CoreUI.NativeWindow)sender; Gl.Viewport(0, 0, (int)nativeWindow.Width, (int)nativeWindow.Height); Gl.Clear(ClearBufferMask.ColorBufferBit); ERROR_CODE err = ERROR_CODE.FAILURE; if (viewer.isAvailable() && zedCamera.Grab(ref runtimeParameters) == ERROR_CODE.SUCCESS) { if (zedMat.IsInit()) { // Retrieve left image err = zedCamera.RetrieveImage(zedMat, sl.VIEW.LEFT, sl.MEM.CPU); // Update pose data (used for projection of the mesh over the current image) tracking_state = zedCamera.GetPosition(ref cam_pose); if (tracking_state == POSITIONAL_TRACKING_STATE.OK) { timer++; if (userAction.hit) { Vector2 imageClick = new Vector2((float)userAction.hitCoord.X * (float)zedCamera.ImageWidth, (float)userAction.hitCoord.Y * (float)zedCamera.ImageHeight); findPlaneStatus = zedCamera.findPlaneAtHit(ref plane, imageClick); if (findPlaneStatus == ERROR_CODE.SUCCESS) { zedCamera.convertHitPlaneToMesh(planeMeshVertices, planeMeshTriangles, out nbVertices, out nbTriangles); } userAction.clear(); } //if 500ms have spend since last request (for 60fps) if (timer % 30 == 0 && userAction.pressSpace) { // Update pose data (used for projection of the mesh over the current image) Quaternion priorQuat = Quaternion.Identity; Vector3 priorTrans = Vector3.Zero; findPlaneStatus = zedCamera.findFloorPlane(ref plane, out float playerHeight, priorQuat, priorTrans); if (findPlaneStatus == ERROR_CODE.SUCCESS) { zedCamera.convertFloorPlaneToMesh(planeMeshVertices, planeMeshTriangles, out nbVertices, out nbTriangles); } userAction.clear(); } } if (findPlaneStatus == ERROR_CODE.SUCCESS) { viewer.updateMesh(planeMeshVertices, planeMeshTriangles, nbVertices, nbTriangles, plane.Type, plane.Bounds, userAction); } viewer.updateImageAndState(zedMat, cam_pose, tracking_state); viewer.render(); } } }