private SCNNode FocusSquareNode() { if (focusSquareNode == null) { /* * The focus square consists of eight Segments as follows, which can be individually animated. * * s1 s2 * _ _ * s3 | | s4 * * s5 | | s6 * - - * s7 s8 */ var sl = 0.5f; // segment length var c = FocusSquareThickness / 2f; // correction to align lines perfectly var s1 = new FocusSquareSegment("s1", Corner.TopLeft, Alignment.Horizontal); var s2 = new FocusSquareSegment("s2", Corner.TopRight, Alignment.Horizontal); var s3 = new FocusSquareSegment("s3", Corner.TopLeft, Alignment.Vertical); var s4 = new FocusSquareSegment("s4", Corner.TopRight, Alignment.Vertical); var s5 = new FocusSquareSegment("s5", Corner.BottomLeft, Alignment.Vertical); var s6 = new FocusSquareSegment("s6", Corner.BottomRight, Alignment.Vertical); var s7 = new FocusSquareSegment("s7", Corner.BottomLeft, Alignment.Horizontal); var s8 = new FocusSquareSegment("s8", Corner.BottomRight, Alignment.Horizontal); s1.Position = s1.Position.Add(new SCNVector3(-(sl / 2 - c), -(sl - c), 0)); s2.Position = s2.Position.Add(new SCNVector3(sl / 2 - c, -(sl - c), 0)); s3.Position = s3.Position.Add(new SCNVector3(-sl, -sl / 2, 0)); s4.Position = s4.Position.Add(new SCNVector3(sl, -sl / 2, 0)); s5.Position = s5.Position.Add(new SCNVector3(-sl, sl / 2, 0)); s6.Position = s6.Position.Add(new SCNVector3(sl, sl / 2, 0)); s7.Position = s7.Position.Add(new SCNVector3(-(sl / 2 - c), sl - c, 0)); s8.Position = s8.Position.Add(new SCNVector3(sl / 2 - c, sl - c, 0)); var planeNode = new SCNNode(); planeNode.EulerAngles = new SCNVector3((float)(Math.PI / 2), planeNode.EulerAngles.Y, planeNode.EulerAngles.Z); planeNode.SetUniformScale(FocusSquareSize * ScaleForClosedSquare); planeNode.AddChildNode(s1); planeNode.AddChildNode(s2); planeNode.AddChildNode(s3); planeNode.AddChildNode(s4); planeNode.AddChildNode(s5); planeNode.AddChildNode(s6); planeNode.AddChildNode(s7); planeNode.AddChildNode(s8); planeNode.AddChildNode(FillPlane); segments = new FocusSquareSegment[] { s1, s2, s3, s4, s5, s6, s7, s8 }; IsOpen = false; // Always render focus square on top planeNode.RenderOnTop(); focusSquareNode = planeNode; } return(focusSquareNode); }