SoQtFlyViewer(3)
๐ธ NAME ๐ธ
Okay bestie, welcome to SoQtFlyViewer(3) from the SoQt manual. The SoQtFlyViewer class implements controls for moving the camera in a โflyingโ motion. Thatโs the whole main-character assignment, and honestly? iconic. ๐
โจ SYNOPSIS โจ
#include <Inventor/Qt/viewers/SoQtFlyViewer.h>
Inherits SoQtConstrainedViewer. No cap.
bestie, the inherited lists below are long, but we are not skipping a single signature. Every one is here. ๐ซถ
๐ Public Member Functions ๐
SoQtFlyViewer (QWidget *parent=NULL, const char *name=NULL, SbBool embed=TRUE, SoQtFullViewer::BuildFlag flag=BUILD_ALL, SoQtViewer::Type type=BROWSER)โ the constructor, with every default exactly as written:parent=NULL,name=NULL,embed=TRUE,flag=BUILD_ALL,type=BROWSER. Itโs giving setup era. ๐~SoQtFlyViewer ()โ the destructor. Cleanup time, periodt.virtual void setViewing (SbBool enable)โ sets viewing, bestie.virtual void viewAll (void)โ does the view-all thing. Simple, slay.virtual void resetToHomePosition (void)โ resets to the home position. Home sweet home. ๐virtual void setCamera (SoCamera *camera)โ sets the camera.virtual void setCursorEnabled (SbBool enable)โ sets whether the cursor is enabled.virtual void setCameraType (SoType type)โ sets the camera type.
๐ Public Member Functions inherited from SoQtConstrainedViewer ๐
These cuties are inherited exactly as they come, no remix:
void setUpDirection (const SbVec3f &dir)const SbVec3f & getUpDirection (void) constvirtual void saveHomePosition (void)
๐ฆ Public Member Functions inherited from SoQtFullViewer ๐ฆ
Serving these inherited signatures, untouched:
void setDecoration (const SbBool on)SbBool isDecoration (void) constvoid setPopupMenuEnabled (const SbBool on)SbBool isPopupMenuEnabled (void) constQWidget * getAppPushButtonParent (void) constvoid addAppPushButton (QWidget *newButton)void insertAppPushButton (QWidget *newButton, int index)void removeAppPushButton (QWidget *oldButton)int findAppPushButton (QWidget *oldButton) constint lengthAppPushButton (void) constQWidget * getRenderAreaWidget (void) constvirtual void setComponentCursor (const SoQtCursor &cursor)
๐ Public Member Functions inherited from SoQtViewer ๐
These come from SoQtViewer, all inherited, all exact:
SoCamera * getCamera (void) constSoType getCameraType (void) constvirtual void toggleCameraType (void)virtual void setHeadlight (SbBool enable)SbBool isHeadlight (void) constSoDirectionalLight * getHeadlight (void) constvirtual void setDrawStyle (SoQtViewer::DrawType type, SoQtViewer::DrawStyle style)SoQtViewer::DrawStyle getDrawStyle (const SoQtViewer::DrawType type) constvirtual void setBufferingType (SoQtViewer::BufferType type)SoQtViewer::BufferType getBufferingType (void) constSbBool isViewing (void) constSbBool isCursorEnabled (void) constvoid setAutoClipping (SbBool enable)SbBool isAutoClipping (void) constvoid setAutoClippingStrategy (const AutoClippingStrategy strategy, const float value=0.6f, SoQtAutoClippingCB *cb=NULL, void *cbuserdata=NULL)virtual void setStereoViewing (SbBool enable)SbBool isStereoViewing (void) constvirtual void setStereoOffset (const float dist)float getStereoOffset (void) constSbBool setStereoType (SoQtViewer::StereoType s)SoQtViewer::StereoType getStereoType (void) constvoid setAnaglyphStereoColorMasks (const SbBool left[3], const SbBool right[3])void getAnaglyphStereoColorMasks (SbBool left[3], SbBool right[3])void setDetailSeek (const SbBool enable)SbBool isDetailSeek (void) constvoid setSeekTime (const float seconds)float getSeekTime (void) constvoid addStartCallback (SoQtViewerCB *func, void *data=NULL)void addFinishCallback (SoQtViewerCB *func, void *data=NULL)void removeStartCallback (SoQtViewerCB *func, void *data=NULL)void removeFinishCallback (SoQtViewerCB *func, void *data=NULL)void setWireframeOverlayColor (const SbColor &color)const SbColor & getWireframeOverlayColor (void) constvirtual void setDoubleBuffer (const SbBool enable)virtual void setSceneGraph (SoNode *root)virtual SoNode * getSceneGraph (void)
๐ Public Member Functions inherited from SoQtRenderArea ๐
The SoQtRenderArea inheritance squad, fully present and accounted for:
SoQtRenderArea (QWidget *parent=NULL, const char *name=NULL, SbBool embed=TRUE, SbBool mouseInput=TRUE, SbBool keyboardInput=TRUE)~SoQtRenderArea ()void setOverlaySceneGraph (SoNode *scene)SoNode * getOverlaySceneGraph (void)void setBackgroundColor (const SbColor &color)const SbColor & getBackgroundColor (void) constvoid setBackgroundIndex (int idx)int getBackgroundIndex (void) constvoid setOverlayBackgroundIndex (int idx)int getOverlayBackgroundIndex (void) constvoid setColorMap (int start, int num, const SbColor *colors)void setOverlayColorMap (int start, int num, const SbColor *colors)void setViewportRegion (const SbViewportRegion &newRegion)const SbViewportRegion & getViewportRegion (void) constvoid setTransparencyType (SoGLRenderAction::TransparencyType type)SoGLRenderAction::TransparencyType getTransparencyType (void) constvoid setAntialiasing (SbBool smoothing, int numPasses)void getAntialiasing (SbBool &smoothing, int &numPasses) constvoid setClearBeforeRender (SbBool enable, SbBool zbEnable=TRUE)SbBool isClearBeforeRender (void) constSbBool isClearZBufferBeforeRender (void) constvoid setClearBeforeOverlayRender (SbBool enable)SbBool isClearBeforeOverlayRender (void) constvoid setAutoRedraw (SbBool enable)SbBool isAutoRedraw (void) constvoid setRedrawPriority (uint32_t priority)uint32_t getRedrawPriority (void) constvoid render (void)void renderOverlay (void)void scheduleRedraw (void)void scheduleOverlayRedraw (void)void redrawOnSelectionChange (SoSelection *selection)void redrawOverlayOnSelectionChange (SoSelection *selection)void setEventCallback (SoQtRenderAreaEventCB *func, void *user=NULL)void setSceneManager (SoSceneManager *manager)SoSceneManager * getSceneManager (void) constvoid setOverlaySceneManager (SoSceneManager *manager)SoSceneManager * getOverlaySceneManager (void) constvoid setGLRenderAction (SoGLRenderAction *action)SoGLRenderAction * getGLRenderAction (void) constvoid setOverlayGLRenderAction (SoGLRenderAction *action)SoGLRenderAction * getOverlayGLRenderAction (void) constSbBool sendSoEvent (const SoEvent *event)void registerDevice (SoQtDevice *device)void unregisterDevice (SoQtDevice *device)
๐ Public Member Functions inherited from SoQtGLWidget ๐
GL widget inheritance, no cap:
void setBorder (const SbBool enable)SbBool isBorder (void) constSbBool isDoubleBuffer (void) constvoid setDrawToFrontBufferEnable (const SbBool enable)SbBool isDrawToFrontBufferEnable (void) constvoid setQuadBufferStereo (const SbBool enable)SbBool isQuadBufferStereo (void) constvoid setAccumulationBuffer (const SbBool enable)SbBool getAccumulationBuffer (void) constvoid setStencilBuffer (const SbBool enable)SbBool getStencilBuffer (void) constvoid setAlphaChannel (const SbBool enable)SbBool getAlphaChannel (void) constvoid setOverlayRender (const SbBool onoff)SbBool isOverlayRender (void) constvoid setSampleBuffers (const int numsamples)int getSampleBuffers (void) constvoid setStealFocus (SbBool enable)SbBool isStealFocus (void) constQWidget * getGLWidget (void) constQWidget * getNormalWidget (void) constQWidget * getOverlayWidget (void) constSbBool hasOverlayGLArea (void) constSbBool hasNormalGLArea (void) constunsigned long getOverlayTransparentPixel (void)void getPointSizeLimits (SbVec2f &range, float &granularity)void getLineWidthLimits (SbVec2f &range, float &granularity)
๐ Public Member Functions inherited from SoQtComponent ๐
Component inheritance, all here:
virtual SoType getTypeId (void) constvirtual ~SoQtComponent ()virtual void show (void)virtual void hide (void)SbBool isFullScreen (void) constSbBool setFullScreen (const SbBool onoff)SbBool isVisible (void)SbBool isTopLevelShell (void) constQWidget * getWidget (void) constQWidget * getBaseWidget (void) constQWidget * getShellWidget (void) constQWidget * getParentWidget (void) constvoid setSize (const SbVec2s size)SbVec2s getSize (void) constvoid setTitle (const char *const title)const char * getTitle (void) constvoid setIconTitle (const char *const title)const char * getIconTitle (void) constconst char * getWidgetName (void) constconst char * getClassName (void) constvoid setWindowCloseCallback (SoQtComponentCB *const func, void *const user=NULL)
โญ Public Member Functions inherited from SoQtObject โญ
SbBool isOfType (SoType type) const
๐ก๏ธ Protected Member Functions ๐ก๏ธ
These are the protected SoQtFlyViewer ones โ yes, theyโre on the list, bestie:
SoQtFlyViewer (QWidget *parent, const char *const name, SbBool embed, SoQtFullViewer::BuildFlag flag, SoQtViewer::Type type, SbBool build)virtual const char * getDefaultWidgetName (void) constvirtual const char * getDefaultTitle (void) constvirtual const char * getDefaultIconTitle (void) constvirtual SbBool processSoEvent (const SoEvent *const event)virtual void setSeekMode (SbBool enable)virtual void actualRedraw (void)virtual void rightWheelMotion (float value)virtual void afterRealizeHook (void)
๐ง Protected Member Functions inherited from SoQtConstrainedViewer ๐ง
SoQtConstrainedViewer (QWidget *parent, const char *const name, SbBool embed, SoQtFullViewer::BuildFlag flag, SoQtViewer::Type type, SbBool build)~SoQtConstrainedViewer ()virtual void tiltCamera (float delta)virtual void bottomWheelMotion (float value)virtual void leftWheelMotion (float value)virtual void changeCameraValues (SoCamera *camera)void findUpDirection (SbVec2s mouselocation)void checkForCameraUpConstrain (void)
๐ฅ Protected Member Functions inherited from SoQtFullViewer ๐ฅ
Full viewer protected inheritance, all present:
SoQtFullViewer (QWidget *parent, const char *name, SbBool embed, BuildFlag flag, Type type, SbBool build)~SoQtFullViewer ()virtual void sizeChanged (const SbVec2s &size)QWidget * buildWidget (QWidget *parent)virtual void buildDecoration (QWidget *parent)virtual QWidget * buildLeftTrim (QWidget *parent)virtual QWidget * buildBottomTrim (QWidget *parent)virtual QWidget * buildRightTrim (QWidget *parent)QWidget * buildAppButtons (QWidget *parent)QWidget * buildViewerButtons (QWidget *parent)virtual void createViewerButtons (QWidget *parent, SbPList *buttonlist)virtual void buildPopupMenu (void)virtual void setPopupMenuString (const char *title)virtual void openPopupMenu (const SbVec2s position)virtual void leftWheelStart (void)virtual void leftWheelFinish (void)float getLeftWheelValue (void) constvoid setLeftWheelValue (const float value)virtual void bottomWheelStart (void)virtual void bottomWheelFinish (void)float getBottomWheelValue (void) constvoid setBottomWheelValue (const float value)virtual void rightWheelStart (void)virtual void rightWheelFinish (void)float getRightWheelValue (void) constvoid setRightWheelValue (const float value)void setLeftWheelString (const char *const name)QWidget * getLeftWheelLabelWidget (void) constvoid setBottomWheelString (const char *const name)QWidget * getBottomWheelLabelWidget (void) constvoid setRightWheelString (const char *const name)const char * getRightWheelString () constQWidget * getRightWheelLabelWidget (void) const
๐ซถ Protected Member Functions inherited from SoQtViewer
Okay so these are the protected members you get handed down from SoQtViewer, bestie โ they're lowkey the whole toolkit for making the camera do your bidding:
SoQtViewer (QWidget *parent, const char *name, SbBool embed, Type type, SbBool build)~SoQtViewer ()SbBool isSeekMode (void) constSbBool seekToPoint (const SbVec2s screenpos)void seekToPoint (const SbVec3f &scenepos)virtual void computeSeekFinalOrientation (void)void interactiveCountInc (void)void interactiveCountDec (void)int getInteractiveCount (void) constvoid setSeekDistance (const float distance)float getSeekDistance (void) constvoid setSeekValueAsPercentage (const SbBool on)SbBool isSeekValuePercentage (void) constvoid addSuperimposition (SoNode *scene)void removeSuperimposition (SoNode *scene)void setSuperimpositionEnabled (SoNode *scene, const SbBool enable)SbBool getSuperimpositionEnabled (SoNode *scene) const
โจ Protected Member Functions inherited from SoQtRenderArea โจ
And here's what SoQtRenderArea passes down โ the redraw-y, event-y, widget-y stuff โจ:
SoQtRenderArea (QWidget *parent, const char *name, SbBool embed, SbBool mouseInput, SbBool keyboardInput, SbBool build)virtual void redraw (void)virtual void redrawOverlay (void)virtual void actualOverlayRedraw (void)virtual void processEvent (QEvent *event)virtual void initGraphic (void)virtual void initOverlayGraphic (void)virtual void widgetChanged (QWidget *widget)QWidget * buildWidget (QWidget *parent)virtual SbBool glScheduleRedraw (void)
๐ Protected Member Functions inherited from SoQtGLWidget ๐
The GL widget's protected goodies โ sizes, buffers, and the lock/unlock dance ๐ :
SoQtGLWidget (QWidget *const parent=NULL, const char *const name=NULL, const SbBool embed=TRUE, const int glmodes=SO_GL_RGB, const SbBool build=TRUE)~SoQtGLWidget ()QWidget * buildWidget (QWidget *parent)void setGLSize (const SbVec2s size)SbVec2s getGLSize (void) constfloat getGLAspectRatio (void) constvoid setGlxSize (const SbVec2s size)SbVec2s getGlxSize (void) constfloat getGlxAspectRatio (void) constvoid setStereoBuffer (SbBool flag)SbBool isStereoBuffer (void) constSbBool isRGBMode (void)void glLockNormal (void)void glUnlockNormal (void)void glLockOverlay (void)void glUnlockOverlay (void)void glSwapBuffers (void)void glFlushBuffer (void)
๐ธ Protected Member Functions inherited from SoQtComponent ๐ธ
Component-level protected stuff โ class names, base widgets, and visibility callbacks, iykyk:
SoQtComponent (QWidget *const parent=NULL, const char *const name=NULL, const SbBool embed=TRUE)void setClassName (const char *const name)void setBaseWidget (QWidget *widget)void registerWidget (QWidget *widget)void unregisterWidget (QWidget *widget)void addVisibilityChangeCallback (SoQtComponentVisibilityCB *const func, void *const user=NULL)void removeVisibilityChangeCallback (SoQtComponentVisibilityCB *const func, void *const user=NULL)
๐ Additional Inherited Members ๐
๐ Public Types inherited from SoQtFullViewer
enum BuildFlag { BUILD_NONE = 0x00, BUILD_DECORATION = 0x01, BUILD_POPUP = 0x02, BUILD_ALL = (BUILD_DECORATION | BUILD_POPUP) }
๐ฆ Public Types inherited from SoQtViewer
enum Type { BROWSER, EDITOR }enum DrawStyle { VIEW_AS_IS, VIEW_HIDDEN_LINE, VIEW_NO_TEXTURE, VIEW_LOW_COMPLEXITY, VIEW_LINE, VIEW_POINT, VIEW_BBOX, VIEW_LOW_RES_LINE, VIEW_LOW_RES_POINT, VIEW_SAME_AS_STILL, VIEW_WIREFRAME_OVERLAY }enum DrawType { STILL = 0, INTERACTIVE }enum BufferType { BUFFER_SINGLE, BUFFER_DOUBLE, BUFFER_INTERACTIVE }enum AutoClippingStrategy { VARIABLE_NEAR_PLANE, CONSTANT_NEAR_PLANE }enum StereoType { STEREO_NONE, STEREO_ANAGLYPH, STEREO_QUADBUFFER, STEREO_INTERLEAVED_ROWS, STEREO_INTERLEAVED_COLUMNS }
โญ Static Public Member Functions inherited from SoQtRenderArea
static uint32_t getDefaultRedrawPriority (void)
๐ Static Public Member Functions inherited from SoQtComponent
static void initClass (void)static SoType getClassTypeId (void)static void setWidgetCursor (QWidget *w, const SoQtCursor &cursor)static SoQtComponent * getComponent (QWidget *widget)static void initClasses (void)
๐ซ Static Public Member Functions inherited from SoQtObject
static void initClass (void)static SoType getClassTypeId (void)static void init (void)
๐ Protected Attributes inherited from SoQtFullViewer
These are the wheel/decorations attributes, and ngl they're giving "trust me bro, it's internal" energy โ but they're all here, no cap:
QWidget * leftWheelQWidget * rightWheelQWidget * bottomWheelQWidget * leftDecorationQWidget * rightDecorationQWidget * bottomDecorationQWidget * leftWheelLabelchar * leftWheelStrfloat leftWheelValQWidget * rightWheelLabelchar * rightWheelStrfloat rightWheelValQWidget * bottomWheelLabelchar * bottomWheelStrfloat bottomWheelValSoQtPopupMenu * prefmenu
๐ฅ Protected Attributes inherited from SoQtGLWidget
SbBool waitForExposeSbBool drawToFrontBuffer
๐ Detailed Description ๐
So, the SoQtFlyViewer class? It's literally the whole "fly the camera around" vibe โ it implements the controls for moving the camera in a flying motion. Main character energy for your viewpoint, fr fr.
๐ฎ Controls:
- Left mouse button increases the speed.
- Middle mouse button decreases the speed.
- Left and middle mouse button together sets the speed to zero.
- "s" puts the viewer in seek mode. Click some geometry with the left mouse button to start the seek zoom animation. (Hitting
"s"again before clicking will cancel the seek operation.) - "u" puts the viewer in up-vector pick mode. Click some geometry with the left mouse button to set the camera's up-vector to the normal vector of the face you pick. (Hitting
"u"again before clicking will cancel the pick operation.) - The control key stops the flying and lets you tilt the camera by moving the pointer.
๐ฌ Constructor & Destructor Documentation ๐ฌ
๐ SoQtFlyViewer::SoQtFlyViewer
SoQtFlyViewer::SoQtFlyViewer (QWidget * parent = NULL, const char * name =
NULL, SbBool embed = TRUE, SoQtFullViewer::BuildFlag flag = BUILD_ALL,
SoQtViewer::Type type = BROWSER)
Public constructor. Slay, you made one โจ
๐ SoQtFlyViewer::~SoQtFlyViewer
SoQtFlyViewer::~SoQtFlyViewer ()
Virtual constructor (yes bestie, the destructor is called "virtual constructor" here โ that's just how the page says it ๐).
๐ SoQtFlyViewer::SoQtFlyViewer (protected)
SoQtFlyViewer::SoQtFlyViewer (QWidget * parent, const char *const name,
SbBool embed, SoQtFullViewer::BuildFlag flag, SoQtViewer::Type type,
SbBool build) [protected]
Protected constructor, used by viewer components derived from the SoQtFlyViewer. Lowkey the "for subclasses only" door ๐ช
๐ Member Function Documentation ๐
๐ฆ void SoQtFlyViewer::setViewing (SbBool enable) [virtual]
Set view mode.
If the view mode is on, user events will be caught and used to influence the camera position / orientation. If view mode is off, all events in the viewer canvas (like for instance keypresses or mouse clicks and -movements) will be passed along to the scene graph.
Default is to have the view mode active. So yeah, the viewer's driving unless you tell it to chill ๐
See also: isViewing()
Reimplemented from SoQtFullViewer.
๐ฆ void SoQtFlyViewer::viewAll (void) [virtual]
Reposition the current camera so we can see the complete scene. Basically the "okay everyone get in frame" button ๐ธ
Reimplemented from SoQtViewer.
๐ฆ void SoQtFlyViewer::resetToHomePosition (void) [virtual]
Restore the saved camera settings. Home sweet home ๐ โจ
See also: saveHomePosition()
Reimplemented from SoQtConstrainedViewer.
๐ฆ void SoQtFlyViewer::setCamera (SoCamera * cam) [virtual]
Set the camera we want the viewer to manipulate when interacting with the viewer controls.
โ ๏ธ Okay important, bestie: the camera passed in as an argument to this method must already be part of the viewer's scene graph. You do not inject viewpoint cameras to the viewer with this method.
You should rather insert a camera into the scene graph first (if necessary, often one will be present already), then register it as the camera used by the viewer controls with this method.
If the application code doesn't explicitly set up a camera through this method, the viewer will automatically scan through the scene graph to find a camera to use. If no camera is available in the scene graph at all, it will set up its own camera. Iconic self-sufficiency behavior ๐
See also: getCamera()
Reimplemented from SoQtConstrainedViewer.
๐ฆ void SoQtFlyViewer::setCursorEnabled (SbBool on) [virtual]
Set whether or not the mouse cursor representation should be visible in the viewer canvas.
Default value is on. Cursor stays visible unless you say otherwise, periodt.
See also: isCursorEnabled()
Reimplemented from SoQtViewer.
๐ฆ void SoQtFlyViewer::setCameraType (SoType t) [virtual]
When the viewer has to make its own camera as a result of the graph passed to setSceneGraph() not containing any camera nodes, this call can be made in advance to decide which type the camera will be of.
Default is to use an SoPerspectiveCamera. ๐ฅ
If this method is called when there is a scene graph and a camera already set up, it will delete the old camera and set up a camera with the new type if the t type is different from that of the current camera. So yeah, it'll swap it out on you โ that's the deal ๐
See also: getCameraType()
Reimplemented from SoQtViewer.
๐ฆ const char * SoQtFlyViewer::getDefaultWidgetName (void) const [protected], [virtual]
This method returns the default name of a component widget class.
It should be overridden by derived non-abstract classes for the topmost widget in the component to have a proper name. (Translation: if you're making your own widget class, do your homework and override this ๐ซถ)
Reimplemented from SoQtRenderArea.
๐ฆ const char * SoQtFlyViewer::getDefaultTitle (void) const [protected], [virtual]
This method returns the default window caption string of the component.
It should be overridden by derived non-abstract classes so the window and pop-up menu will get a proper title. Nobody wants a window called "Untitled 37", bestie ๐ญ
Reimplemented from SoQtRenderArea.
๐ฆ const char * SoQtFlyViewer::getDefaultIconTitle (void) const [protected], [virtual]
This method returns the default icon title of the component.
It should be overridden by derived non-abstract classes so icons will get proper titles. Same deal as above, just for the tiny icon version ๐
Reimplemented from SoQtRenderArea.
๐ฆ SbBool SoQtFlyViewer::processSoEvent (const SoEvent *const event) [protected], [virtual]
Toolkit-native events are tried to convert to Coin-generic events in the SoQtRenderArea::processEvent() method. If this succeeds, they are forwarded to this method.
This is a virtual method, and is overridden in its subclasses to catch events of particular interest to the viewer classes, for instance.
๐ฅ Return TRUE if the event was processed. If not it should be passed on further up in the inheritance hierarchy by the caller. This last point is extremely important to take note of if you are expanding the toolkit with your own viewer class. Like, do not skip this, fr fr.
This method is not part of the original SGI InventorXt API. Note that you can still override the toolkit-native processEvent() method instead of this "generic" method. Choose your fighter ๐
Reimplemented from SoQtFullViewer.
๐ฆ void SoQtFlyViewer::setSeekMode (SbBool enable) [protected], [virtual]
Put the viewer in or out of "waiting-to-seek" mode.
If the user performs a mouse button click when the viewer is in "waiting-to-seek" mode, the camera will be repositioned so the camera focal point lies on the point of the geometry under the mouse cursor. Point, click, zoom, slay ๐ฏโจ
See also:isSeekMode(),setDetailSeek()
Reimplemented from SoQtViewer.
void SoQtFlyViewer::actualRedraw (void ) [protected], [virtual] โ โจ the instantly-redraw main-character method ๐
Okay so this method instantly redraws the normal (non-overlay) scene graph by calling SoSceneManager::render(). Iconic behavior, no cap.
Subclasses may override this method to add their own rendering before or after Coin renders its scene graph. Bestie, that's your moment to shine โจ
The following is a complete example that demonstrates one way of adding both a background image and foreground (overlay) geometry to the "normal" rendering:
// This example shows how to put a permanent background image on
// your viewer canvas, below the 3D graphics, plus overlay
// foreground geometry. Written by mortene.
// Copyright Kongsberg Oil & Gas Technologies 2002.
// *************************************************************************
#include <Inventor/Qt/SoQt.h>
#include <Inventor/Qt/viewers/SoQtExaminerViewer.h>
#include <Inventor/nodes/SoBaseColor.h>
#include <Inventor/nodes/SoCone.h>
#include <Inventor/nodes/SoCube.h>
#include <Inventor/nodes/SoImage.h>
#include <Inventor/nodes/SoLightModel.h>
#include <Inventor/nodes/SoOrthographicCamera.h>
#include <Inventor/nodes/SoRotationXYZ.h>
#include <Inventor/nodes/SoSeparator.h>
#include <Inventor/nodes/SoTranslation.h>
#include <GL/gl.h>
// *************************************************************************
class MyExaminerViewer : public SoQtExaminerViewer {
public:
MyExaminerViewer(QWidget* parent, const char * filename);
~MyExaminerViewer();
protected:
virtual void actualRedraw(void);
private:
SoSeparator * bckgroundroot;
SoSeparator * foregroundroot;
SoRotationXYZ * arrowrotation;
};
MyExaminerViewer::MyExaminerViewer(QWidget* parent, const char * filename)
: SoQtExaminerViewer(parent)
{
// Coin should not clear the pixel-buffer, so the background image
// is not removed.
this->setClearBeforeRender(FALSE, TRUE);
// Set up background scene graph with image in it.
this->bckgroundroot = new SoSeparator;
this->bckgroundroot->ref();
SoOrthographicCamera * cam = new SoOrthographicCamera;
cam->position = SbVec3f(0, 0, 1);
cam->height = 1;
// SoImage will be at z==0.0.
cam->nearDistance = 0.5;
cam->farDistance = 1.5;
SoImage * img = new SoImage;
img->vertAlignment = SoImage::HALF;
img->horAlignment = SoImage::CENTER;
img->filename = filename;
this->bckgroundroot->addChild(cam);
this->bckgroundroot->addChild(img);
// Set up foreground, overlaid scene graph.
this->foregroundroot = new SoSeparator;
this->foregroundroot->ref();
SoLightModel * lm = new SoLightModel;
lm->model = SoLightModel::BASE_COLOR;
SoBaseColor * bc = new SoBaseColor;
bc->rgb = SbColor(1, 1, 0);
cam = new SoOrthographicCamera;
cam->position = SbVec3f(0, 0, 5);
cam->height = 10;
cam->nearDistance = 0;
cam->farDistance = 10;
const double ARROWSIZE = 2.0;
SoTranslation * posit = new SoTranslation;
posit->translation = SbVec3f(-2.5 * ARROWSIZE, 1.5 * ARROWSIZE, 0);
arrowrotation = new SoRotationXYZ;
arrowrotation->axis = SoRotationXYZ::Z;
SoTranslation * offset = new SoTranslation;
offset->translation = SbVec3f(ARROWSIZE/2.0, 0, 0);
SoCube * cube = new SoCube;
cube->width = ARROWSIZE;
cube->height = ARROWSIZE/15.0;
this->foregroundroot->addChild(cam);
this->foregroundroot->addChild(lm);
this->foregroundroot->addChild(bc);
this->foregroundroot->addChild(posit);
this->foregroundroot->addChild(arrowrotation);
this->foregroundroot->addChild(offset);
this->foregroundroot->addChild(cube);
}
MyExaminerViewer::~MyExaminerViewer()
{
this->bckgroundroot->unref();
this->foregroundroot->unref();
}
void
MyExaminerViewer::actualRedraw(void)
{
// Must set up the OpenGL viewport manually, as upon resize
// operations, Coin won't set it up until the SoGLRenderAction is
// applied again. And since we need to do glClear() before applying
// the action..
const SbViewportRegion vp = this->getViewportRegion();
SbVec2s origin = vp.getViewportOriginPixels();
SbVec2s size = vp.getViewportSizePixels();
glViewport(origin[0], origin[1], size[0], size[1]);
const SbColor col = this->getBackgroundColor();
glClearColor(col[0], col[1], col[2], 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Render our scene graph with the image.
SoGLRenderAction * glra = this->getGLRenderAction();
glra->apply(this->bckgroundroot);
// Render normal scene graph.
SoQtExaminerViewer::actualRedraw();
// Increase arrow angle with 1/1000 degrees every frame.
arrowrotation->angle = arrowrotation->angle.getValue() + (0.001 / M_PI * 180);
// Render overlay front scene graph.
glClear(GL_DEPTH_BUFFER_BIT);
glra->apply(this->foregroundroot);
}
// *************************************************************************
int
main(int argc, char ** argv)
{
if (argc != 2) {
(void)fprintf(stderr, "\n\n\tUsage: %s <image-filename>\n\n", argv[0]);
exit(1);
}
QWidget* window = SoQt::init(argv[0]);
MyExaminerViewer * viewer = new MyExaminerViewer(window, argv[1]);
viewer->setSceneGraph(new SoCone);
viewer->show();
SoQt::show(window);
SoQt::mainLoop();
delete viewer;
return 0;
}
// *************************************************************************
Reimplemented from SoQtViewer.
void SoQtFlyViewer::rightWheelMotion (float value) [protected], [virtual] โ ๐ก thumbwheel go brrr
Called repeatedly as the user drags the thumbwheel in the right frame. Override this method in subclassed viewers to provide your own functionality on the thumbwheel. Slay, custom behavior ๐
See also:rightWheelStart(),rightWheelFinish()โ and alsoleftWheelStart(),bottomWheelStart()๐ซถ
Reimplemented from SoQtFullViewer.
void SoQtFlyViewer::afterRealizeHook (void ) [protected], [virtual] โ ๐ธ the just-after-realized hook
A function "hook" / callback invoked just after the window for the component has been realized. Like, the window just became a whole real thing, and this fires right after โจ
Override this if you need specific initialization for your own component or viewer class to happen right after it has been made visible, but remember to call upwards in the inheritance hierarchy:
void
MyLittleViewer::afterRealizeHook(void)
{
<superclass>::afterRealizeHook();
// [own initialization here]
}
Reimplemented from SoQtRenderArea.
โจ Author โจ
Generated automatically by Doxygen for SoQt from the source code. Very demure, very automatic ๐
๐ That's the whole vibe, bestie! Cute little sign-off: source/version 1.6.2, date Sat Jan 6 2024 12:20:55, page SoQtFlyViewer(3). Byeeee! ๐โจ
๐ฆ where this page comes from
- opensuse-leap 16.0: SoQt-devel 1.6.2-bp160.1.13 ยท BSD-3-Clause
- opensuse-leap 16.0: SoQt-devel 1.6.2-bp160.1.13 ยท BSD-3-Clause
- opensuse-leap 16.0: SoQt-devel 1.6.2-bp160.1.13 ยท BSD-3-Clause
- opensuse-leap 16.0: SoQt-devel 1.6.2-bp160.1.13 ยท BSD-3-Clause
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms