00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
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
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
00063
00064
00066 struct FXViewport {
00067 FXint w,h;
00068 FXdouble left,right;
00069 FXdouble bottom,top;
00070 FXdouble hither,yon;
00071 };
00072
00073
00074
00075 struct FXGRAPHINGMODULEAPI FXLight {
00076 FXGLColor ambient;
00077 FXGLColor diffuse;
00078 FXGLColor specular;
00079 FXVec4f position;
00080 FXVec3f direction;
00081 FXfloat exponent;
00082 FXfloat cutoff;
00083 FXfloat c_attn;
00084 FXfloat l_attn;
00085 FXfloat q_attn;
00086 };
00087
00088
00089
00090 struct FXGRAPHINGMODULEAPI FXMaterial {
00091 FXGLColor ambient;
00092 FXGLColor diffuse;
00093 FXGLColor specular;
00094 FXGLColor emission;
00095 FXfloat shininess;
00096 };
00097
00098
00099
00100 typedef FXbool (*FXZSortFunc)(FXfloat*& buffer,FXint& used,FXint& size);
00101
00102
00103
00104
00105
00107 class FXGRAPHINGMODULEAPI FXGLViewer : public FXGLCanvas {
00108 FXDECLARE(FXGLViewer)
00109 friend class FXGLObject;
00110 protected:
00111 FXViewport wvt;
00112 FXMat4f transform;
00113 FXMat4f itransform;
00114 FXuint projection;
00115 FXQuatf rotation;
00116 FXdouble fov;
00117 FXdouble zoom;
00118 FXVec3f center;
00119 FXVec3f scale;
00120 FXdouble worldpx;
00121 FXdouble modelpx;
00122 FXint maxhits;
00123 FXdouble ax,ay;
00124 FXdouble diameter;
00125 FXdouble distance;
00126 FXGLColor background[2];
00127 FXGLColor ambient;
00128 FXLight light;
00129 FXMaterial material;
00130 FXint dial[3];
00131 FXString help;
00132 FXString tip;
00133 FXGLObject *dropped;
00134 FXGLObject *selection;
00135 FXZSortFunc zsortfunc;
00136 FXGLObject *scene;
00137 FXbool doesturbo;
00138 FXbool turbomode;
00139 FXuchar mode;
00140 public:
00141
00142
00143 static FXDragType objectType;
00144
00145 protected:
00146
00147
00148 enum {
00149 HOVERING,
00150 PICKING,
00151 ROTATING,
00152 POSTING,
00153 TRANSLATING,
00154 ZOOMING,
00155 FOVING,
00156 DRAGGING,
00157 TRUCKING,
00158 GYRATING,
00159 DO_LASSOSELECT,
00160 LASSOSELECT,
00161 DO_LASSOZOOM,
00162 LASSOZOOM
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
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
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
00288 enum {
00289 PARALLEL,
00290 PERSPECTIVE
00291 };
00292
00293
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
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