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 FXGLVIEWER_H
00025 #define FXGLVIEWER_H
00026
00027 #ifndef FXGLCANVAS_H
00028 #include "FXGLCanvas.h"
00029 #endif
00030
00031 namespace FX {
00032
00033
00034 class FXDCPrint;
00035 class FXGLObject;
00036 class FXGLVisual;
00037
00038
00039
00040 enum {
00041 VIEWER_LIGHTING = 0x00008000,
00042 VIEWER_FOG = 0x00010000,
00043 VIEWER_DITHER = 0x00020000
00044 };
00045
00046
00047
00048
00049
00050
00051 struct FXViewport {
00052 FXint w,h;
00053 FXdouble left,right;
00054 FXdouble bottom,top;
00055 FXdouble hither,yon;
00056 };
00057
00058
00059
00060 struct FXAPI FXLight {
00061 FXVec4f ambient;
00062 FXVec4f diffuse;
00063 FXVec4f specular;
00064 FXVec4f position;
00065 FXVec3f direction;
00066 FXfloat exponent;
00067 FXfloat cutoff;
00068 FXfloat c_attn;
00069 FXfloat l_attn;
00070 FXfloat q_attn;
00071 };
00072
00073
00074
00075 struct FXAPI FXMaterial {
00076 FXVec4f ambient;
00077 FXVec4f diffuse;
00078 FXVec4f specular;
00079 FXVec4f emission;
00080 FXfloat shininess;
00081 };
00082
00083
00084
00085 typedef FXbool (*FXZSortFunc)(FXfloat*& buffer,FXint& used,FXint& size);
00086
00087
00088
00089
00090
00091
00092 class FXAPI FXGLViewer : public FXGLCanvas {
00093 FXDECLARE(FXGLViewer)
00094 friend class FXGLObject;
00095 protected:
00096 FXViewport wvt;
00097 FXMat4f transform;
00098 FXMat4f itransform;
00099 FXuint projection;
00100 FXQuatf rotation;
00101 FXdouble fov;
00102 FXdouble zoom;
00103 FXVec3f center;
00104 FXVec3f scale;
00105 FXdouble worldpx;
00106 FXdouble modelpx;
00107 FXint maxhits;
00108 FXdouble ax,ay;
00109 FXdouble diameter;
00110 FXdouble distance;
00111 FXVec4f background[2];
00112 FXVec4f ambient;
00113 FXLight light;
00114 FXMaterial material;
00115 FXint dial[3];
00116 FXString help;
00117 FXString tip;
00118 FXGLObject *dropped;
00119 FXGLObject *selection;
00120 FXZSortFunc zsortfunc;
00121 FXGLObject *scene;
00122 FXbool doesturbo;
00123 FXbool turbomode;
00124 FXuchar mode;
00125 public:
00126
00127
00128 static FXDragType objectType;
00129
00130 protected:
00131
00132
00133 enum {
00134 HOVERING,
00135 PICKING,
00136 ROTATING,
00137 POSTING,
00138 TRANSLATING,
00139 ZOOMING,
00140 FOVING,
00141 DRAGGING,
00142 TRUCKING,
00143 GYRATING,
00144 DO_LASSOSELECT,
00145 LASSOSELECT,
00146 DO_LASSOZOOM,
00147 LASSOZOOM
00148 };
00149
00150 protected:
00151 FXGLViewer();
00152 void glsetup();
00153 virtual void updateProjection();
00154 virtual void updateTransform();
00155 FXVec3f spherePoint(FXint px,FXint py);
00156 FXQuatf turn(FXint fx,FXint fy,FXint tx,FXint ty);
00157 void drawWorld(FXViewport& wv);
00158 void drawAnti(FXViewport& wv);
00159 void drawLasso(FXint x0,FXint y0,FXint x1,FXint y1);
00160 FXint selectHits(FXuint*& hits,FXint& nhits,FXint x,FXint y,FXint w,FXint h);
00161 FXint renderFeedback(FXfloat *buffer,FXint x,FXint y,FXint w,FXint h,FXint maxbuffer);
00162 void drawFeedback(FXDCPrint& pdc,const FXfloat* buffer,FXint used);
00163 virtual FXGLObject* processHits(FXuint *pickbuffer,FXint nhits);
00164 void setOp(FXuint o);
00165 private:
00166 FXGLViewer(const FXGLViewer&);
00167 FXGLViewer &operator=(const FXGLViewer&);
00168 void initialize();
00169 public:
00170
00171
00172 long onPaint(FXObject*,FXSelector,void*);
00173 long onEnter(FXObject*,FXSelector,void*);
00174 long onLeave(FXObject*,FXSelector,void*);
00175 long onMotion(FXObject*,FXSelector,void*);
00176 long onMouseWheel(FXObject*,FXSelector,void*);
00177 long onChanged(FXObject*,FXSelector,void*);
00178 long onPick(FXObject*,FXSelector,void*);
00179 long onClicked(FXObject*,FXSelector,void*);
00180 long onDoubleClicked(FXObject*,FXSelector,void*);
00181 long onTripleClicked(FXObject*,FXSelector,void*);
00182 long onLassoed(FXObject*,FXSelector,void*);
00183 long onSelected(FXObject*,FXSelector,void*);
00184 long onDeselected(FXObject*,FXSelector,void*);
00185 long onInserted(FXObject*,FXSelector,void*);
00186 long onDeleted(FXObject*,FXSelector,void*);
00187 long onLeftBtnPress(FXObject*,FXSelector,void*);
00188 long onLeftBtnRelease(FXObject*,FXSelector,void*);
00189 long onMiddleBtnPress(FXObject*,FXSelector,void*);
00190 long onMiddleBtnRelease(FXObject*,FXSelector,void*);
00191 long onRightBtnPress(FXObject*,FXSelector,void*);
00192 long onRightBtnRelease(FXObject*,FXSelector,void*);
00193 long onUngrabbed(FXObject*,FXSelector,void*);
00194 long onKeyPress(FXObject*,FXSelector,void*);
00195 long onKeyRelease(FXObject*,FXSelector,void*);
00196 long onFocusIn(FXObject*,FXSelector,void*);
00197 long onFocusOut(FXObject*,FXSelector,void*);
00198 long onClipboardLost(FXObject*,FXSelector,void*);
00199 long onClipboardGained(FXObject*,FXSelector,void*);
00200 long onClipboardRequest(FXObject*,FXSelector,void*);
00201
00202
00203 long onCmdPerspective(FXObject*,FXSelector,void*);
00204 long onUpdPerspective(FXObject*,FXSelector,void*);
00205 long onCmdParallel(FXObject*,FXSelector,void*);
00206 long onUpdParallel(FXObject*,FXSelector,void*);
00207 long onCmdFront(FXObject*,FXSelector,void*);
00208 long onUpdFront(FXObject*,FXSelector,void*);
00209 long onCmdBack(FXObject*,FXSelector,void*);
00210 long onUpdBack(FXObject*,FXSelector,void*);
00211 long onCmdLeft(FXObject*,FXSelector,void*);
00212 long onUpdLeft(FXObject*,FXSelector,void*);
00213 long onCmdRight(FXObject*,FXSelector,void*);
00214 long onUpdRight(FXObject*,FXSelector,void*);
00215 long onCmdTop(FXObject*,FXSelector,void*);
00216 long onUpdTop(FXObject*,FXSelector,void*);
00217 long onCmdBottom(FXObject*,FXSelector,void*);
00218 long onUpdBottom(FXObject*,FXSelector,void*);
00219 long onCmdResetView(FXObject*,FXSelector,void*);
00220 long onCmdFitView(FXObject*,FXSelector,void*);
00221 long onDNDEnter(FXObject*,FXSelector,void*);
00222 long onDNDLeave(FXObject*,FXSelector,void*);
00223 long onDNDMotion(FXObject*,FXSelector,void*);
00224 long onDNDDrop(FXObject*,FXSelector,void*);
00225 long onTipTimer(FXObject*,FXSelector,void*);
00226 long onCmdXYZDial(FXObject*,FXSelector,void*);
00227 long onUpdXYZDial(FXObject*,FXSelector,void*);
00228 long onCmdRollPitchYaw(FXObject*,FXSelector,void*);
00229 long onUpdRollPitchYaw(FXObject*,FXSelector,void*);
00230 long onCmdXYZScale(FXObject*,FXSelector,void*);
00231 long onUpdXYZScale(FXObject*,FXSelector,void*);
00232 long onUpdCurrent(FXObject*,FXSelector,void*);
00233 long onCmdCutSel(FXObject*,FXSelector,void*);
00234 long onCmdCopySel(FXObject*,FXSelector,void*);
00235 long onCmdPasteSel(FXObject*,FXSelector,void*);
00236 long onCmdDeleteSel(FXObject*,FXSelector,void*);
00237 long onUpdDeleteSel(FXObject*,FXSelector,void*);
00238 long onCmdBackColor(FXObject*,FXSelector,void*);
00239 long onUpdBackColor(FXObject*,FXSelector,void*);
00240 long onCmdGradientBackColor(FXObject*,FXSelector,void*);
00241 long onUpdGradientBackColor(FXObject*,FXSelector,void*);
00242 long onCmdAmbientColor(FXObject*,FXSelector,void*);
00243 long onUpdAmbientColor(FXObject*,FXSelector,void*);
00244 long onCmdLighting(FXObject*,FXSelector,void*);
00245 long onUpdLighting(FXObject*,FXSelector,void*);
00246 long onCmdFog(FXObject*,FXSelector,void*);
00247 long onUpdFog(FXObject*,FXSelector,void*);
00248 long onCmdDither(FXObject*,FXSelector,void*);
00249 long onUpdDither(FXObject*,FXSelector,void*);
00250 long onCmdFov(FXObject*,FXSelector,void*);
00251 long onUpdFov(FXObject*,FXSelector,void*);
00252 long onCmdZoom(FXObject*,FXSelector,void*);
00253 long onUpdZoom(FXObject*,FXSelector,void*);
00254 long onCmdLightAmbient(FXObject*,FXSelector,void*);
00255 long onUpdLightAmbient(FXObject*,FXSelector,void*);
00256 long onCmdLightDiffuse(FXObject*,FXSelector,void*);
00257 long onUpdLightDiffuse(FXObject*,FXSelector,void*);
00258 long onCmdLightSpecular(FXObject*,FXSelector,void*);
00259 long onUpdLightSpecular(FXObject*,FXSelector,void*);
00260 long onCmdTurbo(FXObject*,FXSelector,void*);
00261 long onUpdTurbo(FXObject*,FXSelector,void*);
00262 long onCmdPrintImage(FXObject*,FXSelector,void*);
00263 long onCmdPrintVector(FXObject*,FXSelector,void*);
00264 long onCmdLassoZoom(FXObject*,FXSelector,void*);
00265 long onCmdLassoSelect(FXObject*,FXSelector,void*);
00266 long onQueryHelp(FXObject*,FXSelector,void*);
00267 long onQueryTip(FXObject*,FXSelector,void*);
00268 virtual long onDefault(FXObject*,FXSelector,void*);
00269
00270 public:
00271
00272
00273 enum {
00274 PARALLEL,
00275 PERSPECTIVE
00276 };
00277
00278
00279 enum {
00280 ID_PERSPECTIVE=FXGLCanvas::ID_LAST,
00281 ID_PARALLEL,
00282 ID_FRONT,
00283 ID_BACK,
00284 ID_LEFT,
00285 ID_RIGHT,
00286 ID_TOP,
00287 ID_BOTTOM,
00288 ID_RESETVIEW,
00289 ID_FITVIEW,
00290 ID_TOP_COLOR,
00291 ID_BOTTOM_COLOR,
00292 ID_BACK_COLOR,
00293 ID_AMBIENT_COLOR,
00294 ID_LIGHT_AMBIENT,
00295 ID_LIGHT_DIFFUSE,
00296 ID_LIGHT_SPECULAR,
00297 ID_LIGHTING,
00298 ID_TURBO,
00299 ID_FOG,
00300 ID_DITHER,
00301 ID_SCALE_X,
00302 ID_SCALE_Y,
00303 ID_SCALE_Z,
00304 ID_DIAL_X,
00305 ID_DIAL_Y,
00306 ID_DIAL_Z,
00307 ID_ROLL,
00308 ID_PITCH,
00309 ID_YAW,
00310 ID_FOV,
00311 ID_ZOOM,
00312 ID_CUT_SEL,
00313 ID_COPY_SEL,
00314 ID_PASTE_SEL,
00315 ID_DELETE_SEL,
00316 ID_PRINT_IMAGE,
00317 ID_PRINT_VECTOR,
00318 ID_LASSO_ZOOM,
00319 ID_LASSO_SELECT,
00320 ID_LAST
00321 };
00322
00323 public:
00324
00325
00326 static const FXchar objectTypeName[];
00327
00328 public:
00329
00330
00331 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);
00332
00333
00334 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);
00335
00336
00337 virtual void create();
00338
00339
00340 virtual void detach();
00341
00342
00343 virtual void layout();
00344
00345
00346 FXdouble worldPix() const { return worldpx; }
00347
00348
00349 FXdouble modelPix() const { return modelpx; }
00350
00351
00352 FXGLObject** lasso(FXint x1,FXint y1,FXint x2,FXint y2);
00353
00354
00355 virtual FXGLObject** select(FXint x,FXint y,FXint w,FXint h);
00356
00357
00358 virtual FXGLObject* pick(FXint x,FXint y);
00359
00360
00361 virtual FXbool setBounds(const FXRangef& box);
00362
00363
00364 FXbool fitToBounds(const FXRangef& box);
00365
00366
00367 void getViewport(FXViewport& v) const;
00368
00369
00370 void eyeToScreen(FXint& sx,FXint& sy,FXVec3f e);
00371
00372
00373 FXVec3f screenToEye(FXint sx,FXint sy,FXfloat eyez=0.0);
00374
00375
00376 FXVec3f screenToTarget(FXint sx,FXint sy);
00377
00378
00379 FXVec3f worldToEye(FXVec3f w);
00380
00381
00382 FXfloat worldToEyeZ(FXVec3f w);
00383
00384
00385 FXVec3f eyeToWorld(FXVec3f e);
00386
00387
00388 FXVec3f worldVector(FXint fx,FXint fy,FXint tx,FXint ty);
00389
00390
00391 void setMaterial(const FXMaterial &mtl);
00392
00393
00394 void getMaterial(FXMaterial &mtl) const;
00395
00396
00397 void setFieldOfView(FXdouble fv);
00398
00399
00400 FXdouble getFieldOfView() const { return fov; }
00401
00402
00403 void setZoom(FXdouble zm);
00404
00405
00406 FXdouble getZoom() const { return zoom; }
00407
00408
00409 void setDistance(FXdouble ed);
00410
00411
00412 FXdouble getDistance() const { return distance; }
00413
00414
00415 void setScale(FXVec3f s);
00416
00417
00418 const FXVec3f& getScale() const { return scale; }
00419
00420
00421 void setOrientation(FXQuatf rot);
00422
00423
00424 const FXQuatf& getOrientation() const { return rotation; }
00425
00426
00427 void setCenter(FXVec3f cntr);
00428
00429
00430 const FXVec3f& getCenter() const { return center; }
00431
00432
00433 void translate(FXVec3f vec);
00434
00435
00436 FXbool getBoreVector(FXint sx,FXint sy,FXVec3f& point,FXVec3f& dir);
00437
00438
00439 FXVec3f getEyeVector() const;
00440
00441
00442 FXVec3f getEyePosition() const;
00443
00444
00445 void setHelpText(const FXString& text);
00446
00447
00448 const FXString& getHelpText() const { return help; }
00449
00450
00451 void setTipText(const FXString& text);
00452
00453
00454 const FXString& getTipText() const { return tip; }
00455
00456
00457 const FXMat4f& getTransform() const { return transform; }
00458
00459
00460 const FXMat4f& getInvTransform() const { return itransform; }
00461
00462
00463 void setScene(FXGLObject* sc);
00464
00465
00466 FXGLObject* getScene() const { return scene; }
00467
00468
00469 void setSelection(FXGLObject* sel);
00470
00471
00472 FXGLObject* getSelection() const { return selection; }
00473
00474
00475 void setProjection(FXuint proj);
00476
00477
00478 FXuint getProjection() const { return projection; }
00479
00480
00481 void setBackgroundColor(const FXVec4f& clr,FXbool bottom=MAYBE);
00482
00483
00484 const FXVec4f& getBackgroundColor(FXbool bottom=FALSE) const { return background[bottom]; }
00485
00486
00487 void setAmbientColor(const FXVec4f& clr);
00488
00489
00490 const FXVec4f& getAmbientColor() const { return ambient; }
00491
00492
00493
00494
00495
00496
00497 FXbool readPixels(FXColor*& buffer,FXint x,FXint y,FXint w,FXint h);
00498
00499
00500
00501
00502
00503 FXbool readFeedback(FXfloat*& buffer,FXint& used,FXint& size,FXint x,FXint y,FXint w,FXint h);
00504
00505
00506
00507
00508
00509 void setZSortFunc(FXZSortFunc func){ zsortfunc=func; }
00510
00511
00512 FXZSortFunc getZSortFunc() const { return zsortfunc; }
00513
00514
00515
00516
00517
00518 void setMaxHits(FXint maxh) { maxhits=maxh; }
00519
00520
00521 FXint getMaxHits() const { return maxhits; }
00522
00523
00524
00525
00526
00527
00528
00529 FXbool doesTurbo() const { return doesturbo; }
00530
00531
00532 FXbool getTurboMode() const { return turbomode; }
00533
00534
00535 void setTurboMode(FXbool turbo=TRUE);
00536
00537
00538 void getLight(FXLight& lite) const;
00539
00540
00541 void setLight(const FXLight& lite);
00542
00543
00544 virtual void save(FXStream& store) const;
00545
00546
00547 virtual void load(FXStream& store);
00548
00549
00550 virtual ~FXGLViewer();
00551 };
00552
00553 }
00554
00555 #endif
00556