sprk_ops.h
1 // Copyright (c) 1998-2014 by 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 right_joystick_sensitivity) { right_joystick_sensitivity = 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 
939  virtual bool OnTimerTick(HPS::TimerTickEvent const & in_event);
940 
941  /* Getters / Setters for the plane the operator walks on. */
942  void SetGroundPlane(HPS::Plane const & in_plane) { ground = in_plane; }
943  HPS::Plane GetGroundPlane() { return ground; }
944 
945  /* Getters / Setters for camera vertical offset from the ground plane */
946  void SetWalkerHeight(float height) { height_off_ground = height; }
947  float GetWalkerHeight() { return height_off_ground; }
948 
949 private:
950  HPS::Plane ground;
951  HPS::Vector walking_direction;
952  float height_off_ground;
953 
954  void CalculateGroundPlane();
955  void SnapToPlane();
956  void AdjustWalkingDirection(HPS::Vector const & camera_direction, HPS::Vector const & camera_up);
957 };
958 
968 class SPRK_API SimpleWalkOperator : public WalkOperator
969 {
970 public:
971  SimpleWalkOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
972 
974  virtual HPS::UTF8 GetName() const { return "HPS_SimpleWalkOperator"; }
975 
979  virtual bool OnKeyDown(KeyboardState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
983  virtual bool OnKeyUp(KeyboardState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
988  virtual bool OnMouseWheel(MouseState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
989 
994  virtual bool OnMouseDown(MouseState const & in_state);
999  virtual bool OnMouseMove(MouseState const & in_state);
1003  virtual bool OnMouseUp(MouseState const & in_state);
1004 
1009  virtual bool OnTouchDown(TouchState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
1014  virtual bool OnTouchMove(TouchState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
1018  virtual bool OnTouchUp(TouchState const & in_state) { HPS_UNREFERENCED(in_state); return false; }
1019 
1024  virtual bool OnTimerTick(HPS::TimerTickEvent const & in_event);
1025 
1026 private:
1027  void MoveWithMouse(HPS::Point & position, HPS::Point & target);
1028 
1029  HPS::KeyPath event_path;
1030  HPS::WindowPoint rotation_location;
1031  HPS::WindowPoint start_point;
1032  bool moving;
1033 };
1034 
1035 
1094 {
1095 private:
1096  enum class OpState
1097  {
1098  Uninitialized,
1099  Initialized,
1100  Translating,
1101  FacePicking,
1102  };
1103 
1104 public:
1105  CuttingSectionOperator(MouseButtons in_mouse_trigger = MouseButtons::ButtonLeft(), ModifierKeys in_modifier_trigger = ModifierKeys());
1106 
1108  virtual HPS::UTF8 GetName() const { return "HPS_CuttingSectionOperator"; }
1109 
1110  virtual void OnModelAttached();
1111  virtual void OnViewAttached();
1112  virtual void OnViewDetached();
1113 
1114  /* This function programmatically assigns cutting planes to this operator from plane equations.
1115  * If this operator has already had cutting planes associated with it, the cutting planes set using
1116  * this function replace the previous cutting planes.
1117  * \param in_planes An array of Plane objects describing the cutting planes to be inserted. */
1118  void SetPlanes(PlaneArray const & in_planes);
1119 
1120  /* This function returns the planes associated with the active cutting sections
1121  * \return planes associated with the active cutting sections. */
1122  PlaneArray GetPlanes();
1123 
1129  virtual bool OnMouseDown(MouseState const & in_state);
1130 
1134  virtual bool OnMouseUp(MouseState const & in_state);
1135 
1141  virtual bool OnMouseMove(MouseState const & in_state);
1142 
1148  virtual bool OnTouchDown(TouchState const & in_state);
1149 
1153  virtual bool OnTouchUp(TouchState const & in_state);
1154 
1159  virtual bool OnTouchMove(TouchState const & in_state);
1160 
1165  virtual bool OnTimerTick(TimerTickEvent const & in_event);
1166 
1169  float GetIndicatorScale() const { return indicator_scale; }
1170 
1173  void SetIndicatorScale(float in_scale) { indicator_scale = in_scale; }
1174 
1177  MaterialMappingKit GetPlaneMaterial() const { return plane_material; }
1178 
1181  void SetPlaneMaterial(MaterialMappingKit const & in_plane_material);
1182 
1185  HighlightOptionsKit GetPlaneHighlightOptions() const { return highlight_options; }
1186 
1189  void SetPlaneHighlightOptions(HighlightOptionsKit const & in_highlight_options) { highlight_options = in_highlight_options; }
1190 
1193  bool GetMouseOverHighlighting() const { return enable_mouse_over_highlighting; }
1194 
1197  void SetMouseOverHighlighting(bool in_enable_mouse_over_highlighting) { enable_mouse_over_highlighting = in_enable_mouse_over_highlighting; }
1198 
1202  void SetSectioning(bool in_sectioning);
1203 
1206  bool GetSectioning() { return sectioning; }
1207 
1211  void SetIndicatorVisibility(bool in_use_indicator);
1212 
1215  bool GetIndicatorVisibility() { return (op_state == OpState::Uninitialized || op_state == OpState::FacePicking) ? true : false; }
1216 
1220  void SetPlaneVisibility(bool in_visibility);
1221 
1224  bool GetPlaneVisibility();
1225 
1226 private:
1227 
1228  void SetupOperatorSegment();
1229  void InsertNormalIndicator(float scale);
1230  ShellKey InsertCuttingPlaneGeometry();
1231  void MouseOverHighlighting(MouseState const & in_state);
1232  void TranslateCuttingPlane(KeyPath const & in_event_path, WindowPoint const & in_event_location);
1233  bool HandleMouseAndTouchDown(WindowKey const & in_event_source, int in_number_of_clicks,
1234  KeyPath const & in_event_path, WindowPoint const & in_event_location);
1235  void ViewAlignSectionPlanes(HPS::PlaneArray & in_out_planes) const;
1236  typedef std::pair<CuttingSectionKey, std::vector<ShellKey>> SectionInfo;
1237  typedef std::vector<SectionInfo> SectionArray;
1238  SectionArray sections;
1239 
1240  SegmentKey operator_root_segment;
1241  SegmentKey cutting_sections_segment;
1242  SegmentKey plane_representation_segment;
1243  bool sectioning;
1244 
1245  CuttingSectionKey translating_section;
1246  size_t translating_plane_offset;
1247  ShellKey translating_plane_representation;
1248 
1249  TouchID tracked_touch_ID;
1250  MaterialMappingKit plane_material;
1251  SegmentKey indicator_seg;
1252  OpState op_state;
1253  WorldPoint start_world_point;
1254  SelectionOptionsKit selection_options;
1255  SelectionOptionsKit mouse_over_selection_options;
1256  float indicator_scale;
1257  Vector plane_normal;
1258  bool plane_normal_valid;
1259  WorldPoint anchor_point;
1260  SimpleCuboid model_bounding;
1261 
1262  UpdateNotifier last_highlight_notifier;
1263  bool last_skipped_highlight_state_valid;
1264  MouseState last_skipped_highlight_state;
1265  bool is_plane_highlighted;
1266  PortfolioKey portfolio;
1267  SegmentKey style_segment;
1268  HighlightOptionsKit highlight_options;
1269  bool enable_mouse_over_highlighting;
1270  bool skip_mouse_overs;
1271 
1272  View attached_view;
1273  KeyArray navigation_keys;
1274 };
1275 
1276 
1277 
1278 
1279 }
1280 #endif
1281 
1282 
1283 
1284 
Definition: hps.h:6014
Handedness
Definition: hps.h:1276
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:495
Definition: sprk.h:239
virtual bool OnMouseWheel(MouseState const &in_state)
Definition: sprk_ops.h:988
bool GetSectioning()
Definition: sprk_ops.h:1206
static MouseButtons ButtonRight()
Definition: hps.h:41561
Definition: sprk_ops.h:968
Definition: sprk_ops.h:267
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:182
Definition: hps.h:33537
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:974
Definition: hps.h:42048
Definition: hps.h:7389
Definition: sprk_ops.h:54
Definition: hps.h:3406
ZoomType
Definition: sprk_ops.h:557
void SetIndicatorScale(float in_scale)
Definition: sprk_ops.h:1173
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:237
Definition: hps.h:14929
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:1009
void SetPlaneHighlightOptions(HighlightOptionsKit const &in_highlight_options)
Definition: sprk_ops.h:1189
Definition: sprk_ops.h:478
Definition: sprk_ops.h:177
Definition: hps.h:8590
Definition: sprk_ops.h:320
Definition: sprk_ops.h:661
virtual bool OnTouchMove(TouchState const &in_state)
Definition: sprk_ops.h:1014
void SetSelectionOptions(HPS::SelectionOptionsKit const &in_options)
Definition: sprk_ops.h:509
Definition: sprk_ops.h:1093
Definition: hps.h:41947
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:324
Definition: sprk_ops.h:705
Definition: sprk_ops.h:431
Definition: hps.h:30181
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:1215
virtual bool OnTouchUp(TouchState const &in_state)
Definition: sprk_ops.h:1018
Definition: hps.h:6762
Definition: hps.h:41439
Definition: hps.h:24677
Definition: hps.h:39273
Definition: hps.h:5718
Definition: hps.h:40601
Definition: hps.h:38625
Definition: hps.h:41835
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:362
Definition: sprk_ops.h:524
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:1108
Definition: hps.h:39550
Definition: hps.h:41089
bool GetMouseOverHighlighting() const
Definition: sprk_ops.h:1193
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:979
void SetMouseOverHighlighting(bool in_enable_mouse_over_highlighting)
Definition: sprk_ops.h:1197
Definition: sprk_ops.h:226
void SetHighlightOptions(HPS::HighlightOptionsKit const &in_options)
Definition: sprk_ops.h:454
float GetIndicatorScale() const
Definition: sprk_ops.h:1169
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:41557
static MouseButtons ButtonMiddle()
Definition: hps.h:41565
Definition: hps.h:8701
static ModifierKeys KeyControl()
Definition: hps.h:41204
MaterialMappingKit GetPlaneMaterial() const
Definition: sprk_ops.h:1177
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:59
Definition: hps.h:8915
Definition: hps.h:22049
virtual HPS::UTF8 GetName() const
Definition: sprk_ops.h:710
Definition: hps.h:22334
Definition: sprk.h:969
Definition: sprk_ops.h:123
virtual bool OnKeyUp(KeyboardState const &in_state)
Definition: sprk_ops.h:983
HighlightOptionsKit GetPlaneHighlightOptions() const
Definition: sprk_ops.h:1185
Definition: hps.h:36430
void SetHighlightOptions(HPS::HighlightOptionsKit const &in_options)
Definition: sprk_ops.h:541
Definition: sprk_ops.h:358