sprk_ops.h
1 // Copyright (c) Tech Soft 3D, Inc.
2 //
3 // The information contained herein is confidential and proprietary to Tech Soft 3D, Inc.,
4 // and considered a trade secret as defined under civil and criminal statutes.
5 // Tech Soft 3D, Inc. shall pursue its civil and criminal remedies in the event of
6 // unauthorized use or misappropriation of its trade secrets. Use of this information
7 // by anyone other than authorized employees of Tech Soft 3D, Inc. is granted only under
8 // a written non-disclosure agreement, expressly prescribing the scope and manner of such use.
9 
10 #ifndef SPRK_STD_OPERATORS_H
11 #define SPRK_STD_OPERATORS_H
12 
13 #include "sprk.h"
14 
15 #include <list>
16 #include <stack>
17 
18 #ifdef _MSC_VER
19 #ifndef STATIC_APP
20 # ifdef SPROCKETS
21 # define SPRK_API __declspec (dllexport)
22 # else
23 # define SPRK_API __declspec (dllimport)
24 # endif
25 #endif
26 #else
27 # include <stddef.h>
28 # if defined(LINUX_SYSTEM) && defined(SPROCKETS)
29 # ifndef STATIC_APP
30 # define SPRK_API __attribute__ ((visibility ("default")))
31 # endif
32 # endif
33 #endif
34 
35 #ifndef SPRK_API
36 # define SPRK_API
37 #endif
38 
39 
40 namespace HPS
41 {
42 
54 class SPRK_API PanOrbitZoomOperator : public Operator
55 {
56 public:
57  PanOrbitZoomOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
59  virtual HPS::UTF8 GetName() const { return "HPS_PanOrbitZoomOperator"; }
60 
65  virtual bool OnMouseDown(MouseState const & in_state);
70  virtual bool OnMouseUp(MouseState const & in_state);
75  virtual bool OnMouseMove(MouseState const & in_state);
76 
81  virtual bool OnTouchDown(TouchState const & in_state);
86  virtual bool OnTouchUp(TouchState const & in_state);
91  virtual bool OnTouchMove(TouchState const & in_state);
92 
93 private:
94  HPS::WorldPoint start;
95 
96  HPS::WindowPoint start_point, new_point;
97  HPS::Vector start_sphere_pos, new_sphere_pos;
98 
99  bool operator_active;
100  float zoom_limit;
101  float focal_length;
102  HPS::WindowPoint last_zoom;
103  HPS::Vector last_relative;
104  float zoom_start_field_width;
105  float zoom_start_field_height;
106  HPS::Vector zoom_start_camera_look;
107  size_t current_touches;
108 
109  void ZoomStart();
110  void UpdateZoom(float zoom_factor);
111  void UpdateZoomLimit();
112  void UpdatePan(HPS::WorldPoint const & newLocation);
113  void UpdateRoll(HPS::Vector const & relative);
114 };
115 
123 class SPRK_API PanOperator : public Operator
124 {
125 public:
126  PanOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
128  virtual HPS::UTF8 GetName() const { return "HPS_PanOperator"; }
129 
134  virtual bool OnMouseDown(MouseState const & in_state);
139  virtual bool OnMouseUp(MouseState const & in_state);
144  virtual bool OnMouseMove(MouseState const & in_state);
145 
150  virtual bool OnTouchDown(TouchState const & in_state);
155  virtual bool OnTouchUp(TouchState const & in_state);
160  virtual bool OnTouchMove(TouchState const & in_state);
161 
162 private:
163  bool PanCommon(HPS::WindowPoint const & in_loc, HPS::KeyPath const & in_key_path);
164 
165  bool operator_active;
166  HPS::TouchID tracked_touch_ID;
167  HPS::WorldPoint start;
168 };
169 
177 class SPRK_API OrbitOperator : public Operator
178 {
179 public:
180  OrbitOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
182  virtual HPS::UTF8 GetName() const { return "HPS_OrbitOperator"; }
183 
188  virtual bool OnMouseDown(MouseState const & in_state);
193  virtual bool OnMouseUp(MouseState const & in_state);
198  virtual bool OnMouseMove(MouseState const & in_state);
199 
204  virtual bool OnTouchDown(TouchState const & in_state);
209  virtual bool OnTouchUp(TouchState const & in_state);
214  virtual bool OnTouchMove(TouchState const & in_state);
215 
216 private:
217  bool OrbitCommon(HPS::WindowPoint const & in_loc);
218 
219  bool operator_active;
220  HPS::TouchID tracked_touch_ID;
221  HPS::WindowPoint start_point, new_point;
222  HPS::Vector start_sphere_pos, new_sphere_pos;
223 };
224 
225 
226 class SPRK_API RelativeOrbitOperator : public Operator
227 {
228 
229 public:
236  RelativeOrbitOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonMiddle(), ModifierKeys in_modifier_trigger = ModifierKeys());
237  virtual HPS::UTF8 GetName() const { return "HPS_RelativeOrbitOperator"; }
238 
239  virtual bool OnMouseDown(MouseState const & in_state);
240  virtual bool OnMouseUp(MouseState const & in_state);
241  virtual bool OnMouseMove(MouseState const & in_state);
242 
243  virtual bool OnTouchDown(TouchState const & in_state);
244  virtual bool OnTouchUp(TouchState const & in_state);
245  virtual bool OnTouchMove(TouchState const & in_state);
246 
247 private:
248  bool OrbitCommon(HPS::WindowPoint const & in_loc);
249  bool RelativeOrbitCommon(HPS::WindowPoint const & in_loc, HPS::KeyPath & in_event_path);
250  void CalculateTarget(HPS::WindowKey const & in_window);
251 
252  HPS::Point faux_target;
253  bool operator_active;
254  HPS::TouchID tracked_touch_ID;
255  HPS::Vector start_sphere_pos, new_sphere_pos;
256  HPS::WindowPoint start_point, new_point;
257  HPS::SelectionOptionsKit selection_options;
258 };
259 
267 class SPRK_API ZoomOperator : public Operator
268 {
269 public:
270  ZoomOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
272  virtual HPS::UTF8 GetName() const { return "HPS_ZoomOperator"; }
273 
278  virtual bool OnMouseDown(MouseState const & in_state);
283  virtual bool OnMouseUp(MouseState const & in_state);
288  virtual bool OnMouseMove(MouseState const & in_state);
289 
294  virtual bool OnTouchDown(TouchState const & in_state);
299  virtual bool OnTouchMove(TouchState const & in_state);
300 
301 private:
302  bool operator_active;
303  HPS::TouchID tracked_touch_ID;
304  HPS::WindowPoint start_point;
305  float zoom_limit;
306  float focal_length;
307  HPS::WindowPoint last_zoom;
308  HPS::Vector last_relative;
309  float zoom_start_field_width;
310  float zoom_start_field_height;
311  HPS::Vector zoom_start_camera_look;
312  HPS::Point zoom_start_camera_target;
313 
314  void ZoomStart();
315  void UpdateZoom(float zoom_factor);
316  void UpdateZoomLimit();
317 };
318 
319 
320 class SPRK_API ConstructRectangleOperator : public Operator
321 {
322 public:
323  ConstructRectangleOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys(), bool draw_faces = false);
324  virtual HPS::UTF8 GetName() const { return "HPS_ConstructRectangleOperator"; }
325 
326  virtual void OnViewAttached();
327 
328  virtual bool OnMouseDown(MouseState const & in_state);
329  virtual bool OnMouseUp(MouseState const & in_state);
330  virtual bool OnMouseMove(MouseState const & in_state);
331 
332  virtual bool OnTouchDown(TouchState const & in_state);
333  virtual bool OnTouchUp(TouchState const & in_state);
334  virtual bool OnTouchMove(TouchState const & in_state);
335 
336  bool IsRectangleValid() const { return is_rect_valid; }
337 
339  HPS::Rectangle GetRectangle() const { return rect; }
340 
341 private:
342  bool ConstructRectCommon(WindowPoint const & in_loc);
343  void SetupConstructionSegment();
344 
345  bool draw_faces;
346  bool use_center_marker;
347  bool is_rect_valid;
348  bool operator_active;
349  HPS::WindowPoint start_point;
350  HPS::SegmentKey scratch_seg;
351  HPS::Rectangle rect;
352  HPS::LineKey temp_line_key;
353  HPS::PolygonKey temp_polygon_key;
354  HPS::MarkerKey temp_marker_key;
355  HPS::TouchID tracked_touch_ID;
356 };
357 
359 {
360 public:
361  ZoomBoxOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
362  virtual HPS::UTF8 GetName() const { return "HPS_ZoomBoxOperator"; }
363 
364  virtual bool OnMouseUp(MouseState const & in_state);
365  virtual bool OnTouchUp(TouchState const & in_state);
366 
367 private:
368  bool ZoomCommon(HPS::WindowKey const & in_window, HPS::KeyPath const & in_event_path);
369 
370 };
371 
382 {
383 public:
396  SelectAreaOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
397 
398  virtual HPS::UTF8 GetName() const { return "HPS_SelectAreaOperator"; }
399 
400  virtual void OnViewAttached();
401 
402  virtual bool OnMouseUp(MouseState const & in_state);
403  virtual bool OnTouchUp(TouchState const & in_state);
404 
409  HPS::SelectionResults GetActiveSelection() const;
410 
416  void SetSelectionOptions(HPS::SelectionOptionsKit const & in_options) { selection_options = in_options; }
417 
421  HPS::SelectionOptionsKit GetSelectionOptions() const { return selection_options; }
422 
423 private:
424  bool SelectCommon(HPS::WindowKey & in_window, HPS::ModifierKeys in_modifiers = HPS::ModifierKeys());
425 
426  HPS::SelectionResults active_selection;
427  HPS::SelectionOptionsKit selection_options;
428 };
429 
430 
432 {
433 public:
440  HighlightAreaOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
441 
442  virtual HPS::UTF8 GetName() const { return "HPS_HighlightAreaOperator"; }
443 
444  virtual void OnViewAttached();
445 
446  virtual bool OnMouseUp(MouseState const & in_state);
447  virtual bool OnTouchUp(TouchState const & in_state);
448 
454  void SetHighlightOptions(HPS::HighlightOptionsKit const & in_options) { highlight_options = in_options; }
455 
459  HPS::HighlightOptionsKit GetHighlightOptions() const { return highlight_options; }
460 
461 private:
462  bool HighlightCommon(WindowKey & in_window, ModifierKeys in_modifiers);
463 
464  HPS::HighlightOptionsKit highlight_options;
465 
466 };
467 
468 
478 class SPRK_API SelectOperator : public Operator
479 {
480 public:
493  SelectOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
494 
495  virtual HPS::UTF8 GetName() const { return "HPS_SelectOperator"; }
496 
497  virtual bool OnMouseDown(MouseState const & in_state);
498  virtual bool OnTouchDown(TouchState const & in_state);
499 
504  HPS::SelectionResults GetActiveSelection() const;
505 
509  void SetSelectionOptions(HPS::SelectionOptionsKit const & in_options) { selection_options = in_options; }
510 
514  HPS::SelectionOptionsKit GetSelectionOptions() const { return selection_options; }
515 
516 private:
517  bool SelectCommon(HPS::Point const & in_loc, HPS::WindowKey & in_window, HPS::ModifierKeys in_modifiers = HPS::ModifierKeys());
518 
519  HPS::SelectionResults active_selection;
520  HPS::SelectionOptionsKit selection_options;
521 };
522 
523 
524 class SPRK_API HighlightOperator : public SelectOperator
525 {
526 public:
531  HighlightOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
532 
533  virtual HPS::UTF8 GetName() const { return "HPS_HighlightOperator"; }
534 
535  virtual bool OnMouseDown(MouseState const & in_state);
536  virtual bool OnTouchDown(TouchState const & in_state);
537 
541  void SetHighlightOptions(HPS::HighlightOptionsKit const & in_options) { highlight_options = in_options; }
542 
546  HPS::HighlightOptionsKit GetHighlightOptions() const { return highlight_options; }
547 
548 private:
549  bool HighlightCommon(HPS::WindowKey & in_window, HPS::ModifierKeys in_modifiers);
550 
551  HPS::HighlightOptionsKit highlight_options;
552 };
553 
554 class SPRK_API MouseWheelOperator : public Operator
555 {
556 public:
557  enum class ZoomType
558  {
559  Fast,
560  Accurate,
561  };
562 
567  MouseWheelOperator(ZoomType in_default_type = ZoomType::Accurate, HPS::ModifierKeys in_alternate_type_modifiers = HPS::ModifierKeys::KeyControl());
568 
569  virtual HPS::UTF8 GetName() const { return "HPS_MouseWheelOperator"; }
570 
572  void UpdateZoomLimit();
573 
574  virtual bool OnMouseWheel(HPS::MouseState const & in_state);
575 
576  virtual void OnModelAttached();
577 
578  virtual void OnViewAttached();
579 
580 private:
581  float zoom_limit;
582  ZoomType zoom_type;
583  HPS::ModifierKeys zoom_modifier;
584 };
585 
597 class SPRK_API TurntableOperator : public Operator
598 {
599 public:
600  TurntableOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
602  virtual HPS::UTF8 GetName() const { return "HPS_TurntableOperator"; }
603 
609  virtual bool OnMouseDown(MouseState const & in_state);
614  virtual bool OnMouseUp(MouseState const & in_state);
619  virtual bool OnMouseMove(MouseState const & in_state);
624  virtual bool OnMouseWheel(MouseState const & in_state);
625 
631  virtual bool OnTouchDown(TouchState const & in_state);
636  virtual bool OnTouchUp(TouchState const & in_state);
642  virtual bool OnTouchMove(TouchState const & in_state);
643 
644 private:
645  void TurntableCommon(HPS::WindowPoint const & delta, HPS::Vector const & rotation_axis);
646  void CalculateCenterPoint(HPS::WindowKey const & window, HPS::Point const & location);
647 
648  bool operator_active;
649  bool center_point_set;
650  HPS::WorldPoint center_point;
651  HPS::TouchID tracked_touch_ID;
652  HPS::WindowPoint start_point;
653  HPS::SelectionOptionsKit selection_options;
654 };
655 
661 class SPRK_API ZoomFitTouchOperator : public Operator
662 {
663 public:
666  virtual HPS::UTF8 GetName() const { return "HPS_ZoomFitTouchOperator"; }
667 
672  virtual bool OnTouchDown(TouchState const & in_state);
677  virtual bool OnTouchUp(TouchState const & in_state);
678 
679 private:
680  HPS::TouchID tracked_touch_ID;
681 };
682 
705 class SPRK_API FlyOperator : public Operator
706 {
707 public:
708  FlyOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonRight(), ModifierKeys in_modifier_trigger = ModifierKeys());
710  virtual HPS::UTF8 GetName() const { return "HPS_FlyOperator"; }
711 
726  virtual bool OnKeyDown(KeyboardState const & in_state);
730  virtual bool OnKeyUp(KeyboardState const & in_state);
731 
736  virtual bool OnMouseDown(MouseState const & in_state);
740  virtual bool OnMouseUp(MouseState const & in_state);
745  virtual bool OnMouseMove(MouseState const & in_state);
751  virtual bool OnMouseWheel(MouseState const & in_state);
752 
757  virtual bool OnTouchDown(TouchState const & in_state);
761  virtual bool OnTouchUp(TouchState const & in_state);
766  virtual bool OnTouchMove(TouchState const & in_state);
767 
772  virtual bool OnTimerTick(HPS::TimerTickEvent const & in_event);
773 
774  virtual void OnModelAttached();
775  virtual void OnViewAttached();
776  virtual void OnViewDetached();
777 
778  /* getters/setters for inverting the X and Y axis */
779  void InvertXAxis() { invert_x_axis = !invert_x_axis;}
780  void InvertYAxis() { invert_y_axis = !invert_y_axis;}
781  bool IsXAxisInverted() { return invert_x_axis; }
782  bool IsYAxisInverted() { return invert_y_axis; }
783 
784  /* getters/setters for sensitivity */
785  /* Keyboard sensitivity affects the speed of movement of action triggered from the keyboard, such as walking forward by pressing W */
786  float GetKeyboardSensitivity() { return keyboard_sensitivity; }
787  void SetKeyboardSensitivity(float in_keyboard_sensitivity) { keyboard_sensitivity = in_keyboard_sensitivity; }
788 
789  /* Mouse sensitivity affects the speed of movement of action triggered from the mouse, such as rotating */
790  float GetMouseSensitivity() { return mouse_sensitivity; }
791  void SetMouseSensitivity(float in_mouse_sensitivity) { mouse_sensitivity = in_mouse_sensitivity; }
792 
793  /* Left Joystick sensitivity affects the speed of movement of action triggered from the left joystick on touch devices */
794  float GetLeftJoystickSensitivity() { return left_joystick_sensitivity; }
795  void SetLeftJoystickSensitivity(float in_left_joystick_sensitivity) { left_joystick_sensitivity = in_left_joystick_sensitivity; }
796 
797  /* Right Joystick sensitivity affects the speed of movement of action triggered from the right joystick on touch devices */
798  float GetRightJoystickSensitivity() { return right_joystick_sensitivity; }
799  void SetRightJoystickSensitivity(float in_right_joystick_sensitivity) { right_joystick_sensitivity = in_right_joystick_sensitivity; }
800 
801  /* getters/setters for joystick dead zone
802  The dead zone is an area around the initial touch down position where the user can move its finger
803  without triggering any movement.
804  The default value is 0.07. */
805  float GetJoystickDeadZone() { return joystick_dead_zone; }
806  void SetJoystickDeadZone(float in_dead_zone) { joystick_dead_zone = in_dead_zone; }
807 
808 protected:
809 
810  enum MovementFlags
811  {
812  no_movement = 0x0000,
813  moving_forward = 0x0001,
814  moving_back = 0x0002,
815  moving_left = 0x0004,
816  moving_right = 0x0008,
817  moving_up = 0x0010,
818  moving_down = 0x0020,
819  roll_left = 0x0040,
820  roll_right = 0x0080,
821  rotating = 0x0100,
822  move_with_touch = 0x0200,
823  rotate_with_touch = 0x0400
824  };
825 
826  unsigned int movement_flags;
827 
828  //movement functions
829  void MoveLeft(HPS::Point & position, HPS::Point & target, HPS::Vector & up);
830  void MoveRight(HPS::Point & position, HPS::Point & target, HPS::Vector & up);
831  void MoveUp(HPS::Point & position, HPS::Point & target, HPS::Vector & up);
832  void MoveDown(HPS::Point & position, HPS::Point & target, HPS::Vector & up);
833  void MoveForward(HPS::Point & position, HPS::Point & target, HPS::Vector const & direction);
834  void MoveBack(HPS::Point & position, HPS::Point & target, HPS::Vector const & direction);
835  void MoveWithTouch(HPS::Point & position, HPS::Point & target, HPS::Vector & up, HPS::Vector const & walking_direction);
836  void RotateScene(HPS::Point & position, HPS::Point & target);
837  void RotateWithTouch(HPS::Point & position, HPS::Point & target);
838  void RotateCommon(HPS::Point const & delta, HPS::Point & position, HPS::Point & target);
839 
840 private:
841 
842  enum class TouchPosition
843  {
844  Left,
845  Right,
846  None
847  };
848 
849  //touch IDs tracked by the operator
850  HPS::TouchID left_side_touch;
851  HPS::TouchID right_side_touch;
852  HPS::TouchID second_right_touch;
853 
854  //current and start location for touch operations
855  HPS::WindowPoint start_point;
856  HPS::WindowPoint left_start_point;
857  HPS::WindowPoint right_start_point;
858  HPS::WindowPoint current_right_touch_position;
859  HPS::WindowPoint second_right_start_point;
860  HPS::WindowPoint current_second_right_touch_position;
861  HPS::WindowPoint start_mid_point;
862 
863  //virtual joystick information
864  HPS::SegmentKey left_joystick_segment;
865  HPS::SegmentKey right_joystick_segment;
866  float joystick_dead_zone;
867 
868  //step length for left touch, right touch, and desktop operation
869  float keyboard_sensitivity;
870  float old_keyboard_sensitivity;
871  float left_joystick_sensitivity;
872  float old_left_joystick_sensitivity;
873  float right_joystick_sensitivity;
874  float old_right_joystick_sensitivity;
875  float mouse_sensitivity;
876 
877  //operator state flags
878  bool two_right_fingers_down;
879  bool invert_x_axis;
880  bool invert_y_axis;
881  Drawing::Handedness world_handedness;
882  bool shift_pressed;
883  bool ctrl_pressed;
884  HPS::KeyPath event_path;
885  HPS::WindowPoint rotation_location;
886  HPS::WindowPoint moving_position;
887 
888  //utility functions
889  void UpdateKeyboardState(KeyboardState const & in_state);
890  void ComputeReasonableStepLength();
891  void CreateJoystick(HPS::TouchState const & in_state, TouchPosition touch_position);
892 };
893 
925 class SPRK_API WalkOperator : public FlyOperator
926 {
927 public:
928  WalkOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonRight(), ModifierKeys in_modifier_trigger = ModifierKeys());
929 
931  virtual HPS::UTF8 GetName() const { return "HPS_WalkOperator"; }
932 
933  virtual void OnViewAttached();
934  virtual void OnModelAttached();
935 
940  virtual bool OnTimerTick(HPS::TimerTickEvent const & in_event);
941 
942  /* Getters / Setters for the plane the operator walks on. */
943  void SetGroundPlane(HPS::Plane const & in_plane) { ground = in_plane; }
944  HPS::Plane GetGroundPlane() { return ground; }
945 
946  /* Getters / Setters for camera vertical offset from the ground plane */
947  void SetWalkerHeight(float height) { height_off_ground = height; }
948  float GetWalkerHeight() { return height_off_ground; }
949 
950 private:
951  HPS::Plane ground;
952  HPS::Vector walking_direction;
953  float height_off_ground;
954 
955  void CalculateGroundPlane();
956  void SnapToPlane();
957  void AdjustWalkingDirection(HPS::Vector const & camera_direction, HPS::Vector const & camera_up);
958 };
959 
969 class SPRK_API SimpleWalkOperator : public WalkOperator
970 {
971 public:
972  SimpleWalkOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
973 
975  virtual HPS::UTF8 GetName() const { return "HPS_SimpleWalkOperator"; }
976 
980  virtual bool OnKeyDown(KeyboardState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
984  virtual bool OnKeyUp(KeyboardState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
989  virtual bool OnMouseWheel(MouseState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
990 
995  virtual bool OnMouseDown(MouseState const & in_state);
1000  virtual bool OnMouseMove(MouseState const & in_state);
1004  virtual bool OnMouseUp(MouseState const & in_state);
1005 
1010  virtual bool OnTouchDown(TouchState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
1015  virtual bool OnTouchMove(TouchState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
1019  virtual bool OnTouchUp(TouchState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
1020 
1025  virtual bool OnTimerTick(HPS::TimerTickEvent const & in_event);
1026 
1027 private:
1028  void MoveWithMouse(HPS::Point & position, HPS::Point & target);
1029 
1030  HPS::KeyPath event_path;
1031  HPS::WindowPoint rotation_location;
1032  HPS::WindowPoint start_point;
1033  bool moving;
1034 };
1035 
1036 
1095 {
1096 private:
1097  enum class OpState
1098  {
1099  Uninitialized,
1100  Initialized,
1101  Translating,
1102  FacePicking,
1103  };
1104 
1105 public:
1106  CuttingSectionOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
1107 
1109  virtual HPS::UTF8 GetName() const { return "HPS_CuttingSectionOperator"; }
1110 
1111  virtual void OnModelAttached();
1112  virtual void OnViewAttached();
1113  virtual void OnViewDetached();
1114 
1115  /* This function programmatically assigns cutting planes to this operator from plane equations.
1116  * If this operator has already had cutting planes associated with it, the cutting planes set using
1117  * this function replace the previous cutting planes.
1118  * \param in_planes An array of Plane objects describing the cutting planes to be inserted. */
1119  void SetPlanes(PlaneArray const & in_planes);
1120 
1121  /* This function returns the planes associated with the active cutting sections
1122  * \return planes associated with the active cutting sections. */
1123  PlaneArray GetPlanes();
1124 
1130  virtual bool OnMouseDown(MouseState const & in_state);
1131 
1135  virtual bool OnMouseUp(MouseState const & in_state);
1136 
1142  virtual bool OnMouseMove(MouseState const & in_state);
1143 
1149  virtual bool OnTouchDown(TouchState const & in_state);
1150 
1154  virtual bool OnTouchUp(TouchState const & in_state);
1155 
1160  virtual bool OnTouchMove(TouchState const & in_state);
1161 
1166  virtual bool OnTimerTick(TimerTickEvent const & in_event);
1167 
1170  float GetIndicatorScale() const { return indicator_scale; }
1171 
1174  void SetIndicatorScale(float in_scale) { indicator_scale = in_scale; }
1175 
1178  MaterialMappingKit GetPlaneMaterial() const { return plane_material; }
1179 
1182  void SetPlaneMaterial(MaterialMappingKit const & in_plane_material);
1183 
1186  HighlightOptionsKit GetPlaneHighlightOptions() const { return highlight_options; }
1187 
1190  void SetPlaneHighlightOptions(HighlightOptionsKit const & in_highlight_options) { highlight_options = in_highlight_options; }
1191 
1194  bool GetMouseOverHighlighting() const { return enable_mouse_over_highlighting; }
1195 
1198  void SetMouseOverHighlighting(bool in_enable_mouse_over_highlighting) { enable_mouse_over_highlighting = in_enable_mouse_over_highlighting; }
1199 
1203  void SetSectioning(bool in_sectioning);
1204 
1207  bool GetSectioning() { return sectioning; }
1208 
1212  void SetIndicatorVisibility(bool in_use_indicator);
1213 
1216  bool GetIndicatorVisibility() { return (op_state == OpState::Uninitialized || op_state == OpState::FacePicking) ? true : false; }
1217 
1221  void SetPlaneVisibility(bool in_visibility);
1222 
1225  bool GetPlaneVisibility();
1226 
1227 private:
1228 
1229  void SetupOperatorSegment();
1230  void InsertNormalIndicator(float scale);
1231  ShellKey InsertCuttingPlaneGeometry();
1232  void MouseOverHighlighting(MouseState const & in_state);
1233  void TranslateCuttingPlane(KeyPath const & in_event_path, WindowPoint const & in_event_location);
1234  bool HandleMouseAndTouchDown(WindowKey const & in_event_source, int in_number_of_clicks,
1235  KeyPath const & in_event_path, WindowPoint const & in_event_location);
1236  void ViewAlignSectionPlanes(HPS::PlaneArray & in_out_planes) const;
1237  typedef std::pair<CuttingSectionKey, std::vector<ShellKey>> SectionInfo;
1238  typedef std::vector<SectionInfo> SectionArray;
1239  SectionArray sections;
1240 
1241  SegmentKey operator_root_segment;
1242  SegmentKey cutting_sections_segment;
1243  SegmentKey plane_representation_segment;
1244  bool sectioning;
1245 
1246  CuttingSectionKey translating_section;
1247  size_t translating_plane_offset;
1248  ShellKey translating_plane_representation;
1249 
1250  TouchID tracked_touch_ID;
1251  MaterialMappingKit plane_material;
1252  SegmentKey indicator_seg;
1253  OpState op_state;
1254  WorldPoint start_world_point;
1255  SelectionOptionsKit selection_options;
1256  SelectionOptionsKit mouse_over_selection_options;
1257  float indicator_scale;
1258  Vector plane_normal;
1259  bool plane_normal_valid;
1260  WorldPoint anchor_point;
1261  SimpleCuboid model_bounding;
1262 
1263  UpdateNotifier last_highlight_notifier;
1264  bool last_skipped_highlight_state_valid;
1265  MouseState last_skipped_highlight_state;
1266  bool is_plane_highlighted;
1267  PortfolioKey portfolio;
1268  SegmentKey style_segment;
1269  HighlightOptionsKit highlight_options;
1270  bool enable_mouse_over_highlighting;
1271  bool skip_mouse_overs;
1272 
1273  View attached_view;
1274  KeyArray navigation_keys;
1275 };
1276 
1277 
1278 
1279 
1280 }
1281 #endif
1282 
1283 
1284 
1285 
Definition: hps.h:6049
Handedness
Definition: hps.h:1276
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:495
Definition: sprk.h:243
virtual bool OnMouseWheel(MouseState const &in_state)
Definition: sprk_ops.h:989
bool GetSectioning()
Definition: sprk_ops.h:1207
static MouseButtons ButtonRight()
Definition: hps.h:41772
Definition: sprk_ops.h:969
Definition: sprk_ops.h:267
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:182
Definition: hps.h:33682
HPS::HighlightOptionsKit GetHighlightOptions() const
Definition: sprk_ops.h:459
Definition: sprk_ops.h:381
HPS::SelectionOptionsKit GetSelectionOptions() const
Definition: sprk_ops.h:514
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:975
Definition: hps.h:42259
Definition: hps.h:7427
Definition: sprk_ops.h:54
Definition: hps.h:3419
ZoomType
Definition: sprk_ops.h:557
void SetIndicatorScale(float in_scale)
Definition: sprk_ops.h:1174
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:237
Definition: hps.h:15039
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:442
HPS::SelectionOptionsKit GetSelectionOptions() const
Definition: sprk_ops.h:421
Definition: sprk_ops.h:597
virtual bool OnTouchDown(TouchState const &in_state)
Definition: sprk_ops.h:1010
void SetPlaneHighlightOptions(HighlightOptionsKit const &in_highlight_options)
Definition: sprk_ops.h:1190
Definition: sprk_ops.h:478
Definition: sprk_ops.h:177
Definition: hps.h:8628
Definition: sprk_ops.h:320
Definition: sprk_ops.h:661
virtual bool OnTouchMove(TouchState const &in_state)
Definition: sprk_ops.h:1015
void SetSelectionOptions(HPS::SelectionOptionsKit const &in_options)
Definition: sprk_ops.h:509
Definition: sprk_ops.h:1094
Definition: hps.h:42158
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:324
Definition: sprk_ops.h:705
Definition: sprk_ops.h:431
Definition: hps.h:30320
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:398
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:569
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:931
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:128
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:666
bool GetIndicatorVisibility()
Definition: sprk_ops.h:1216
virtual bool OnTouchUp(TouchState const &in_state)
Definition: sprk_ops.h:1019
Definition: hps.h:6797
Definition: hps.h:41650
Definition: hps.h:24816
Definition: hps.h:39455
Definition: hps.h:5753
Definition: hps.h:40827
Definition: hps.h:38807
Definition: hps.h:42046
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:362
Definition: sprk_ops.h:524
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:1109
Definition: hps.h:39732
Definition: hps.h:41315
bool GetMouseOverHighlighting() const
Definition: sprk_ops.h:1194
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:533
HPS::Rectangle GetRectangle() const
Definition: sprk_ops.h:339
void SetSelectionOptions(HPS::SelectionOptionsKit const &in_options)
Definition: sprk_ops.h:416
virtual bool OnKeyDown(KeyboardState const &in_state)
Definition: sprk_ops.h:980
void SetMouseOverHighlighting(bool in_enable_mouse_over_highlighting)
Definition: sprk_ops.h:1198
Definition: sprk_ops.h:226
void SetHighlightOptions(HPS::HighlightOptionsKit const &in_options)
Definition: sprk_ops.h:454
float GetIndicatorScale() const
Definition: sprk_ops.h:1170
HPS::HighlightOptionsKit GetHighlightOptions() const
Definition: sprk_ops.h:546
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:272
Definition: sprk_ops.h:554
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:602
Definition: sprk_ops.h:925
static MouseButtons ButtonLeft()
Definition: hps.h:41768
static MouseButtons ButtonMiddle()
Definition: hps.h:41776
Definition: hps.h:8744
static ModifierKeys KeyControl()
Definition: hps.h:41430
MaterialMappingKit GetPlaneMaterial() const
Definition: sprk_ops.h:1178
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:59
Definition: hps.h:8958
Definition: hps.h:22189
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:710
Definition: hps.h:22474
Definition: sprk.h:973
Definition: sprk_ops.h:123
virtual bool OnKeyUp(KeyboardState const &in_state)
Definition: sprk_ops.h:984
HighlightOptionsKit GetPlaneHighlightOptions() const
Definition: sprk_ops.h:1186
Definition: hps.h:36611
void SetHighlightOptions(HPS::HighlightOptionsKit const &in_options)
Definition: sprk_ops.h:541
Definition: sprk_ops.h:358