Open Inventor Release 2024.2.1
 
Loading...
Searching...
No Matches
SoDragPointDragger.h
1/*=======================================================================
2 * Copyright 1991-1996, Silicon Graphics, Inc.
3 * ALL RIGHTS RESERVED
4 *
5 * UNPUBLISHED -- Rights reserved under the copyright laws of the United
6 * States. Use of a copyright notice is precautionary only and does not
7 * imply publication or disclosure.
8 *
9 * U.S. GOVERNMENT RESTRICTED RIGHTS LEGEND:
10 * Use, duplication or disclosure by the Government is subject to restrictions
11 * as set forth in FAR 52.227.19(c)(2) or subparagraph (c)(1)(ii) of the Rights
12 * in Technical Data and Computer Software clause at DFARS 252.227-7013 and/or
13 * in similar or successor clauses in the FAR, or the DOD or NASA FAR
14 * Supplement. Contractor/manufacturer is Silicon Graphics, Inc.,
15 * 2011 N. Shoreline Blvd. Mountain View, CA 94039-7311.
16 *
17 * THE CONTENT OF THIS WORK CONTAINS CONFIDENTIAL AND PROPRIETARY
18 * INFORMATION OF SILICON GRAPHICS, INC. ANY DUPLICATION, MODIFICATION,
19 * DISTRIBUTION, OR DISCLOSURE IN ANY FORM, IN WHOLE, OR IN PART, IS STRICTLY
20 * PROHIBITED WITHOUT THE PRIOR EXPRESS WRITTEN PERMISSION OF SILICON
21 * GRAPHICS, INC.
22**=======================================================================*/
23/*=======================================================================
24** Author : Paul Isaacs (MMM yyyy)
25** Modified by : Howard Look (MMM yyyy)
26**=======================================================================*/
27/*=======================================================================
28 *** THE CONTENT OF THIS WORK IS PROPRIETARY TO FEI S.A.S, (FEI S.A.S.), ***
29 *** AND IS DISTRIBUTED UNDER A LICENSE AGREEMENT. ***
30 *** ***
31 *** REPRODUCTION, DISCLOSURE, OR USE, IN WHOLE OR IN PART, OTHER THAN AS ***
32 *** SPECIFIED IN THE LICENSE ARE NOT TO BE UNDERTAKEN EXCEPT WITH PRIOR ***
33 *** WRITTEN AUTHORIZATION OF FEI S.A.S. ***
34 *** ***
35 *** RESTRICTED RIGHTS LEGEND ***
36 *** USE, DUPLICATION, OR DISCLOSURE BY THE GOVERNMENT OF THE CONTENT OF THIS ***
37 *** WORK OR RELATED DOCUMENTATION IS SUBJECT TO RESTRICTIONS AS SET FORTH IN ***
38 *** SUBPARAGRAPH (C)(1) OF THE COMMERCIAL COMPUTER SOFTWARE RESTRICTED RIGHT ***
39 *** CLAUSE AT FAR 52.227-19 OR SUBPARAGRAPH (C)(1)(II) OF THE RIGHTS IN ***
40 *** TECHNICAL DATA AND COMPUTER SOFTWARE CLAUSE AT DFARS 52.227-7013. ***
41 *** ***
42 *** COPYRIGHT (C) 1996-2022 BY FEI S.A.S, ***
43 *** BORDEAUX, FRANCE ***
44 *** ALL RIGHTS RESERVED ***
45**=======================================================================*/
46/*=======================================================================
47** Modified by : VSG (MMM YYYY)
48**=======================================================================*/
49
50
51#ifndef _SO_DRAGPOINT_DRAGGER_
52#define _SO_DRAGPOINT_DRAGGER_
53
54#include <Inventor/SbLinear.h>
55#include <Inventor/SbBox.h>
56#include <Inventor/draggers/SoDragger.h>
57#include <Inventor/fields/SoSFVec3f.h>
58#include <Inventor/sensors/SoSensor.h>
59
60
61class SoFieldSensor;
62
64//
65// Class: SoDragPointDragger
66//
67// DragPoint dragger - allows user to move a single coordinate in
68// three dimensions.
69//
71
326{
327 SO_KIT_HEADER(SoDragPointDragger);
328
329 SO_KIT_CATALOG_ENTRY_HEADER(noRotSep);
330 SO_KIT_CATALOG_ENTRY_HEADER(xTranslatorSwitch);
331 SO_KIT_CATALOG_ENTRY_HEADER(xTranslator);
332 SO_KIT_CATALOG_ENTRY_HEADER(xyTranslatorSwitch);
333 SO_KIT_CATALOG_ENTRY_HEADER(xyTranslator);
334
335 SO_KIT_CATALOG_ENTRY_HEADER(rotXSep);
336 SO_KIT_CATALOG_ENTRY_HEADER(rotX);
337 SO_KIT_CATALOG_ENTRY_HEADER(xzTranslatorSwitch);
338 SO_KIT_CATALOG_ENTRY_HEADER(xzTranslator);
339
340 SO_KIT_CATALOG_ENTRY_HEADER(rotYSep);
341 SO_KIT_CATALOG_ENTRY_HEADER(rotY);
342 SO_KIT_CATALOG_ENTRY_HEADER(zTranslatorSwitch);
343 SO_KIT_CATALOG_ENTRY_HEADER(zTranslator);
344 SO_KIT_CATALOG_ENTRY_HEADER(yzTranslatorSwitch);
345 SO_KIT_CATALOG_ENTRY_HEADER(yzTranslator);
346
347 SO_KIT_CATALOG_ENTRY_HEADER(rotZSep);
348 SO_KIT_CATALOG_ENTRY_HEADER(rotZ);
349 SO_KIT_CATALOG_ENTRY_HEADER(yTranslatorSwitch);
350 SO_KIT_CATALOG_ENTRY_HEADER(yTranslator);
351
352 SO_KIT_CATALOG_ENTRY_HEADER(xFeedbackSwitch);
353 SO_KIT_CATALOG_ENTRY_HEADER(xFeedbackSep);
354 SO_KIT_CATALOG_ENTRY_HEADER(xFeedbackTranslation);
355 SO_KIT_CATALOG_ENTRY_HEADER(xFeedback);
356
357 SO_KIT_CATALOG_ENTRY_HEADER(yFeedbackSwitch);
358 SO_KIT_CATALOG_ENTRY_HEADER(yFeedbackSep);
359 SO_KIT_CATALOG_ENTRY_HEADER(yFeedbackTranslation);
360 SO_KIT_CATALOG_ENTRY_HEADER(yFeedback);
361
362 SO_KIT_CATALOG_ENTRY_HEADER(zFeedbackSwitch);
363 SO_KIT_CATALOG_ENTRY_HEADER(zFeedbackSep);
364 SO_KIT_CATALOG_ENTRY_HEADER(zFeedbackTranslation);
365 SO_KIT_CATALOG_ENTRY_HEADER(zFeedback);
366
367 SO_KIT_CATALOG_ENTRY_HEADER(planeFeedbackSep);
368 SO_KIT_CATALOG_ENTRY_HEADER(planeFeedbackTranslation);
369 SO_KIT_CATALOG_ENTRY_HEADER(planeFeedbackSwitch);
370 SO_KIT_CATALOG_ENTRY_HEADER(yzFeedback);
371 SO_KIT_CATALOG_ENTRY_HEADER(xzFeedback);
372 SO_KIT_CATALOG_ENTRY_HEADER(xyFeedback);
373
374 public:
379
385
386 public:
392 void setJumpLimit(float limit) { jumpLimit = limit; }
396 float getJumpLimit() const { return jumpLimit; }
397
405
408 /*
409 * X axis dragger set (x-line/yz-plane)
410 */
412 /*
413 * Y axis dragger set (y-line/xz-plane)
414 */
416 /*
417 * Z axis dragger set (z-line/xy-plane)
418 */
419 Z_AXIS
420 };
421
428
429 private:
430 static void initClass(); // initialize the class
431 static void exitClass();
432
433 private:
434
435 static void startCB( void *, SoDragger * );
436 static void motionCB( void *, SoDragger * );
437 static void finishCB( void *, SoDragger * );
438
439 SoFieldSensor *fieldSensor;
440 static void fieldSensorCB( void *, SoSensor * );
441 static void valueChangedCB( void *, SoDragger * );
442
443 static void metaKeyChangeCB( void *, SoDragger *);
444
445 void dragStart();
446 void drag();
447 void dragFinish();
448
449 // detach/attach any sensors, callbacks, and/or field connections.
450 // Also set geometry of childDraggers to be our default instead of their
451 // regular default, using our resources.
452 // Called by: start/end of SoBaseKit::readInstance
453 // and on new copy by: start/end of SoBaseKit::copy.
454 // Classes that redefine must call setUpConnections(TRUE,TRUE)
455 // at end of constructor.
456 // Returns the state of the node when this was called.
457 virtual SbBool setUpConnections( SbBool onOff, SbBool doItAlways = FALSE );
458
459 virtual void setDefaultOnNonWritingFields();
460
461 virtual ~SoDragPointDragger();
462
463 private:
464
465 SoDragger *currentDragger;
466 SbVec3f startLocalHitPt;
467
468 SbBool shftDown; // used to keep track of if meta key is down.
469
470 // The box defining the area where the feedback appears.
471 // This box stays still in world space whil the dragger is moved.
472 // But when the dragger gets too close to the edge, it jumps over
473 // to define a new box.
474 // Limit box in local space preserves size of box even when world
475 // space coordinates are very large (small box dimensions could be
476 // lost because of limited floating point precision).
477 SbBox3f limitBox;
478 SbBox3f localLimitBox;
479
480 // when to jump
481 float jumpLimit;
482
483 // sets the feedback geometry based on the level of
484 // constraints
485 void setFeedbackGeometry();
486
487 // checks the limit box and extends it if necessary
488 void checkBoxLimits();
489
490 // Sets the offsetWorkLimit box and updates the feedback geometry
491 void updateLimitBoxAndFeedback();
492
493 static const char geomBuffer[];
494
496
497 // Cached values to make updating feedback more efficient
498 SoNode *oldXAxisNode;
499 SoNode *oldYAxisNode;
500 SoNode *oldZAxisNode;
501
502};
503
504#endif /* _SO_DRAGPOINT_DRAGGER_ */
505
3D box class.
Definition SbBox.h:649
3D vector class.
Definition SbVec.h:932
SoNONUNICODE SbBool set(char *nameValuePairListString)
This function allows field values of parts (nodes) to be set in several different parts simultaneousl...
Object you can translate in 3D by dragging with the mouse.
void showDraggerSet(DraggerSet set)
The dragPoint dragger contains three pairs of draggers, each containing a plane dragger and a line dr...
void setJumpLimit(float limit)
Sets the point at which the feedback axes will jump to a new position.
SoSFVec3f translation
Position of the dragger.
SoDragPointDragger()
Constructor.
float getJumpLimit() const
Gets the point at which the feedback axes will jump to a new position.
void showNextDraggerSet()
The dragPoint dragger contains three pairs of draggers, each containing a plane dragger and a line dr...
Base class for nodekits that move in response to click-drag-release mouse events.
Definition SoDragger.h:537
Sensor class that can be attached to Open Inventor fields.
Computes bounding box of a scene.
Abstract base class for all database nodes.
Definition SoNode.h:145
Field containing a three-dimensional vector.
Definition SoSFVec3f.h:80
Abstract base class for Open Inventor sensors.
Definition SoSensor.h:100
int SbBool
Boolean type.
Definition SbBase.h:87