override protected void OnBeginCapture(Ray3f worldRay, Standard3DWidget w)
        {
            List <SceneObject> PotentialTargets = new List <SceneObject>(ConstraintSurfaces);

            foreach (var v in Widgets)
            {
                if (v.Value is SurfaceConstrainedPointWidget)
                {
                    SurfaceConstrainedPointWidget widget = v.Value as SurfaceConstrainedPointWidget;
                    widget.SourceSO           = Targets[0];
                    widget.ConstraintSurfaces = PotentialTargets;
                }
            }
        }
        override protected void BuildGizmo()
        {
            gizmo.SetName("SurfaceConstrainedGizmo");

            make_materials();

            centerGO = AppendMeshGO("object_origin",
                                    UnityUtil.GetPrimitiveMesh(PrimitiveType.Sphere), srcMaterial, gizmo);
            centerGO.SetLocalScale(WidgetScale);

            Widgets[centerGO] = new SurfaceConstrainedPointWidget(this, this.parentScene)
            {
                RootGameObject = centerGO, StandardMaterial = srcMaterial, HoverMaterial = srcHoverMaterial
            };


            PuncturedDiscGenerator discgen = new PuncturedDiscGenerator()
            {
                StartAngleDeg = 180, EndAngleDeg = 270, OuterRadius = 1.5f, InnerRadius = 0.75f
            };

            discgen.Generate();
            SimpleMesh discmesh = discgen.MakeSimpleMesh();

            MeshTransforms.Rotate(discmesh, Vector3d.Zero, Quaternionf.AxisAngleD(Vector3f.AxisX, 90));
            rotateGO = AppendMeshGO("object_rotate", new fMesh(discmesh), srcMaterial, gizmo);
            rotateGO.SetLocalScale(WidgetScale);

            Widgets[rotateGO] = new AxisRotationWidget(2)
            {
                RootGameObject = rotateGO, StandardMaterial = srcMaterial, HoverMaterial = srcHoverMaterial
            };


            gizmo.Hide();
        }