FXGLViewer.h

Go to the documentation of this file.
00001 /********************************************************************************
00002 *                                                                               *
00003 *                      O p e n G L   V i e w e r   W i d g e t                  *
00004 *                                                                               *
00005 *********************************************************************************
00006 * Copyright (C) 1997,2006 by Jeroen van der Zijp.   All Rights Reserved.        *
00007 *********************************************************************************
00008 * This library is free software; you can redistribute it and/or                 *
00009 * modify it under the terms of the GNU Lesser General Public                    *
00010 * License as published by the Free Software Foundation; either                  *
00011 * version 2.1 of the License, or (at your option) any later version.            *
00012 *                                                                               *
00013 * This library is distributed in the hope that it will be useful,               *
00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of                *
00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU             *
00016 * Lesser General Public License for more details.                               *
00017 *                                                                               *
00018 * You should have received a copy of the GNU Lesser General Public              *
00019 * License along with this library; if not, write to the Free Software           *
00020 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA.    *
00021 *********************************************************************************
00022 * $Id: FXGLViewer.h,v 1.74 2006/01/22 17:58:04 fox Exp $                        *
00023 ********************************************************************************/
00024 #ifndef FX_DISABLEGL
00025 
00026 #if FX_GRAPHINGMODULE
00027 
00028 #ifndef FXGLVIEWER_H
00029 #define FXGLVIEWER_H
00030 
00031 #ifndef FXGLCANVAS_H
00032 #include "FXGLCanvas.h"
00033 #endif
00034 #ifndef FXGLOBJECT_H
00035 #include "FXGLObject.h"
00036 #endif
00037 #include "FXVec3f.h"
00038 #include "FXVec4f.h"
00039 #include "FXQuatf.h"
00040 #include "FXMat4f.h"
00041 #include "FXRangef.h"
00042 
00043 namespace FX {
00044 
00045 
00046 class FXDCPrint;
00047 class FXGLObject;
00048 class FXGLVisual;
00049 
00050 
00051 // GL Viewer options
00052 enum {
00053   VIEWER_LIGHTING = 0x00008000,    
00054   VIEWER_FOG      = 0x00010000,    
00055   VIEWER_DITHER   = 0x00020000,    
00056   VIEWER_ANTIALIAS= 0x00040000,    
00057   VIEWER_SMOOTH   = 0x00080000,    
00058   VIEWER_LEFTZOOMS= 0x00100000     
00059   };
00060 
00061 
00062 /*******************************  Viewer  Structs  *****************************/
00063 
00064 
00066 struct FXViewport {
00067   FXint      w,h;               // Viewport dimensions
00068   FXdouble   left,right;        // World box
00069   FXdouble   bottom,top;
00070   FXdouble   hither,yon;
00071   };
00072 
00073 
00074 // OpenGL Light Source
00075 struct FXGRAPHINGMODULEAPI FXLight {
00076   FXGLColor  ambient;           // Ambient light color
00077   FXGLColor  diffuse;           // Diffuse light color
00078   FXGLColor  specular;          // Specular light color
00079   FXVec4f    position;          // Light position
00080   FXVec3f    direction;         // Spot direction
00081   FXfloat    exponent;          // Spotlight exponent
00082   FXfloat    cutoff;            // Spotlight cutoff angle
00083   FXfloat    c_attn;            // Constant attenuation factor
00084   FXfloat    l_attn;            // Linear attenuation factor
00085   FXfloat    q_attn;            // Quadratic attenuation factor
00086   };
00087 
00088 
00089 // OpenGL Material Description
00090 struct FXGRAPHINGMODULEAPI FXMaterial {
00091   FXGLColor  ambient;           // Ambient material color
00092   FXGLColor  diffuse;           // Diffuse material color
00093   FXGLColor  specular;          // Specular material color
00094   FXGLColor  emission;          // Emissive material color
00095   FXfloat    shininess;         // Specular shininess
00096   };
00097 
00098 
00099 // Feedback buffer sort routine
00100 typedef FXbool (*FXZSortFunc)(FXfloat*& buffer,FXint& used,FXint& size);
00101 
00102 
00103 /********************************  Viewer  Class  ******************************/
00104 
00105 
00107 class FXGRAPHINGMODULEAPI FXGLViewer : public FXGLCanvas {
00108   FXDECLARE(FXGLViewer)
00109   friend class FXGLObject;
00110 protected:
00111   FXViewport      wvt;              // Window viewport transform
00112   FXMat4f         transform;        // Current transformation matrix
00113   FXMat4f         itransform;       // Inverse of current transformation matrix
00114   FXuint          projection;       // Projection mode
00115   FXQuatf         rotation;         // Viewer orientation
00116   FXdouble        fov;              // Field of view
00117   FXdouble        zoom;             // Zoom factor
00118   FXVec3f         center;           // Model center
00119   FXVec3f         scale;            // Model scale
00120   FXdouble        worldpx;          // Pixel size in world
00121   FXdouble        modelpx;          // Pixel size in model
00122   FXint           maxhits;          // Maximum number of hits
00123   FXdouble        ax,ay;            // Quick view->world coordinate mapping
00124   FXdouble        diameter;         // Size of model diameter ( always > 0)
00125   FXdouble        distance;         // Distance of PRP to target
00126   FXGLColor       background[2];    // Background colors
00127   FXGLColor       ambient;          // Global ambient light
00128   FXLight         light;            // Light source
00129   FXMaterial      material;         // Base material properties
00130   FXint           dial[3];          // Dial positions
00131   FXString        help;             // Status help
00132   FXString        tip;              // Tooltip for background
00133   FXGLObject     *dropped;          // Object being dropped on
00134   FXGLObject     *selection;        // Current object
00135   FXZSortFunc     zsortfunc;        // Routine to sort feedback buffer
00136   FXGLObject     *scene;            // What we're looking at
00137   FXbool          doesturbo;        // Doing turbo mode
00138   FXbool          turbomode;        // Turbo mode
00139   FXuchar         mode;             // Mode the widget is in
00140 public:
00141 
00142   // Common DND types
00143   static FXDragType objectType;     // GL Object type
00144 
00145 protected:
00146 
00147   // Mouse actions when in viewing window
00148   enum {
00149     HOVERING,                       // Hovering mouse w/o doing anything
00150     PICKING,                        // Pick mode
00151     ROTATING,                       // Rotating camera around target
00152     POSTING,                        // Posting right-mouse menu
00153     TRANSLATING,                    // Translating camera
00154     ZOOMING,                        // Zooming
00155     FOVING,                         // Change field-of-view
00156     DRAGGING,                       // Dragging objects
00157     TRUCKING,                       // Trucking camera
00158     GYRATING,                       // Rotation of camera around eye
00159     DO_LASSOSELECT,                 // Lasso select when mouse pressed
00160     LASSOSELECT,                    // Anchor of lasso rectangle
00161     DO_LASSOZOOM,                   // Zoom when mouse pressed
00162     LASSOZOOM                       // Zoom rectangle
00163     };
00164 
00165 protected:
00166   FXGLViewer();
00167   void glsetup();
00168   virtual void updateProjection();
00169   virtual void updateTransform();
00170   FXVec3f spherePoint(FXint px,FXint py);
00171   FXQuatf turn(FXint fx,FXint fy,FXint tx,FXint ty);
00172   void drawWorld(FXViewport& wv);
00173   void drawAnti(FXViewport& wv);
00174   void drawLasso(FXint x0,FXint y0,FXint x1,FXint y1);
00175   FXint selectHits(FXuint*& hits,FXint& nhits,FXint x,FXint y,FXint w,FXint h);
00176   FXint renderFeedback(FXfloat *buffer,FXint x,FXint y,FXint w,FXint h,FXint maxbuffer);
00177   void drawFeedback(FXDCPrint& pdc,const FXfloat* buffer,FXint used);
00178   virtual FXGLObject* processHits(FXuint *pickbuffer,FXint nhits);
00179   void setOp(FXuint o);
00180 private:
00181   FXGLViewer(const FXGLViewer&);
00182   FXGLViewer &operator=(const FXGLViewer&);
00183   void initialize();
00184 public:
00185 
00186   // Events
00187   long onPaint(FXObject*,FXSelector,void*);
00188   long onEnter(FXObject*,FXSelector,void*);
00189   long onLeave(FXObject*,FXSelector,void*);
00190   long onMotion(FXObject*,FXSelector,void*);
00191   long onMouseWheel(FXObject*,FXSelector,void*);
00192   long onChanged(FXObject*,FXSelector,void*);
00193   long onPick(FXObject*,FXSelector,void*);
00194   long onClicked(FXObject*,FXSelector,void*);
00195   long onDoubleClicked(FXObject*,FXSelector,void*);
00196   long onTripleClicked(FXObject*,FXSelector,void*);
00197   long onLassoed(FXObject*,FXSelector,void*);
00198   long onSelected(FXObject*,FXSelector,void*);
00199   long onDeselected(FXObject*,FXSelector,void*);
00200   long onInserted(FXObject*,FXSelector,void*);
00201   long onDeleted(FXObject*,FXSelector,void*);
00202   long onLeftBtnPress(FXObject*,FXSelector,void*);
00203   long onLeftBtnRelease(FXObject*,FXSelector,void*);
00204   long onMiddleBtnPress(FXObject*,FXSelector,void*);
00205   long onMiddleBtnRelease(FXObject*,FXSelector,void*);
00206   long onRightBtnPress(FXObject*,FXSelector,void*);
00207   long onRightBtnRelease(FXObject*,FXSelector,void*);
00208   long onUngrabbed(FXObject*,FXSelector,void*);
00209   long onKeyPress(FXObject*,FXSelector,void*);
00210   long onKeyRelease(FXObject*,FXSelector,void*);
00211   long onFocusIn(FXObject*,FXSelector,void*);
00212   long onFocusOut(FXObject*,FXSelector,void*);
00213   long onClipboardLost(FXObject*,FXSelector,void*);
00214   long onClipboardGained(FXObject*,FXSelector,void*);
00215   long onClipboardRequest(FXObject*,FXSelector,void*);
00216 
00217   // Commands
00218   long onCmdPerspective(FXObject*,FXSelector,void*);
00219   long onUpdPerspective(FXObject*,FXSelector,void*);
00220   long onCmdParallel(FXObject*,FXSelector,void*);
00221   long onUpdParallel(FXObject*,FXSelector,void*);
00222   long onCmdFront(FXObject*,FXSelector,void*);
00223   long onUpdFront(FXObject*,FXSelector,void*);
00224   long onCmdBack(FXObject*,FXSelector,void*);
00225   long onUpdBack(FXObject*,FXSelector,void*);
00226   long onCmdLeft(FXObject*,FXSelector,void*);
00227   long onUpdLeft(FXObject*,FXSelector,void*);
00228   long onCmdRight(FXObject*,FXSelector,void*);
00229   long onUpdRight(FXObject*,FXSelector,void*);
00230   long onCmdTop(FXObject*,FXSelector,void*);
00231   long onUpdTop(FXObject*,FXSelector,void*);
00232   long onCmdBottom(FXObject*,FXSelector,void*);
00233   long onUpdBottom(FXObject*,FXSelector,void*);
00234   long onCmdResetView(FXObject*,FXSelector,void*);
00235   long onCmdFitView(FXObject*,FXSelector,void*);
00236   long onDNDEnter(FXObject*,FXSelector,void*);
00237   long onDNDLeave(FXObject*,FXSelector,void*);
00238   long onDNDMotion(FXObject*,FXSelector,void*);
00239   long onDNDDrop(FXObject*,FXSelector,void*);
00240   long onTipTimer(FXObject*,FXSelector,void*);
00241   long onCmdXYZDial(FXObject*,FXSelector,void*);
00242   long onUpdXYZDial(FXObject*,FXSelector,void*);
00243   long onCmdRollPitchYaw(FXObject*,FXSelector,void*);
00244   long onUpdRollPitchYaw(FXObject*,FXSelector,void*);
00245   long onCmdXYZScale(FXObject*,FXSelector,void*);
00246   long onUpdXYZScale(FXObject*,FXSelector,void*);
00247   long onUpdCurrent(FXObject*,FXSelector,void*);
00248   long onCmdCutSel(FXObject*,FXSelector,void*);
00249   long onCmdCopySel(FXObject*,FXSelector,void*);
00250   long onCmdPasteSel(FXObject*,FXSelector,void*);
00251   long onCmdDeleteSel(FXObject*,FXSelector,void*);
00252   long onUpdDeleteSel(FXObject*,FXSelector,void*);
00253   long onCmdBackColor(FXObject*,FXSelector,void*);
00254   long onUpdBackColor(FXObject*,FXSelector,void*);
00255   long onCmdGradientBackColor(FXObject*,FXSelector,void*);
00256   long onUpdGradientBackColor(FXObject*,FXSelector,void*);
00257   long onCmdAmbientColor(FXObject*,FXSelector,void*);
00258   long onUpdAmbientColor(FXObject*,FXSelector,void*);
00259   long onCmdLighting(FXObject*,FXSelector,void*);
00260   long onUpdLighting(FXObject*,FXSelector,void*);
00261   long onCmdFog(FXObject*,FXSelector,void*);
00262   long onUpdFog(FXObject*,FXSelector,void*);
00263   long onCmdDither(FXObject*,FXSelector,void*);
00264   long onUpdDither(FXObject*,FXSelector,void*);
00265   long onCmdFov(FXObject*,FXSelector,void*);
00266   long onUpdFov(FXObject*,FXSelector,void*);
00267   long onCmdZoom(FXObject*,FXSelector,void*);
00268   long onUpdZoom(FXObject*,FXSelector,void*);
00269   long onCmdLightAmbient(FXObject*,FXSelector,void*);
00270   long onUpdLightAmbient(FXObject*,FXSelector,void*);
00271   long onCmdLightDiffuse(FXObject*,FXSelector,void*);
00272   long onUpdLightDiffuse(FXObject*,FXSelector,void*);
00273   long onCmdLightSpecular(FXObject*,FXSelector,void*);
00274   long onUpdLightSpecular(FXObject*,FXSelector,void*);
00275   long onCmdTurbo(FXObject*,FXSelector,void*);
00276   long onUpdTurbo(FXObject*,FXSelector,void*);
00277   long onCmdPrintImage(FXObject*,FXSelector,void*);
00278   long onCmdPrintVector(FXObject*,FXSelector,void*);
00279   long onCmdLassoZoom(FXObject*,FXSelector,void*);
00280   long onCmdLassoSelect(FXObject*,FXSelector,void*);
00281   long onQueryHelp(FXObject*,FXSelector,void*);
00282   long onQueryTip(FXObject*,FXSelector,void*);
00283   virtual long onDefault(FXObject*,FXSelector,void*);
00284 
00285 public:
00286 
00287   // Projection modes
00288   enum {
00289     PARALLEL,         // Parallel projection
00290     PERSPECTIVE       // Perspective projection
00291     };
00292 
00293   // Messages
00294   enum {
00295     ID_PERSPECTIVE=FXGLCanvas::ID_LAST,
00296     ID_PARALLEL,
00297     ID_FRONT,
00298     ID_BACK,
00299     ID_LEFT,
00300     ID_RIGHT,
00301     ID_TOP,
00302     ID_BOTTOM,
00303     ID_RESETVIEW,
00304     ID_FITVIEW,
00305     ID_TOP_COLOR,
00306     ID_BOTTOM_COLOR,
00307     ID_BACK_COLOR,
00308     ID_AMBIENT_COLOR,
00309     ID_LIGHT_AMBIENT,
00310     ID_LIGHT_DIFFUSE,
00311     ID_LIGHT_SPECULAR,
00312     ID_LIGHTING,
00313     ID_TURBO,
00314     ID_FOG,
00315     ID_DITHER,
00316     ID_SCALE_X,
00317     ID_SCALE_Y,
00318     ID_SCALE_Z,
00319     ID_DIAL_X,
00320     ID_DIAL_Y,
00321     ID_DIAL_Z,
00322     ID_ROLL,
00323     ID_PITCH,
00324     ID_YAW,
00325     ID_FOV,
00326     ID_ZOOM,
00327     ID_CUT_SEL,
00328     ID_COPY_SEL,
00329     ID_PASTE_SEL,
00330     ID_DELETE_SEL,
00331     ID_PRINT_IMAGE,
00332     ID_PRINT_VECTOR,
00333     ID_LASSO_ZOOM,
00334     ID_LASSO_SELECT,
00335     ID_LAST
00336     };
00337 
00338 public:
00339 
00340   // Common DND type names
00341   static const FXchar *objectTypeName;
00342 
00343 public:
00344 
00346   FXGLViewer(FXComposite* p,FXGLVisual *vis,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0);
00347 
00349   FXGLViewer(FXComposite* p,FXGLVisual *vis,FXGLViewer* sharegroup,FXObject* tgt=NULL,FXSelector sel=0,FXuint opts=0,FXint x=0,FXint y=0,FXint w=0,FXint h=0);
00350 
00352   virtual void create();
00353 
00355   virtual void detach();
00356 
00358   virtual void layout();
00359 
00361   FXdouble worldPix() const { return worldpx; }
00362 
00364   FXdouble modelPix() const { return modelpx; }
00365 
00367   FXGLObject** lasso(FXint x1,FXint y1,FXint x2,FXint y2);
00368 
00370   virtual FXGLObject** select(FXint x,FXint y,FXint w,FXint h);
00371 
00373   virtual FXGLObject* pick(FXint x,FXint y);
00374 
00376   virtual FXbool setBounds(const FXRangef& box);
00377 
00379   FXbool fitToBounds(const FXRangef& box);
00380 
00382   void getViewport(FXViewport& v) const;
00383 
00385   void eyeToScreen(FXint& sx,FXint& sy,FXVec3f e);
00386 
00388   FXVec3f screenToEye(FXint sx,FXint sy,FXfloat eyez=0.0);
00389 
00391   FXVec3f screenToTarget(FXint sx,FXint sy);
00392 
00394   FXVec3f worldToEye(FXVec3f w);
00395 
00397   FXfloat worldToEyeZ(FXVec3f w);
00398 
00400   FXVec3f eyeToWorld(FXVec3f e);
00401 
00403   FXVec3f worldVector(FXint fx,FXint fy,FXint tx,FXint ty);
00404 
00406   void setMaterial(const FXMaterial &mtl);
00407 
00409   void getMaterial(FXMaterial &mtl) const;
00410 
00412   void setFieldOfView(FXdouble fv);
00413 
00415   FXdouble getFieldOfView() const { return fov; }
00416 
00418   void setZoom(FXdouble zm);
00419 
00421   FXdouble getZoom() const { return zoom; }
00422 
00424   void setDistance(FXdouble ed);
00425 
00427   FXdouble getDistance() const { return distance; }
00428 
00430   void setScale(FXVec3f s);
00431 
00433   const FXVec3f& getScale() const { return scale; }
00434 
00436   void setOrientation(FXQuatf rot);
00437 
00439   const FXQuatf& getOrientation() const { return rotation; }
00440 
00442   void setCenter(FXVec3f cntr);
00443 
00445   const FXVec3f& getCenter() const { return center; }
00446 
00448   void translate(FXVec3f vec);
00449 
00451   FXbool getBoreVector(FXint sx,FXint sy,FXVec3f& point,FXVec3f& dir);
00452 
00454   FXVec3f getEyeVector() const;
00455 
00457   FXVec3f getEyePosition() const;
00458 
00460   void setHelpText(const FXString& text);
00461 
00463   const FXString& getHelpText() const { return help; }
00464 
00466   void setTipText(const FXString&  text);
00467 
00469   const FXString& getTipText() const { return tip; }
00470 
00472   const FXMat4f& getTransform() const { return transform; }
00473 
00475   const FXMat4f& getInvTransform() const { return itransform; }
00476 
00478   void setScene(FXGLObject* sc);
00479 
00481   FXGLObject* getScene() const { return scene; }
00482 
00484   void setSelection(FXGLObject* sel);
00485 
00487   FXGLObject* getSelection() const { return selection; }
00488 
00490   void setProjection(FXuint proj);
00491 
00493   FXuint getProjection() const { return projection; }
00494 
00496   void setBackgroundColor(const FXGLColor& clr,FXbool bottom=MAYBE);
00497 
00499   const FXGLColor& getBackgroundColor(FXbool bottom=FALSE) const { return background[bottom]; }
00500 
00502   void setAmbientColor(const FXGLColor& clr);
00503 
00505   const FXGLColor& getAmbientColor() const { return ambient; }
00506 
00512   FXbool readPixels(FXColor*& buffer,FXint x,FXint y,FXint w,FXint h);
00513 
00518   FXbool readFeedback(FXfloat*& buffer,FXint& used,FXint& size,FXint x,FXint y,FXint w,FXint h);
00519 
00524   void setZSortFunc(FXZSortFunc func){ zsortfunc=func; }
00525 
00527   FXZSortFunc getZSortFunc() const { return zsortfunc; }
00528 
00533   void setMaxHits(FXint maxh) { maxhits=maxh; }
00534 
00536   FXint getMaxHits() const { return maxhits; }
00537 
00544   FXbool doesTurbo() const { return doesturbo; }
00545 
00547   FXbool getTurboMode() const { return turbomode; }
00548 
00550   void setTurboMode(FXbool turbo=TRUE);
00551 
00553   void getLight(FXLight& lite) const;
00554 
00556   void setLight(const FXLight& lite);
00557 
00559   virtual void save(FXStream& store) const;
00560 
00562   virtual void load(FXStream& store);
00563 
00565   virtual ~FXGLViewer();
00566   };
00567 
00568 }
00569 
00570 #endif
00571 #endif
00572 #endif

(C) 2002-2009 Niall Douglas. Some parts (C) to assorted authors.
Generated on Fri Nov 20 18:31:22 2009 for TnFOX by doxygen v1.4.7