private static void SaveExtensionPlaneLookAndFeel(ObjectPlacementExtensionPlaneRenderSettings extensionPlaneRenderSettings, XmlTextWriter xmlWriter, int indent)
        {
            xmlWriter.WriteNewLine(indent);
            xmlWriter.WriteStartElement(Octave3DConfigXMLInfo.ExtensionPlaneLookAndFeelNode);

            int childIndent = indent + 1;

            xmlWriter.WriteNewLine(childIndent);
            xmlWriter.WriteStartElement(Octave3DConfigXMLInfo.ExtensionPlaneScaleNode);
            xmlWriter.WriteString(extensionPlaneRenderSettings.PlaneScale.ToString());
            xmlWriter.WriteEndElement();

            xmlWriter.WriteNewLine(childIndent);
            xmlWriter.WriteStartElement(Octave3DConfigXMLInfo.ExtensionPlaneColorNode);
            xmlWriter.WriteColorString(extensionPlaneRenderSettings.PlaneColor);
            xmlWriter.WriteEndElement();

            xmlWriter.WriteNewLine(childIndent);
            xmlWriter.WriteStartElement(Octave3DConfigXMLInfo.ExtensionPlaneBorderColorNode);
            xmlWriter.WriteColorString(extensionPlaneRenderSettings.PlaneBorderLineColor);
            xmlWriter.WriteEndElement();

            xmlWriter.WriteNewLine(childIndent);
            xmlWriter.WriteStartElement(Octave3DConfigXMLInfo.ExtensionPlaneNormalLineLengthNode);
            xmlWriter.WriteString(extensionPlaneRenderSettings.PlaneNormalLineLength.ToString());
            xmlWriter.WriteEndElement();

            xmlWriter.WriteNewLine(childIndent);
            xmlWriter.WriteStartElement(Octave3DConfigXMLInfo.ExtensionPlaneNormalLineColorNode);
            xmlWriter.WriteColorString(extensionPlaneRenderSettings.PlaneNormalLineColor);
            xmlWriter.WriteEndElement();

            xmlWriter.WriteNewLine(indent);
            xmlWriter.WriteEndElement();
        }
        public ObjectPlacementExtensionPlaneRenderSettingsView(ObjectPlacementExtensionPlaneRenderSettings settings)
        {
            _settings = settings;

            VisibilityToggleLabel        = "Extension Plane";
            ToggleVisibilityBeforeRender = true;
            IndentContent = true;
        }
        public void RenderGizmos(ObjectPlacementExtensionPlane extensionPlane)
        {
            ObjectPlacementExtensionPlaneRenderSettings renderSettings = extensionPlane.RenderSettings;
            XZOrientedQuad3D planeQuad = extensionPlane.PlaneQuad;

            planeQuad.SetScale(renderSettings.PlaneScale);

            // Note: Add a small offset to avoid Z wars when the extension plane sits on top of other objects.
            const float quadOffset = 0.005f;

            GizmosEx.RenderXZOrientedQuad(planeQuad, renderSettings.PlaneColor, quadOffset);
            GizmosEx.RenderXZOrientedQuadBorderLines(planeQuad, renderSettings.PlaneBorderLineColor, quadOffset);

            // Render the plane normals
            List <Vector3> quadCornerPoints  = planeQuad.GetCornerPoints();
            Vector3        offsetToEndOfLine = extensionPlane.Plane.normal * renderSettings.PlaneNormalLineLength;

            foreach (Vector3 quadCornerPoint in quadCornerPoints)
            {
                GizmosEx.RenderLine(quadCornerPoint, quadCornerPoint + offsetToEndOfLine, renderSettings.PlaneNormalLineColor);
            }
        }