20 #include <QMouseEvent> 21 #include <QOpenGLContext> 22 #include <QOpenGLFunctions> 24 #include <QFontDatabase> 34 m_processingTraceIndex(-1),
36 m_displayMode(DisplayX),
38 m_configChanged(false),
45 m_focusedTraceIndex(0),
46 m_displayGridIntensity(10),
47 m_displayTraceIntensity(50),
48 m_displayXYPoints(false)
50 setAttribute(Qt::WA_OpaquePaintEvent);
51 connect(&
m_timer, SIGNAL(timeout()),
this, SLOT(
tick()));
97 void GLScope::setTraces(std::vector<ScopeVis::TraceData>* tracesData, std::vector<float *>* traces)
105 if (traces->size() > 0)
121 if (traces->size() > 0)
139 QOpenGLContext *glCurrentContext = QOpenGLContext::currentContext();
141 if (glCurrentContext) {
142 if (QOpenGLContext::currentContext()->isValid()) {
143 qDebug() <<
"GLScope::initializeGL: context:" 144 <<
" major: " << (QOpenGLContext::currentContext()->format()).majorVersion()
145 <<
" minor: " << (QOpenGLContext::currentContext()->format()).minorVersion()
146 <<
" ES: " << (QOpenGLContext::currentContext()->isOpenGLES() ?
"yes" :
"no");
149 qDebug() <<
"GLScope::initializeGL: current context is invalid";
152 qCritical() <<
"GLScope::initializeGL: no current context";
156 QSurface *surface = glCurrentContext->surface();
160 qCritical() <<
"GLScope::initializeGL: no surface attached";
165 if (surface->surfaceType() != QSurface::OpenGLSurface)
167 qCritical() <<
"GLScope::initializeGL: surface is not an OpenGLSurface: " << surface->surfaceType()
168 <<
" cannot use an OpenGL context";
173 qDebug() <<
"GLScope::initializeGL: OpenGL surface:" 174 <<
" class: " << (surface->surfaceClass() == QSurface::Window ?
"Window" :
"Offscreen");
178 connect(glCurrentContext, &QOpenGLContext::aboutToBeDestroyed,
this, &
GLScope::cleanup);
180 QOpenGLFunctions *glFunctions = QOpenGLContext::currentContext()->functions();
181 glFunctions->initializeOpenGLFunctions();
194 QOpenGLFunctions *glFunctions = QOpenGLContext::currentContext()->functions();
195 glFunctions->glViewport(0, 0, width, height);
212 QOpenGLFunctions *glFunctions = QOpenGLContext::currentContext()->functions();
213 glFunctions->glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
214 glFunctions->glClear(GL_COLOR_BUFFER_BIT);
227 QVector4D color(1.0f, 1.0f, 1.0f, 0.5f);
241 int effectiveTicks = 0;
243 for (
int i= 0;
i < tickList->count();
i++)
245 tick = &(*tickList)[
i];
252 q3[4*effectiveTicks] = 0;
253 q3[4*effectiveTicks+1] = y;
254 q3[4*effectiveTicks+2] = 1;
255 q3[4*effectiveTicks+3] = y;
272 int effectiveTicks = 0;
273 for(
int i= 0;
i < tickList->count();
i++) {
274 tick = &(*tickList)[
i];
278 q3[4*effectiveTicks] = x;
279 q3[4*effectiveTicks+1] = 0;
280 q3[4*effectiveTicks+2] = x;
281 q3[4*effectiveTicks+3] = 1;
328 const float *trace = (*m_traces)[0];
349 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
350 mat.scale(2.0f * rectW, -2.0f * rectH);
373 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
374 mat.scale(2.0f * rectW, -2.0f * rectH);
402 QVector4D color(1.0f, 1.0f, 1.0f, 0.5f);
416 int effectiveTicks = 0;
418 for (
int i= 0;
i < tickList->count();
i++)
420 tick = &(*tickList)[
i];
427 q3[4*effectiveTicks] = 0;
428 q3[4*effectiveTicks+1] = y;
429 q3[4*effectiveTicks+2] = 1;
430 q3[4*effectiveTicks+3] = y;
447 int effectiveTicks = 0;
448 for(
int i= 0;
i < tickList->count();
i++) {
449 tick = &(*tickList)[
i];
453 q3[4*effectiveTicks] = x;
454 q3[4*effectiveTicks+1] = 0;
455 q3[4*effectiveTicks+2] = x;
456 q3[4*effectiveTicks+3] = 1;
509 for (
unsigned int i = 1;
i <
m_traces->size();
i++)
511 const float *trace = (*m_traces)[
i];
528 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
529 mat.scale(2.0f * rectW, -2.0f * rectH);
552 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
553 mat.scale(2.0f * rectW, -2.0f * rectH);
584 QVector4D color(1.0f, 1.0f, 1.0f, 0.5f);
598 int effectiveTicks = 0;
600 for (
int i= 0;
i < tickList->count();
i++)
602 tick = &(*tickList)[
i];
609 q3[4*effectiveTicks] = 0;
610 q3[4*effectiveTicks+1] = y;
611 q3[4*effectiveTicks+2] = 1;
612 q3[4*effectiveTicks+3] = y;
627 int effectiveTicks = 0;
628 for(
int i= 0;
i < tickList->count();
i++) {
629 tick = &(*tickList)[
i];
633 q3[4*effectiveTicks] = x;
634 q3[4*effectiveTicks+1] = 0;
635 q3[4*effectiveTicks+2] = x;
636 q3[4*effectiveTicks+3] = 1;
689 int effectiveTicks = 0;
690 for(
int i= 0;
i < tickList->count();
i++) {
691 tick = &(*tickList)[
i];
695 q3[4*effectiveTicks] = 0;
696 q3[4*effectiveTicks+1] = y;
697 q3[4*effectiveTicks+2] = 1;
698 q3[4*effectiveTicks+3] = y;
735 for (
unsigned int i = 0;
i <
m_traces->size();
i++)
737 const float *trace = (*m_traces)[
i];
754 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
755 mat.scale(2.0f * rectW, -2.0f * rectH);
778 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
779 mat.scale(2.0f * rectW, -2.0f * rectH);
806 QVector4D color(1.0f, 1.0f, 1.0f, 0.5f);
817 int effectiveTicks = 0;
818 for(
int i= 0;
i < tickList->count();
i++) {
819 tick = &(*tickList)[
i];
823 q3[4*effectiveTicks] = 0;
824 q3[4*effectiveTicks+1] = y;
825 q3[4*effectiveTicks+2] = 1;
826 q3[4*effectiveTicks+3] = y;
841 int effectiveTicks = 0;
842 for(
int i= 0;
i < tickList->count();
i++) {
843 tick = &(*tickList)[
i];
847 q3[4*effectiveTicks] = x;
848 q3[4*effectiveTicks+1] = 0;
849 q3[4*effectiveTicks+2] = x;
850 q3[4*effectiveTicks+3] = 1;
908 const float *trace0 = (*m_traces)[0];
909 memcpy(q3, &(trace0[2*start+1]), (2*(end - start) - 1)*
sizeof(
float));
911 for (
unsigned int i = 1;
i <
m_traces->size();
i++)
913 const float *trace = (*m_traces)[
i];
920 for(
int i = start;
i < end;
i++)
922 float y = trace[2*
i+1];
923 q3[2*(
i-start)+1] = y;
934 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
935 mat.scale(2.0f * rectW, -2.0f * rectH);
1018 QFontMetrics fm(font());
1041 if ((
m_traces->size() > 1) && (m_focusedTraceIndex < m_traces->size()))
1085 QFontMetrics fm(font());
1086 int M = fm.width(
"-");
1095 (
float) scopeWidth / (
float) width(),
1096 (
float) scopeHeight / (
float) height()
1105 (
float) 2*scopeWidth / (
float) width(),
1106 (
float) -2*scopeHeight / (
float) height()
1112 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1115 (
float) 2*scopeWidth / (
float) width(),
1116 (
float) -2*(m_botMargin - 1) / (
float) height()
1126 (
float) -2*scopeHeight / (
float) height()
1134 (
float) scopeWidth / (
float) width(),
1135 (
float) scopeHeight / (
float) height()
1144 (
float) 2*scopeWidth / (
float) width(),
1145 (
float) -2*scopeHeight / (
float) height()
1151 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1154 (
float) 2*scopeWidth / (
float) width(),
1155 (
float) -2*(m_botMargin - 1) / (
float) height()
1165 (
float) -2*scopeHeight / (
float) height()
1181 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1182 painter.setFont(font());
1185 for(
int i = 0;
i < tickList->count();
i++) {
1186 tick = &(*tickList)[
i];
1189 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1210 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1211 painter.setFont(font());
1214 for(
int i = 0;
i < tickList->count();
i++) {
1215 tick = &(*tickList)[
i];
1218 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1239 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1240 painter.setFont(font());
1243 for(
int i = 0;
i < tickList->count();
i++) {
1244 tick = &(*tickList)[
i];
1268 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1269 painter.setFont(font());
1272 for(
int i = 0;
i < tickList->count();
i++) {
1273 tick = &(*tickList)[
i];
1287 QFontMetrics fm(font());
1288 int M = fm.width(
"-");
1297 (
float) scopeWidth / (
float) width(),
1298 (
float) scopeHeight / (
float) height()
1307 (
float) 2*scopeWidth / (
float) width(),
1308 (
float) -2*scopeHeight / (
float) height()
1314 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1317 (
float) 2*scopeWidth / (
float) width(),
1328 (
float) -2*scopeHeight / (
float) height()
1336 (
float) scopeWidth / (
float)width(),
1337 (
float) scopeHeight / (
float)height()
1346 (
float) 2*scopeWidth / (
float) width(),
1347 (
float) -2*scopeHeight / (
float) height()
1356 (
float) 2*scopeWidth / (
float) width(),
1367 (
float) -2*scopeHeight / (
float) height()
1383 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1384 painter.setFont(font());
1387 for(
int i = 0;
i < tickList->count();
i++) {
1388 tick = &(*tickList)[
i];
1391 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1411 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1412 painter.setFont(font());
1415 for(
int i = 0;
i < tickList->count();
i++) {
1416 tick = &(*tickList)[
i];
1419 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1440 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1441 painter.setFont(font());
1444 for(
int i = 0;
i < tickList->count();
i++) {
1445 tick = &(*tickList)[
i];
1469 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1470 painter.setFont(font());
1473 for(
int i = 0;
i < tickList->count();
i++) {
1474 tick = &(*tickList)[
i];
1488 QFontMetrics fm(font());
1489 int M = fm.width(
"-");
1498 (
float) scopeWidth / (
float) width(),
1499 (
float) scopeHeight / (
float) height()
1507 (
float) 2*scopeWidth / (
float) width(),
1508 (
float) -2*scopeHeight / (
float) height()
1514 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1517 (
float) 2*scopeWidth / (
float) width(),
1518 (
float) -2*(m_botMargin - 1) / (
float) height()
1528 (
float) -2*scopeHeight / (
float) height()
1537 (
float)(height() -
m_topMargin - m_botMargin) / (
float)height()
1546 (
float) -2*(height() -
m_topMargin - m_botMargin) / (
float) height()
1552 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1555 (
float) 2*scopeWidth / (
float) width(),
1556 (
float) -2*(m_botMargin - 1) / (
float) height()
1561 -1.0f + (
float) 2*(
m_leftMargin + scopeWidth) / (
float) width(),
1566 (
float) -2*scopeHeight / (
float) height()
1582 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1583 painter.setFont(font());
1586 for(
int i = 0;
i < tickList->count();
i++) {
1587 tick = &(*tickList)[
i];
1590 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1611 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1612 painter.setFont(font());
1615 for(
int i = 0;
i < tickList->count();
i++) {
1616 tick = &(*tickList)[
i];
1619 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1640 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1641 painter.setFont(font());
1644 for(
int i = 0;
i < tickList->count();
i++) {
1645 tick = &(*tickList)[
i];
1669 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1670 painter.setFont(font());
1673 for(
int i = 0;
i < tickList->count();
i++) {
1674 tick = &(*tickList)[
i];
1688 QFontMetrics fm(font());
1689 int M = fm.width(
"-");
1692 int scopeDim =
std::min(scopeWidth, scopeHeight);
1693 scopeWidth += scopeWidth - scopeDim;
1701 (
float) scopeHeight / (
float) height()
1710 (
float) -2*scopeHeight / (
float) height()
1716 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1720 (
float) -2*(m_botMargin - 1) / (
float) height()
1730 (
float) -2*scopeHeight / (
float) height()
1735 -1.0f + ((
float) 2*scopeWidth / (
float) width()),
1740 (
float) -2*scopeHeight / (
float) height()
1748 (
float) scopeDim / (
float)width(),
1749 (
float)(height() -
m_topMargin - m_botMargin) / (
float)height()
1757 (
float) 2*scopeDim / (
float) width(),
1758 (
float) -2*(height() -
m_topMargin - m_botMargin) / (
float) height()
1764 1.0f - ((
float) 2*(scopeHeight +
m_topMargin + 1) / (
float) height())
1767 (
float) 2*scopeDim / (
float) width(),
1768 (
float) -2*(m_botMargin - 1) / (
float) height()
1773 -1.0f + (
float) 2*(
m_leftMargin + scopeWidth) / (
float) width(),
1778 (
float) -2*scopeHeight / (
float) height()
1794 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1795 painter.setFont(font());
1798 for(
int i = 0;
i < tickList->count();
i++) {
1799 tick = &(*tickList)[
i];
1802 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1822 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1823 painter.setFont(font());
1826 for(
int i = 0;
i < tickList->count();
i++) {
1827 tick = &(*tickList)[
i];
1830 painter.drawText(QPointF(tick->
textPos, fm.height() - 1), tick->
text);
1851 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1852 painter.setFont(font());
1855 for(
int i = 0;
i < tickList->count();
i++) {
1856 tick = &(*tickList)[
i];
1881 painter.setPen(QColor(0xf0, 0xf0, 0xff));
1882 painter.setFont(font());
1885 for(
int i = 0;
i < tickList->count();
i++) {
1886 tick = &(*tickList)[
i];
1901 double amp_range = 2.0 / traceData.
m_amp;
1902 double amp_ofs = traceData.
m_ofs;
1903 double pow_floor = -100.0 + traceData.
m_ofs * 100.0;
1904 double pow_range = 100.0 / traceData.
m_amp;
1913 if (amp_range < 1e-6) {
1915 }
else if (amp_range < 1e-3) {
1917 }
else if (amp_range < 1.0) {
1930 if (amp_range < 1e-6) {
1931 scale.
setRange(
Unit::None, - amp_range * 5e8 + amp_ofs * 1e9, amp_range * 5e8 + amp_ofs * 1e9);
1932 }
else if (amp_range < 1e-3) {
1933 scale.
setRange(
Unit::None, - amp_range * 5e5 + amp_ofs * 1e6, amp_range * 5e5 + amp_ofs * 1e6);
1934 }
else if (amp_range < 1.0) {
1935 scale.
setRange(
Unit::None, - amp_range * 5e2 + amp_ofs * 1e3, amp_range * 5e2 + amp_ofs * 1e3);
1944 const QString& text,
1945 const QColor& color,
1946 QPixmap& channelOverlayPixmap,
1947 const QRectF& glScopeRect)
1949 if (text.isEmpty()) {
1954 QRectF textRect = metrics.boundingRect(text);
1955 QRectF overlayRect(0, 0, textRect.width()*1.05f + 4.0f, textRect.height());
1956 channelOverlayPixmap = QPixmap(overlayRect.width(), overlayRect.height());
1957 channelOverlayPixmap.fill(Qt::transparent);
1958 QPainter painter(&channelOverlayPixmap);
1959 painter.setRenderHints(QPainter::Antialiasing|QPainter::TextAntialiasing,
false);
1960 painter.fillRect(overlayRect, QColor(0, 0, 0, 0x80));
1961 QColor textColor(color);
1962 textColor.setAlpha(0xC0);
1963 painter.setPen(textColor);
1965 painter.drawText(QPointF(2.0f, overlayRect.height() - 4.0f), text);
1984 float shiftX = glScopeRect.width() - ((overlayRect.width() + 4.0f) / width());
1985 float shiftY = 4.0f / height();
1986 float rectX = glScopeRect.x() + shiftX;
1987 float rectY = glScopeRect.y() + shiftY;
1988 float rectW = overlayRect.width() / (float) width();
1989 float rectH = overlayRect.height() / (float) height();
1992 mat.setToIdentity();
1993 mat.translate(-1.0f + 2.0f * rectX, 1.0f - 2.0f * rectY);
1994 mat.scale(2.0f * rectW, -2.0f * rectH);
2008 qDebug() <<
"GLScope::connectTimer";
2009 disconnect(&
m_timer, SIGNAL(timeout()),
this, SLOT(
tick()));
2010 connect(&timer, SIGNAL(timeout()),
this, SLOT(
tick()));
void newTraces(std::vector< float *> *traces)
bool m_viewTrace
Trace visibility.
void setTraceSize(int trceSize, bool emitSignal=false)
QPixmap m_left1ScalePixmap
QPixmap m_bot2ScalePixmap
void drawChannelOverlay(const QString &text, const QColor &color, QPixmap &channelOverlayPixmap, const QRectF &glScopeRect)
QMatrix4x4 m_glBot2ScaleMatrix
void setTraces(std::vector< ScopeVis::TraceData > *tracesData, std::vector< float *> *traces)
ScaleEngine m_x2Scale
Display #2 X scale. Time scale.
static const int m_leftMargin
uint32_t m_focusedTraceIndex
QPixmap m_channelOverlayPixmap1
Calculate logarithmic (dB) of squared magnitude.
void drawSegments(const QMatrix4x4 &transformMatrix, const QVector4D &color, GLfloat *vertices, int nbVertices)
ScaleEngine m_y1Scale
Display #1 Y scale. Always connected to trace #0 (X trace)
void preTriggerChanged(uint32_t)
number of samples
GLShaderSimple m_glShaderSimple
void setVerticalDisplays()
Arrange displays when X and Y are stacked vertically.
std::vector< float * > * m_traces
IncrementalArray< GLfloat > m_q3TickY1
GLShaderTextured m_glShaderBottom1Scale
int m_displayGridIntensity
DisplayMode m_displayMode
QColor m_traceColor
Trace display color.
float m_traceColorR
Trace display color - red shortcut.
void setTriggerPre(uint32_t triggerPre, bool emitSignal=false)
number of samples
float m_triggerDisplayLevel
Displayable trigger display level in -1:+1 scale. Off scale if not displayable.
float m_traceColorG
Trace display color - green shortcut.
QString m_textOverlay
Text overlay to display.
void initTexture(const QImage &image, QOpenGLTexture::WrapMode wrapMode=QOpenGLTexture::Repeat)
QMatrix4x4 m_glScopeMatrix1
IncrementalArray< GLfloat > m_q3TickY2
void traceSizeChanged(uint32_t)
QPixmap m_left2ScalePixmap
float m_triggerColorR
Trigger line display color - red shortcut.
void setHorizontalDisplays()
Arrange displays when X and Y are stacked horizontally.
void drawSurface(const QMatrix4x4 &transformMatrix, GLfloat *textureCoords, GLfloat *vertices, int nbVertices)
ScopeVis::TriggerData m_focusedTriggerData
GLShaderTextured m_glShaderLeft1Scale
int m_displayTraceIntensity
QFont m_channelOverlayFont
float m_traceColorB
Trace display color - blue shortcut.
void setUniqueDisplays()
Arrange displays when X and Y are unique on screen.
QMatrix4x4 m_glBot1ScaleMatrix
void setPolarDisplays()
Arrange displays when X and Y are stacked over on the left and polar display is on the right...
GLShaderTextured m_glShaderLeft2Scale
IncrementalArray< GLfloat > m_q3TickX2
void drawContour(const QMatrix4x4 &transformMatrix, const QVector4D &color, GLfloat *vertices, int nbVertices)
void setFocusedTraceIndex(uint32_t traceIndex)
IncrementalArray< GLfloat > m_q3TickX1
Calculate linear magnitude or modulus.
GLShaderTextured m_glShaderPowerOverlay
bool m_hasTextOverlay
True if a text overlay has to be displayed.
QMatrix4x4 m_glRight1ScaleMatrix
void setFont(const QFont &font)
QAtomicInt m_processingTraceIndex
Calculate linear squared magnitude or power.
void setTimeBase(int timeBase)
QPixmap m_channelOverlayPixmap2
float m_amp
Amplification factor.
Calculate phase derivative i.e. instantaneous frequency scaled to sample rate.
GLScope(QWidget *parent=0)
GLShaderTextured m_glShaderBottom2Scale
void setYScale(ScaleEngine &scale, uint32_t highlightedTraceIndex)
void connectTimer(const QTimer &timer)
void allocate(uint32_t size)
void sampleRateChanged(int)
void setDisplayGridIntensity(int intensity)
const TickList & getTickList()
void resizeGL(int width, int height)
void setTimeOfsProMill(int timeOfsProMill)
void setRange(Unit::Physical physicalUnit, float rangeMin, float rangeMax)
void drawPolyline(const QMatrix4x4 &transformMatrix, const QVector4D &color, GLfloat *vertices, int nbVertices)
void setDisplayTraceIntensity(int intensity)
QPixmap m_bot1ScalePixmap
std::vector< ScopeVis::TraceData > * m_tracesData
Projector::ProjectionType m_projectionType
Complex to real projection type.
static const int m_topMargin
void drawPoints(const QMatrix4x4 &transformMatrix, const QVector4D &color, GLfloat *vertices, int nbVertices)
static const int m_botMargin
ScaleEngine m_y2Scale
Display #2 Y scale. Connected to highlighted Y trace (#1..n)
QMatrix4x4 m_glScopeMatrix2
void setDisplayMode(DisplayMode displayMode)
void setOrientation(Qt::Orientation orientation)
ScaleEngine m_x1Scale
Display #1 X scale. Time scale.
float m_triggerColorB
Trigger line display color - blue shortcut.
float m_triggerColorG
Trigger line display color - green shortcut.
QMatrix4x4 m_glLeft2ScaleMatrix
float m_ofs
Offset factor.
static const int m_rightMargin
void setSampleRate(int sampleRate)
QMatrix4x4 m_glLeft1ScaleMatrix
IncrementalArray< GLfloat > m_q3Polar
T min(const T &x, const T &y)