virtual public bool EndCapture(InputEvent e) { if (activeWidget != null) { activeWidget.EndCapture(targetWrapper); MaterialUtil.SetMaterial(activeWidget.RootGameObject, activeWidget.StandardMaterial); // tell wrapper we are done with capture, so it should bake transform/etc bool bModified = targetWrapper.DoneTransformation(EmitChanges); if (bModified) { // update gizmo onTransformModified(null); // allow client/subclass to add any other change records OnTransformInteractionEnd(); // gizmos drop change events by default if (EmitChanges) { Scene.History.PushInteractionCheckpoint(); } } activeWidget = null; } return(true); }
// called on per-frame Update() virtual public void PreRender() { root.Show(); float useDegrees = (GizmoVisualDegrees > 0) ? GizmoVisualDegrees : SceneGraphConfig.DefaultAxisGizmoVisualDegrees; float fWorldSize = VRUtil.GetVRRadiusForVisualAngle( root.GetPosition(), parentScene.ActiveCamera.GetPosition(), useDegrees); float fSceneSize = fWorldSize / parentScene.GetSceneScale(); float fGeomScale = fSceneSize / initialGizmoRadius; root.SetLocalScale(new Vector3f(fGeomScale)); foreach (var widget in Widgets) { widget.Value.UpdateGizmoWorldSize(fWorldSize); } if (DynamicVisibilityFiltering && targetWrapper != null) { Frame3f frameW = targetWrapper.GetLocalFrame(CoordSpace.WorldCoords); Vector3d camPosW = parentScene.ActiveCamera.GetPosition(); foreach (var go in enabledWidgetGOs) { Standard3DTransformWidget widget = Widgets[go]; bool visible = widget.CheckVisibility(ref frameW, ref camPosW); go.SetVisible(visible); } } }
virtual protected fGameObject append_widget(AxisGizmoFlags widgetType, int nAxis, string name, fMaterial material, fMaterial hoverMaterial) { var useMaterial = (Factory.UniqueColorPerWidget || material == null) ? Factory.MakeMaterial(widgetType) : material; var useHoverMaterial = (Factory.UniqueColorPerWidget || hoverMaterial == null) ? Factory.MakeHoverMaterial(widgetType) : hoverMaterial; var go = AppendMeshGO(name, Factory.MakeGeometry(widgetType), useMaterial, RootGameObject, true); Standard3DTransformWidget widget = null; switch (widgetType) { case AxisGizmoFlags.AxisTranslateX: case AxisGizmoFlags.AxisTranslateY: case AxisGizmoFlags.AxisTranslateZ: widget = new AxisTranslationWidget(nAxis) { RootGameObject = go, StandardMaterial = useMaterial, HoverMaterial = useHoverMaterial, TranslationScaleF = () => { return(TranslateSpeed / parentScene.GetSceneScale()); } }; break; case AxisGizmoFlags.AxisRotateX: case AxisGizmoFlags.AxisRotateY: case AxisGizmoFlags.AxisRotateZ: widget = new AxisRotationWidget(nAxis) { RootGameObject = go, StandardMaterial = useMaterial, HoverMaterial = useHoverMaterial, EnableSnapping = EnableRotationSnapping, SnapIncrementDeg = RotationSnapStepSizeDeg }; break; case AxisGizmoFlags.PlaneTranslateX: case AxisGizmoFlags.PlaneTranslateY: case AxisGizmoFlags.PlaneTranslateZ: widget = new PlaneTranslationWidget(nAxis) { RootGameObject = go, StandardMaterial = useMaterial, HoverMaterial = useHoverMaterial, TranslationScaleF = () => { return(TranslateSpeed / parentScene.GetSceneScale()); } }; break; case AxisGizmoFlags.UniformScale: widget = new UniformScaleWidget(parentScene.ActiveCamera) { RootGameObject = go, StandardMaterial = useMaterial, HoverMaterial = useHoverMaterial, ScaleMultiplierF = () => { return(ScaleSpeed / parentScene.GetSceneScale()); } }; break; default: throw new Exception("DefaultAxisGizmoWidgetFactory.MakeHoverMaterial: invalid widget type " + widget.ToString()); } Widgets[go] = widget; return(go); }
public virtual void EndHover(Ray3f ray) { if (hoverWidget != null) { MaterialUtil.SetMaterial(hoverWidget.RootGameObject, hoverWidget.StandardMaterial); hoverWidget = null; } }
public virtual void UpdateHover(Ray3f ray, UIRayHit hit) { if (hoverWidget != null) { EndHover(ray); } if (Widgets.ContainsKey(hit.hitGO)) { hoverWidget = Widgets[hit.hitGO]; MaterialUtil.SetMaterial(hoverWidget.RootGameObject, hoverWidget.HoverMaterial); } }
virtual public bool BeginCapture(InputEvent e) { activeWidget = null; // if the hit gameobject has a widget attached to it, begin capture & transformation // TODO maybe wrapper class should have Begin/Update/End capture functions, then we do not need BeginTransformation/EndTransformation ? if (Widgets.ContainsKey(e.hit.hitGO)) { Standard3DTransformWidget w = Widgets [e.hit.hitGO]; if (w.BeginCapture(targetWrapper, e.ray, e.hit.toUIHit())) { MaterialUtil.SetMaterial(w.RootGameObject, w.HoverMaterial); targetWrapper.BeginTransformation(); activeWidget = w; OnTransformInteractionStart(); return(true); } } return(false); }