155 lines
3.4 KiB
C
155 lines
3.4 KiB
C
|
|
||
|
|
||
|
#ifndef GLAREA_INCLUDED
|
||
|
#define GLAREA_INCLUDED
|
||
|
|
||
|
//#include "traster.h"
|
||
|
#include "tw/tw.h"
|
||
|
|
||
|
#undef DVAPI
|
||
|
#undef DVVAR
|
||
|
#ifdef TWIN_EXPORTS
|
||
|
#define DVAPI DV_EXPORT_API
|
||
|
#define DVVAR DV_EXPORT_VAR
|
||
|
#else
|
||
|
#define DVAPI DV_IMPORT_API
|
||
|
#define DVVAR DV_IMPORT_VAR
|
||
|
#endif
|
||
|
|
||
|
class TStopWatch;
|
||
|
|
||
|
class DVAPI TGLArea : public TWidget
|
||
|
{
|
||
|
|
||
|
void swapBuffers();
|
||
|
TStopWatch *m_stopwatch;
|
||
|
double m_framePerSecond;
|
||
|
|
||
|
void computeOcclusingRegion();
|
||
|
void deleteOcclusingRegion();
|
||
|
//void redrawUncoveredArea(const TPoint &);
|
||
|
|
||
|
std::vector<TRect> *m_arrayOfRectToRedraw;
|
||
|
|
||
|
protected:
|
||
|
// int m_lx, m_ly;
|
||
|
|
||
|
// double m_angle;
|
||
|
|
||
|
#define PEZZA_DISABLE_REDRAW
|
||
|
|
||
|
#if defined(MACOSX) && defined(PEZZA_DISABLE_REDRAW)
|
||
|
bool m_disableRedraw;
|
||
|
#endif
|
||
|
|
||
|
TPoint m_lastPos;
|
||
|
TPointD m_pan; // world origin (win coords) (n. m_pan*2 are integer)
|
||
|
TPointD m_zoomFactor; // "world pixel" dimension (win coords) (integer if >=1)
|
||
|
TDimensionD m_pixelSize; // 1/zoomFactor; win pixel dimension (world coords)
|
||
|
|
||
|
double m_zoomLevel; // m_zoomFactor = e^m_zoomLevel
|
||
|
|
||
|
// supported extensions
|
||
|
static bool m_bgraSupported;
|
||
|
|
||
|
bool m_isInsideScreen;
|
||
|
void onGLContextCreated();
|
||
|
|
||
|
public:
|
||
|
class PickItem
|
||
|
{
|
||
|
public:
|
||
|
UINT m_label;
|
||
|
UINT m_zMin;
|
||
|
UINT m_zMax;
|
||
|
|
||
|
PickItem(UINT label, UINT zmin, UINT zmax)
|
||
|
: m_label(label), m_zMin(zmin), m_zMax(zmax)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
~PickItem() {}
|
||
|
private:
|
||
|
//not implemented
|
||
|
PickItem();
|
||
|
};
|
||
|
|
||
|
TGLArea(TWidget *parent, string name = "GLArea");
|
||
|
~TGLArea();
|
||
|
|
||
|
void repaint();
|
||
|
void configureNotify(const TDimension &);
|
||
|
void create();
|
||
|
|
||
|
void paintIncrementally();
|
||
|
|
||
|
// void rectwrite(const TRaster32P &ras, const TPoint &p);
|
||
|
void over(const TRaster32P &ras, const TPoint &p);
|
||
|
void over(const TRasterGR8P &ras, const TPoint &p);
|
||
|
|
||
|
inline TPointD win2world(const TPointD &p) const;
|
||
|
inline TPointD world2win(const TPointD &p) const;
|
||
|
|
||
|
inline TAffine getWin2WorldMatrix() const;
|
||
|
inline TAffine getWorld2WinMatrix() const;
|
||
|
|
||
|
void scroll(const TPoint &d); // viewport coordinates
|
||
|
void lookAt(const TPointD &d); // world coordinates of the desired window center
|
||
|
|
||
|
// n. zoomCenter : viewport coords
|
||
|
void setZoomLevel(double zlevel, const TPoint &zoomCenter);
|
||
|
void changeZoomLevel(double d, const TPoint ¢er);
|
||
|
virtual void onZoomChange() {}
|
||
|
|
||
|
void fitToWindow(const TRectD &worldRect);
|
||
|
|
||
|
void middleButtonDown(const TMouseEvent &e);
|
||
|
void middleButtonDrag(const TMouseEvent &e);
|
||
|
void middleButtonUp(const TMouseEvent &e);
|
||
|
|
||
|
void draw();
|
||
|
virtual void drawIncrementally();
|
||
|
|
||
|
virtual void drawForPick() { draw(); }
|
||
|
|
||
|
void pick(const TPoint &point, vector<PickItem> &items);
|
||
|
|
||
|
double getFramePerSecond() const { return m_framePerSecond; }
|
||
|
|
||
|
static bool isBGRASupported() { return m_bgraSupported; }
|
||
|
|
||
|
bool unProject(
|
||
|
TPointD &output,
|
||
|
|
||
|
const TPoint &mousePos,
|
||
|
const T3DPointD &planeOrigin,
|
||
|
const T3DPointD &u,
|
||
|
const T3DPointD &v) const;
|
||
|
|
||
|
void makeCurrent(); // Gl context
|
||
|
bool m_dontSwapBuffers;
|
||
|
};
|
||
|
|
||
|
inline TPointD TGLArea::win2world(const TPointD &p) const
|
||
|
{
|
||
|
TPointD q = p - m_pan;
|
||
|
return TPointD(m_pixelSize.lx * q.x, m_pixelSize.ly * q.y);
|
||
|
}
|
||
|
|
||
|
inline TPointD TGLArea::world2win(const TPointD &p) const
|
||
|
{
|
||
|
return m_pan + TPointD(p.x * m_zoomFactor.x, p.y * m_zoomFactor.y);
|
||
|
}
|
||
|
|
||
|
inline TAffine TGLArea::getWin2WorldMatrix() const
|
||
|
{
|
||
|
return TScale(m_pixelSize.lx, m_pixelSize.ly) * TTranslation(-m_pan);
|
||
|
}
|
||
|
|
||
|
inline TAffine TGLArea::getWorld2WinMatrix() const
|
||
|
{
|
||
|
return TTranslation(m_pan) * TScale(m_zoomFactor.x, m_zoomFactor.y);
|
||
|
}
|
||
|
|
||
|
#endif
|