void paintGL() override { drawBackground(); // Draw original if (m_img) { pushGLWorldCoordinates(); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); // Note GL_ONE instead of GL_SRC_ALPHA: it's needed since the input // image is supposedly premultiplied - and it works because the // viewer's background is opaque. // See tpixelutils.h's overPixT function for comparison. draw(m_img); glDisable(GL_BLEND); popGLCoordinates(); } else if (m_xsh) { // Build reference change affines // EXPLANATION: RasterPainter receives an affine specifiying the reference change // from world coordinates to the OpenGL viewport, where (0,0) corresponds to the // viewport center. const TAffine &cameraAff = m_xsh->getPlacement(m_xsh->getStageObjectTree()->getCurrentCameraId(), m_row); TTranslation centeredWidgetToWidgetAff(0.5 * width(), 0.5 * height()); const TAffine &worldToCenteredWigetAff = centeredWidgetToWidgetAff.inv() * viewAff() * cameraAff.inv(); glPushMatrix(); tglMultMatrix(centeredWidgetToWidgetAff); assert(m_row >= 0); ImagePainter::VisualSettings vs; TDimension viewerSize(width(), height()); Stage::RasterPainter painter(viewerSize, worldToCenteredWigetAff, TRect(viewerSize), vs, false); ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); Stage::visit(painter, scene, m_xsh.getPointer(), m_row); painter.flushRasterImages(); glFlush(); glPopMatrix(); } // Draw mesh preview if (m_meshImg) { glEnable(GL_BLEND); glEnable(GL_LINE_SMOOTH); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // Retrieve mesh dpi TPointD meshDpi; m_meshImg->getDpi(meshDpi.x, meshDpi.y); // Push mesh-to-world coordinates change pushGLWorldCoordinates(); glScaled(Stage::inch / meshDpi.x, Stage::inch / meshDpi.y, 1.0); glColor4f(0.0, 1.0, 0.0, 0.7); // Translucent green tglDrawEdges(*m_meshImg); popGLCoordinates(); glDisable(GL_LINE_SMOOTH); glDisable(GL_BLEND); } }
void ImageViewer::paintGL() { if (m_lutCalibrator && m_lutCalibrator->isValid()) m_fbo->bind(); TDimension viewerSize(width(), height()); TAffine aff = m_viewAff; // if (!m_visualSettings.m_defineLoadbox && m_flipbook && // m_flipbook->getLoadbox()!=TRect()) // offs = // convert(m_flipbook->getLoadbox().getP00())-TPointD(m_flipbook->getImageSize().lx/2.0, // m_flipbook->getImageSize().ly/2.0); TDimension imageSize; TRect loadbox; if (m_flipbook) { QString title = (!m_image) ? m_flipbook->getTitle() + tr(" :: Zoom : ") + QString::number(tround(sqrt(m_viewAff.det()) * 100)) + " %" : m_flipbook->getLevelZoomTitle() + tr(" :: Zoom : ") + QString::number(tround(sqrt(m_viewAff.det()) * 100)) + " %"; m_flipbook->parentWidget()->setWindowTitle(title); imageSize = m_flipbook->getImageSize(); if (m_visualSettings.m_useLoadbox && m_flipbook->getLoadbox() != TRect()) loadbox = m_flipbook->getLoadbox(); } m_visualSettings.m_sceneProperties = TApp::instance()->getCurrentScene()->getScene()->getProperties(); // enable checks only in the color model m_visualSettings.m_useChecks = m_isColorModel; ImagePainter::paintImage(m_image, imageSize, viewerSize, aff, m_visualSettings, m_compareSettings, loadbox); // when fx parameter is modified with showing the fx preview, // a flipbook shows a red border line before the rendered result is shown. if (m_isRemakingPreviewFx) { glPushMatrix(); glLoadIdentity(); glColor3d(1.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex2d(5, 5); glVertex2d(5, height() - 5); glVertex2d(width() - 5, height() - 5); glVertex2d(width() - 5, 5); glEnd(); glBegin(GL_LINE_LOOP); glVertex2d(10, 10); glVertex2d(10, height() - 10); glVertex2d(width() - 10, height() - 10); glVertex2d(width() - 10, 10); glEnd(); glPopMatrix(); } if (!m_image) { if (m_lutCalibrator && m_lutCalibrator->isValid()) m_lutCalibrator->onEndDraw(m_fbo); return; } if (safeAreaToggle.getStatus() && !m_isColorModel) { TRasterImageP rimg = (TRasterImageP)m_image; TVectorImageP vimg = (TVectorImageP)m_image; TToonzImageP timg = (TToonzImageP)m_image; TRect bbox; TPointD centerD; TRect bounds; if (rimg) { centerD = rimg->getRaster()->getCenterD(); bounds = rimg->getRaster()->getBounds(); } else if (timg) { centerD = timg->getRaster()->getCenterD(); bounds = timg->getRaster()->getBounds(); } if (!vimg) { TAffine aff = TTranslation(viewerSize.lx * 0.5, viewerSize.ly * 0.5) * m_viewAff * TTranslation(-centerD); TRectD bbox = aff * TRectD(0, 0, bounds.getLx() - 1, bounds.getLy() - 1); drawSafeArea(bbox); } } TPoint fromPos, toPos; if (m_visualSettings.m_defineLoadbox && m_flipbook) { TRect loadbox = convert(getImgToWidgetAffine() * convert(m_flipbook->getLoadbox())); if (loadbox != TRect()) { TPoint p00 = loadbox.getP00(); TPoint p11 = loadbox.getP11(); fromPos = TPoint(p00.x - width() * 0.5, height() * 0.5 - p00.y); // m_flipbook->getLoadbox().getP00(); toPos = TPoint(p11.x - width() * 0.5, height() * 0.5 - p11.y); // m_flipbook->getLoadbox().getP11(); } } else if (m_draggingZoomSelection || m_rectRGBPick) { fromPos = TPoint(m_pressedMousePos.x - width() * 0.5, height() * 0.5 - m_pressedMousePos.y); toPos = TPoint(m_pos.x() - width() * 0.5, height() * 0.5 - m_pos.y()); } if (fromPos != TPoint() || toPos != TPoint()) { if (m_rectRGBPick) { tglColor(TPixel32::Red); // TODO: glLineStipple is deprecated in the latest OpenGL. Need to be // replaced. (shun_iwasawa 2015/12/25) glLineStipple(1, 0x3F33); glEnable(GL_LINE_STIPPLE); glBegin(GL_LINE_STRIP); // do not draw the rect around the mouse cursor int margin = (fromPos.y < toPos.y) ? -3 : 3; glVertex2i(toPos.x, toPos.y + margin); glVertex2i(toPos.x, fromPos.y); glVertex2i(fromPos.x, fromPos.y); glVertex2i(fromPos.x, toPos.y); margin = (fromPos.x < toPos.x) ? -3 : 3; glVertex2i(toPos.x + margin, toPos.y); glEnd(); glDisable(GL_LINE_STIPPLE); } else { tglColor(m_draggingZoomSelection ? TPixel32::Red : TPixel32::Blue); glBegin(GL_LINE_STRIP); glVertex2i(fromPos.x, fromPos.y); glVertex2i(fromPos.x, toPos.y); glVertex2i(toPos.x, toPos.y); glVertex2i(toPos.x, fromPos.y); glVertex2i(fromPos.x, fromPos.y); glEnd(); } } if (m_lutCalibrator && m_lutCalibrator->isValid()) m_lutCalibrator->onEndDraw(m_fbo); }