diff options
Diffstat (limited to 'src/datavis3d/engine/surface3drenderer.cpp')
-rw-r--r-- | src/datavis3d/engine/surface3drenderer.cpp | 894 |
1 files changed, 0 insertions, 894 deletions
diff --git a/src/datavis3d/engine/surface3drenderer.cpp b/src/datavis3d/engine/surface3drenderer.cpp deleted file mode 100644 index c66bd291..00000000 --- a/src/datavis3d/engine/surface3drenderer.cpp +++ /dev/null @@ -1,894 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2013 Digia Plc -** All rights reserved. -** For any questions to Digia, please use contact form at http://qt.digia.com -** -** This file is part of the QtDataVis3D module. -** -** Licensees holding valid Qt Enterprise licenses may use this file in -** accordance with the Qt Enterprise License Agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and Digia. -** -** If you have questions regarding the use of this file, please use -** contact form at http://qt.digia.com -** -****************************************************************************/ - -#include "surface3dcontroller_p.h" -#include "surface3drenderer_p.h" -#include "camerahelper_p.h" -#include "shaderhelper_p.h" -#include "objecthelper_p.h" -#include "surfaceobject_p.h" -#include "texturehelper_p.h" -#include "theme_p.h" -#include "utils_p.h" -#include "drawer_p.h" - -#include <QMatrix4x4> -#include <QMouseEvent> -#include <qmath.h> - -#include <QLinearGradient> -#include <QPainter> - -#include <QDebug> - -static const int ID_TO_RGBA_MASK = 0xff; - -QT_DATAVIS3D_BEGIN_NAMESPACE - -Surface3dRenderer::Surface3dRenderer(Surface3dController *controller) - : QObject(controller), - m_controller(controller), - m_mousePressed(MouseNone), - m_mousePos(QPoint(0, 0)), - m_isGridEnabled(true), - m_isBackgroundEnabled(true), - m_shadowQuality(QDataVis::ShadowLow), - m_labelTransparency(QDataVis::TransparencyFromTheme), - m_font(QFont(QStringLiteral("Arial"))), - m_hasNegativeValues(false), - m_segmentYCount(0), - m_segmentYStep(0.0f), - m_segmentXCount(0), - m_segmentZCount(0), - m_backgroundShader(0), - m_surfaceShader(0), - m_surfaceGridShader(0), - m_selectionShader(0), - m_isInitialized(false), - m_yRange(0.0f), // m_heightNormalizer - m_yAdjustment(0.0f), - m_xLength(0.0f), - m_zLength(0.0f), - m_maxDimension(0.0f), - m_scaleFactor(0.0f), - m_scaleX(0.0f), - m_scaleZ(0.0f), - m_maxSceneSize(40.0), - m_backgroundObj(0), - m_gridLineObj(0), - m_surfaceObj(0), - m_depthTexture(0), - m_depthFrameBuffer(0), - m_selectionFrameBuffer(0), - m_selectionDepthBuffer(0), - m_gradientTexture(0), - m_selectionTexture(0), - m_selectionResultTexture(0), - m_shadowQualityToShader(33.3f), - m_querySelection(false), - m_drawer(new Drawer(m_cachedTheme, m_font, m_labelTransparency)) -{ - // Listen to changes in the controller - QObject::connect(m_controller, &Surface3dController::smoothStatusChanged, this, - &Surface3dRenderer::updateSmoothStatus); - QObject::connect(m_controller, &Surface3dController::surfaceGridChanged, this, - &Surface3dRenderer::updateSurfaceGridStatus); - QObject::connect(m_controller, &Surface3dController::segmentCountChanged, this, - &Surface3dRenderer::updateSegmentCount); - QObject::connect(m_controller, &Surface3dController::themeChanged, this, - &Surface3dRenderer::updateTheme); - QObject::connect(m_controller, &Surface3dController::leftMousePressed, this, - &Surface3dRenderer::getSelection); - - m_cachedSmoothSurface = m_controller->smoothSurface(); - updateSurfaceGridStatus(m_controller->surfaceGrid()); - updateTheme(m_controller->theme()); - - initializeOpenGL(); -} - -Surface3dRenderer::~Surface3dRenderer() -{ - qDebug() << "Surface3dRenderer::~Surface3dRenderer()"; - m_textureHelper->glDeleteFramebuffers(1, &m_depthFrameBuffer); - m_textureHelper->glDeleteRenderbuffers(1, &m_selectionDepthBuffer); - m_textureHelper->glDeleteFramebuffers(1, &m_selectionFrameBuffer); - - m_textureHelper->deleteTexture(&m_depthTexture); - m_textureHelper->deleteTexture(&m_gradientTexture); - m_textureHelper->deleteTexture(&m_selectionTexture); - m_textureHelper->deleteTexture(&m_selectionResultTexture); - - delete m_backgroundShader; - delete m_selectionShader; - delete m_surfaceShader; - delete m_surfaceGridShader; - - delete m_backgroundObj; - delete m_surfaceObj; - delete m_textureHelper; - delete m_drawer; -} - -void Surface3dRenderer::initializeOpenGL() -{ - // Initialization is called multiple times when Qt Quick components are used - if (m_isInitialized) - return; - - initializeOpenGLFunctions(); - - m_textureHelper = new TextureHelper(); - m_drawer->initializeOpenGL(); - - // Initialize shaders -#if !defined(QT_OPENGL_ES_2) - if (m_shadowQuality > QDataVis::ShadowNone) { - initBackgroundShaders(QStringLiteral(":/shaders/vertexShadow"), - QStringLiteral(":/shaders/fragmentShadowNoTex")); - } else { - initBackgroundShaders(QStringLiteral(":/shaders/vertex"), - QStringLiteral(":/shaders/fragment")); - } -#else - initBackgroundShaders(QStringLiteral(":/shaders/vertexES2"), - QStringLiteral(":/shaders/fragmentES2")); -#endif - - initSurfaceShaders(); - - // Init selection shader - initSelectionShaders(); - - // Load grid line mesh - loadGridLineMesh(); - - // Load label mesh - //loadLabelMesh(); - - // Set OpenGL features - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - -#if !defined(QT_OPENGL_ES_2) - glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); - glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); - glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); -#endif - - // Set view port - glViewport(m_sliceViewPort.x(), m_sliceViewPort.y(), - m_sliceViewPort.width(), m_sliceViewPort.height()); - - // Set initialized -flag - m_isInitialized = true; - - // Resize in case we've missed resize events - // Resize calls initSelectionBuffer and initDepthBuffer, so they don't need to be called here - handleResize(); - - // Load background mesh (we need to be initialized first) - loadBackgroundMesh(); - - //loadSurfaceObj(); -} - -void Surface3dRenderer::render(CameraHelper *camera, const GLuint defaultFboHandle) -{ - if (!m_isInitialized) - return; - - if (defaultFboHandle) { - glDepthMask(true); - glEnable(GL_DEPTH_TEST); - glDepthFunc(GL_LESS); - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - } - - QVector3D clearColor = Utils::vectorFromColor(m_cachedTheme.m_windowColor); - glClearColor(clearColor.x(), clearColor.y(), clearColor.z(), 1.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); - - // TODO: bars have m_hasHeightAdjustmentChanged, which is always true! - // Set initial camera position - // X must be 0 for rotation to work - we can use "setCameraRotation" for setting it later - camera->setDefaultCameraOrientation(QVector3D(0.0f, 0.0f, 6.0f + zComp), - QVector3D(0.0f, 0.0f, zComp), - QVector3D(0.0f, 1.0f, 0.0f)); - - drawScene(camera, defaultFboHandle); -} - -void Surface3dRenderer::drawScene(CameraHelper *camera, const GLuint defaultFboHandle) -{ - //qDebug() << "Surface3dRenderer::drawScene"; - - GLfloat backgroundRotation = 0; - - // Specify viewport - glViewport(m_mainViewPort.x(), m_mainViewPort.y(), - m_mainViewPort.width(), m_mainViewPort.height()); - - // Set up projection matrix - QMatrix4x4 projectionMatrix; - projectionMatrix.perspective(45.0f, (GLfloat)m_mainViewPort.width() - / (GLfloat)m_mainViewPort.height(), 0.1f, 100.0f); - - // Calculate view matrix - QMatrix4x4 viewMatrix = m_controller->calculateViewMatrix( - 100.0f, //TODO: m_zoomLevel * m_autoScaleAdjustment - m_mainViewPort.width(), - m_mainViewPort.height(), - m_hasNegativeValues); - - // calculate background rotation based on view matrix rotation - if (viewMatrix.row(0).x() > 0 && viewMatrix.row(0).z() <= 0) - backgroundRotation = 270.0f; - else if (viewMatrix.row(0).x() > 0 && viewMatrix.row(0).z() > 0) - backgroundRotation = 180.0f; - else if (viewMatrix.row(0).x() <= 0 && viewMatrix.row(0).z() > 0) - backgroundRotation = 90.0f; - else if (viewMatrix.row(0).x() <= 0 && viewMatrix.row(0).z() <= 0) - backgroundRotation = 0.0f; - - QVector3D lightPos = camera->calculateLightPosition(defaultLightPos); - - QMatrix4x4 depthViewMatrix; - QMatrix4x4 depthProjectionMatrix; - depthProjectionMatrix = projectionMatrix; // TODO - depthViewMatrix.lookAt(lightPos, QVector3D(0.0f, -m_yAdjustment, zComp), - QVector3D(0.0f, 1.0f, 0.0f)); // TODO: Move - - // Enable texturing - glEnable(GL_TEXTURE_2D); - - // - // Do the surface drawing - // - - if (m_querySelection && m_surfaceObj) { - m_selectionShader->bind(); - glBindFramebuffer(GL_FRAMEBUFFER, m_selectionFrameBuffer); - glEnable(GL_DEPTH_TEST); // Needed, otherwise the depth render buffer is not used - glClearColor(0, 0, 0, 0); - glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Needed for clearing the frame buffer - glDisable(GL_DITHER); // disable dithering, it may affect colors if enabled - - glDisable(GL_CULL_FACE); - - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; - - modelMatrix.translate(0.0f, 1.0f - m_yAdjustment, zComp); - modelMatrix.scale(QVector3D(m_xLength / m_scaleFactor, - 1.0f, - m_zLength / m_scaleFactor)); - - MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; - - m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); - - // Activate texture - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, m_selectionTexture); - m_selectionShader->setUniformValue(m_selectionShader->texture(), 0); - - // 1st attribute buffer : vertices - glEnableVertexAttribArray(m_selectionShader->posAtt()); - glBindBuffer(GL_ARRAY_BUFFER, m_surfaceObj->vertexBuf()); - glVertexAttribPointer(m_selectionShader->posAtt(), 3, GL_FLOAT, GL_FALSE, 0, (void *)0); - - // 3rd attribute buffer : UVs - glEnableVertexAttribArray(m_selectionShader->uvAtt()); - glBindBuffer(GL_ARRAY_BUFFER, m_surfaceObj->uvBuf()); - glVertexAttribPointer(m_selectionShader->uvAtt(), 2, GL_FLOAT, GL_FALSE, 0, (void *)0); - - // Index buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_surfaceObj->elementBuf()); - - // Draw the triangles - glDrawElements(GL_TRIANGLES, m_surfaceObj->indexCount(), m_surfaceObj->indicesType(), (void *)0); - //m_drawer->drawObject(m_selectionShader, m_surfaceObj, m_selectionTexture, 0); - - // Free buffers - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); - glBindBuffer(GL_ARRAY_BUFFER, 0); - - glDisableVertexAttribArray(m_selectionShader->uvAtt()); - glDisableVertexAttribArray(m_selectionShader->posAtt()); - - glEnable(GL_DITHER); - - m_querySelection = false; - - QPoint point = m_controller->mousePosition(); - GLubyte pixel[4] = {0}; - glReadPixels(point.x(), height() - point.y(), 1, 1, - GL_RGBA, GL_UNSIGNED_BYTE, (void *)pixel); - //uint id = pixel[0] + pixel[1] * 256 + pixel[2] * 65536 + pixel[3] * 16777216; - - qDebug() << "pixel = " << pixel[0] << ", " << pixel[1] << ", " << pixel[2] << ", " << pixel[3]; - - glBindFramebuffer(GL_FRAMEBUFFER, defaultFboHandle); - - // Release selection shader - m_selectionShader->release(); - } - - if (m_surfaceObj) { - m_surfaceShader->bind(); - // m_selectionShader->bind(); // IFDEF print selection - - // For surface we can see climpses from underneath - glDisable(GL_CULL_FACE); - - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; - QMatrix4x4 depthMVPMatrix; - QMatrix4x4 itModelMatrix; - - modelMatrix.translate(0.0f, 1.0f - m_yAdjustment, zComp); - modelMatrix.scale(QVector3D(m_xLength / m_scaleFactor, - 1.0f, - m_zLength / m_scaleFactor)); - itModelMatrix.scale(QVector3D(m_xLength / m_scaleFactor, - 1.0f, - m_zLength / m_scaleFactor)); - -#ifdef SHOW_DEPTH_TEXTURE_SCENE - MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; -#else - MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; -#endif - // TODO Check the usage? - depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; - - // Set shader bindings - m_surfaceShader->setUniformValue(m_surfaceShader->lightP(), lightPos); - m_surfaceShader->setUniformValue(m_surfaceShader->view(), viewMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->model(), modelMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->nModel(), itModelMatrix.inverted().transposed()); - m_surfaceShader->setUniformValue(m_surfaceShader->MVP(), MVPMatrix); - //m_selectionShader->setUniformValue(m_selectionShader->MVP(), MVPMatrix); // IFDEF print selection - m_surfaceShader->setUniformValue(m_surfaceShader->ambientS(), m_cachedTheme.m_ambientStrength); - - //IF QT_OPENGL_ES_2 TODO - // Shadow quality etc. - //m_backgroundShader->setUniformValue(m_backgroundShader->shadowQ(), m_shadowQualityToShader); - //m_backgroundShader->setUniformValue(m_backgroundShader->depth(), depthMVPMatrix); - m_surfaceShader->setUniformValue(m_surfaceShader->lightS(), - m_cachedTheme.m_lightStrength * 2.0f); - - m_drawer->drawObject(m_surfaceShader, m_surfaceObj, m_gradientTexture, m_depthTexture); - //m_drawer->drawObject(m_selectionShader, m_surfaceObj, m_selectionTexture, 0); // IFDEF print selection - - m_surfaceShader->release(); - //m_selectionShader->release(); // IFDEF print selection - - if (m_cachedSurfaceGridOn) { - // Draw the grid over the surface - glPolygonOffset(1.0f, 1.0f); - glEnable(GL_POLYGON_OFFSET_FILL); - - m_surfaceGridShader->bind(); - - QVector3D gridColor = Utils::vectorFromColor(QColor(Qt::white)); - // Set shader bindings - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->view(), viewMatrix); - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->model(), modelMatrix); - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->nModel(), itModelMatrix.inverted().transposed()); - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->MVP(), MVPMatrix); - m_surfaceGridShader->setUniformValue(m_surfaceGridShader->color(), gridColor); - //m_surfaceGridShader->setUniformValue(m_surfaceGridShader->ambientS(), m_theme->m_ambientStrength); - m_drawer->drawSurfaceGrid(m_surfaceGridShader, m_surfaceObj); - - m_surfaceGridShader->release(); - - glPolygonOffset(0.0f, 0.0f); - glDisable(GL_POLYGON_OFFSET_FILL); - } - } - - // Bind background shader - m_backgroundShader->bind(); - - if (m_hasNegativeValues) - glDisable(GL_CULL_FACE); - else - glCullFace(GL_BACK); - - // Draw background - if (m_isBackgroundEnabled && m_backgroundObj) { - QMatrix4x4 modelMatrix; - QMatrix4x4 MVPMatrix; - QMatrix4x4 depthMVPMatrix; - QMatrix4x4 itModelMatrix; - - modelMatrix.translate(0.0f, 1.0f - m_yAdjustment, zComp); - modelMatrix.scale(QVector3D(m_xLength / m_scaleFactor, - 1.0f, - m_zLength / m_scaleFactor)); - modelMatrix.rotate(backgroundRotation, 0.0f, 1.0f, 0.0f); - itModelMatrix.scale(QVector3D(m_xLength / m_scaleFactor, - 1.0f, - m_zLength / m_scaleFactor)); - -#ifdef SHOW_DEPTH_TEXTURE_SCENE - MVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; -#else - MVPMatrix = projectionMatrix * viewMatrix * modelMatrix; -#endif - depthMVPMatrix = depthProjectionMatrix * depthViewMatrix * modelMatrix; - - QVector3D backgroundColor = Utils::vectorFromColor(m_cachedTheme.m_backgroundColor); - - // Set shader bindings - m_backgroundShader->setUniformValue(m_backgroundShader->lightP(), lightPos); - m_backgroundShader->setUniformValue(m_backgroundShader->view(), viewMatrix); - m_backgroundShader->setUniformValue(m_backgroundShader->model(), modelMatrix); - m_backgroundShader->setUniformValue(m_backgroundShader->nModel(), - itModelMatrix.inverted().transposed()); - m_backgroundShader->setUniformValue(m_backgroundShader->MVP(), MVPMatrix); - m_backgroundShader->setUniformValue(m_backgroundShader->color(), backgroundColor); - m_backgroundShader->setUniformValue(m_backgroundShader->ambientS(), - m_cachedTheme.m_ambientStrength * 2.0f); - -#if !defined(QT_OPENGL_ES_2) - if (m_shadowQuality > QDataVis::ShadowNone) { - // Set shadow shader bindings - m_backgroundShader->setUniformValue(m_backgroundShader->shadowQ(), - m_shadowQualityToShader); - m_backgroundShader->setUniformValue(m_backgroundShader->depth(), depthMVPMatrix); - m_backgroundShader->setUniformValue(m_backgroundShader->lightS(), - m_cachedTheme.m_lightStrength / 10.0f); - - // Draw the object - m_drawer->drawObject(m_backgroundShader, m_backgroundObj, 0, m_depthTexture); - } else -#endif - { - // Set shadowless shader bindings - m_backgroundShader->setUniformValue(m_backgroundShader->lightS(), - m_cachedTheme.m_lightStrength); - - // Draw the object - m_drawer->drawObject(m_backgroundShader, m_backgroundObj); - } - } - - // Release background shader - m_backgroundShader->release(); - - // Disable textures - glDisable(GL_TEXTURE_2D); - - // Reset culling - if (m_hasNegativeValues) { - glEnable(GL_CULL_FACE); - glCullFace(GL_BACK); - } -} - -void Surface3dRenderer::updateSegmentCount(GLint segmentCount, GLfloat step, GLfloat minimum) -{ - m_segmentYCount = segmentCount; - m_segmentYStep = step; - if (segmentCount > 0 && step > 0.0) { - m_yRange = m_segmentYCount * m_segmentYStep; - m_yAdjustment = 2.0f - ((m_yRange - minimum) / m_yRange); // TODO: to function - } - - qDebug() << "m_yAdjustment = " << m_yAdjustment; -} - -void Surface3dRenderer::setXZStuff(GLint segmentXCount, GLint segmentZCount) -{ - m_segmentXCount = segmentXCount; - m_segmentZCount = segmentZCount; - - // TODO: Invent "idiotproof" max scene size formula.. - // This seems to work ok if spacing is not negative (and row/column or column/row ratio is not too high) - m_maxSceneSize = 2 * qSqrt(segmentXCount * segmentZCount); - - calculateSceneScalingFactors(); -} - -void Surface3dRenderer::updateTheme(Theme theme) -{ - m_cachedTheme.setFromTheme(theme); - - // Update things depending from the theme - updateSurfaceGradient(); -} - -void Surface3dRenderer::updateSurfaceGradient() -{ - QImage image(QSize(4, 100), QImage::Format_RGB32); - QPainter pmp(&image); - pmp.setBrush(QBrush(m_cachedTheme.m_surfaceGradient)); - pmp.setPen(Qt::NoPen); - pmp.drawRect(0, 0, 4, 100); - - // QImage image(QStringLiteral("C:\\Users\\misalmel\\Work\\gerrit\\qtdatavis3d_2\\grid.png")); - - if (m_gradientTexture) { - m_textureHelper->deleteTexture(&m_gradientTexture); - m_gradientTexture = 0; - } - - m_gradientTexture = m_textureHelper->create2DTexture(image, false, true); -} - -void Surface3dRenderer::updateSelectionTexture() -{ - // Create the selection ID image. Each grid corner gets 2x2 pixel area of - // ID color so that each vertex (data point) has 4x4 pixel area of ID color - // TODO: power of two thing for ES - int idImageWidth = (m_segmentXCount - 1) * 4; - int idImageHeight = (m_segmentZCount - 1) * 4; - int stride = idImageWidth * 4 * sizeof(uchar); // 4 = number of color components (rgba) - - uchar *bits = new uchar[idImageWidth * idImageHeight * 4 * sizeof(uchar)]; - uint id = 1; - for (int i = 0; i < idImageHeight; i += 4) { - for (int j = 0; j < idImageWidth; j += 4) { - int p = (i * idImageWidth + j) * 4; - uchar r, g, b, a; - idToRGBA(id, &r, &g, &b, &a); - fillIdCorner(&bits[p], r, g, b, a, stride); - - idToRGBA(id + 1, &r, &g, &b, &a); - fillIdCorner(&bits[p + 8], r, g, b, a, stride); - - idToRGBA(id + m_segmentXCount, &r, &g, &b, &a); - fillIdCorner(&bits[p + 2 * stride], r, g, b, a, stride); - - idToRGBA(id + m_segmentXCount + 1, &r, &g, &b, &a); - fillIdCorner(&bits[p + 2 * stride + 8], r, g, b, a, stride); - - id++; - } - id++; - } - - // Use this to save the ID image to file - //QImage image(bits, idImageWidth, idImageHeight, QImage::Format_ARGB32); - //image.save("C:\\Users\\misalmel\\Work\\gerrit\\qtdatavis3d_2\\selection.png"); - - // If old texture exists, delete it - if (m_selectionTexture) { - m_textureHelper->deleteTexture(&m_selectionTexture); - m_selectionTexture = 0; - } - - // Move the ID image (bits) to the texture - m_selectionTexture = m_textureHelper->create2DTexture(bits, idImageWidth, idImageHeight); - - // Release the temp bits allocation - delete bits; - - // Create the result selection texture and buffers - if (m_selectionResultTexture) { - m_textureHelper->deleteTexture(&m_selectionResultTexture); - m_selectionResultTexture = 0; - } - - m_selectionResultTexture = m_textureHelper->createSelectionTexture(m_mainViewPort.size(), - m_selectionFrameBuffer, - m_selectionDepthBuffer); -} - -void Surface3dRenderer::fillIdCorner(uchar *p, uchar r, uchar g, uchar b, uchar a, int stride) -{ - p[0] = r; - p[1] = g; - p[2] = b; - p[3] = a; - p[4] = r; - p[5] = g; - p[6] = b; - p[7] = a; - p[stride + 0] = r; - p[stride + 1] = g; - p[stride + 2] = b; - p[stride + 3] = a; - p[stride + 4] = r; - p[stride + 5] = g; - p[stride + 6] = b; - p[stride + 7] = a; -} - -void Surface3dRenderer::idToRGBA(uint id, uchar *r, uchar *g, uchar *b, uchar *a) -{ - *r = id & ID_TO_RGBA_MASK; - *g = (id >> 8) & ID_TO_RGBA_MASK; - *b = (id >> 16) & ID_TO_RGBA_MASK; - *a = (id >> 24) & ID_TO_RGBA_MASK; -} - -void Surface3dRenderer::getSelection() -{ - qDebug() << "Surface3dRenderer::getSelection"; - m_querySelection = true; -} - -void Surface3dRenderer::setSeries(QList<qreal> series) -{ - m_series = series; - - // TODO temp solution - if (!m_surfaceObj) - loadSurfaceObj(); - - if (m_cachedSmoothSurface) - m_surfaceObj->setUpSmoothData(series, m_segmentXCount, m_segmentZCount, m_yRange, true); - else - m_surfaceObj->setUpData(series, m_segmentXCount, m_segmentZCount, m_yRange, true); - - updateSelectionTexture(); -} - -void Surface3dRenderer::calculateSceneScalingFactors() -{ - // Calculate scene scaling and translation factors - // m_rowWidth = ((m_columnCount + 1) * m_barSpacing.width()) / 2.0f; - // m_columnDepth = ((m_rowCount + 1) * m_barSpacing.height()) / 2.0f; - // m_maxDimension = qMax(m_rowWidth, m_columnDepth); - // m_scaleFactor = qMin((m_columnCount * (m_maxDimension / m_maxSceneSize)), - // (m_rowCount * (m_maxDimension / m_maxSceneSize))); - // m_scaleX = m_barThickness.width() / m_scaleFactor; - // m_scaleZ = m_barThickness.height() / m_scaleFactor; - - m_xLength = m_segmentXCount; - m_zLength = m_segmentZCount; - m_maxDimension = qMax(m_xLength, m_zLength); - m_scaleFactor = qMin((m_segmentXCount * (m_maxDimension / m_maxSceneSize)), - (m_segmentZCount * (m_maxDimension / m_maxSceneSize))); - m_scaleX = 1.0f / m_scaleFactor; // TODO: correspondance to m_barThickness - m_scaleZ = 1.0f / m_scaleFactor; // TODO: correspondance to m_barThickness - - //qDebug() << "m_scaleX" << m_scaleX << "m_scaleFactor" << m_scaleFactor; - //qDebug() << "m_scaleZ" << m_scaleZ << "m_scaleFactor" << m_scaleFactor; - //qDebug() << "m_rowWidth:" << m_rowWidth << "m_columnDepth:" << m_columnDepth << "m_maxDimension:" << m_maxDimension; -} - -void Surface3dRenderer::updateSmoothStatus(bool enable) -{ - m_cachedSmoothSurface = enable; - - if (!m_surfaceObj) - return; - - if (m_cachedSmoothSurface) - m_surfaceObj->setUpSmoothData(m_series, m_segmentXCount, m_segmentZCount, m_yRange, true); - else - m_surfaceObj->setUpData(m_series, m_segmentXCount, m_segmentZCount, m_yRange, true); - - initSurfaceShaders(); -} - -void Surface3dRenderer::updateSurfaceGridStatus(bool enable) -{ - m_cachedSurfaceGridOn = enable; -} - -void Surface3dRenderer::loadBackgroundMesh() -{ - if (!m_isInitialized) - return; - - if (m_backgroundObj) - delete m_backgroundObj; - if (m_hasNegativeValues) - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/negativeBackground")); - else - m_backgroundObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/background")); - m_backgroundObj->load(); -} - -void Surface3dRenderer::loadSurfaceObj() -{ - if (!m_isInitialized) - return; - - if (m_surfaceObj) - delete m_surfaceObj; - m_surfaceObj = new SurfaceObject(); - //m_surfaceObj->setUpData(); -} - -void Surface3dRenderer::loadGridLineMesh() -{ - if (m_gridLineObj) - delete m_gridLineObj; - m_gridLineObj = new ObjectHelper(QStringLiteral(":/defaultMeshes/bar")); - m_gridLineObj->load(); -} - -const QSize Surface3dRenderer::size() -{ - return m_boundingRect.size(); -} - -const QRect Surface3dRenderer::boundingRect() -{ - return m_boundingRect; -} - -void Surface3dRenderer::setBoundingRect(const QRect boundingRect) -{ - m_boundingRect = boundingRect; - handleResize(); -} - -void Surface3dRenderer::setWidth(const int width) -{ - m_boundingRect.setWidth(width); - handleResize(); -} - -int Surface3dRenderer::width() -{ - return m_boundingRect.width(); -} - -void Surface3dRenderer::setHeight(const int height) -{ - m_boundingRect.setHeight(height); - handleResize(); -} - -int Surface3dRenderer::height() -{ - return m_boundingRect.height(); -} - -void Surface3dRenderer::setX(const int x) -{ - m_boundingRect.setX(x); -} - -int Surface3dRenderer::x() -{ - return m_boundingRect.x(); -} - -void Surface3dRenderer::setY(const int y) -{ - m_boundingRect.setY(y); -} - -int Surface3dRenderer::y() -{ - return m_boundingRect.y(); -} - -void Surface3dRenderer::handleResize() -{ - if (!m_isInitialized) - return; - - qDebug() << "Surface3dRenderer::handleResize " << width() << "x" << height(); - - m_mainViewPort = QRect(0, 0, width(), height()); - m_sliceViewPort = QRect(0, 0, width(), height()); - -#if !defined(QT_OPENGL_ES_2) - // Re-init depth buffer - updateDepthBuffer(); -#endif -} - -#if !defined(QT_OPENGL_ES_2) -void Surface3dRenderer::updateDepthBuffer() -{ - if (m_depthTexture) { - m_textureHelper->deleteTexture(&m_depthTexture); - m_depthTexture = 0; - } - - // TODO: bars uses some m_cachedShadowQuality - if (m_shadowQuality > QDataVis::ShadowNone && !m_mainViewPort.size().isEmpty()) { - m_depthTexture = m_textureHelper->createDepthTexture(m_mainViewPort.size(), - m_depthFrameBuffer, - m_shadowQuality); - if (!m_depthTexture) { - qDebug() << "Failed to create m_depthTexture"; - // switch (m_shadowQuality) { - // case ShadowHigh: - // qWarning("Creating high quality shadows failed. Changing to medium quality."); - // (void)setShadowQuality(ShadowMedium); - // break; - // case ShadowMedium: - // qWarning("Creating medium quality shadows failed. Changing to low quality."); - // (void)setShadowQuality(ShadowLow); - // break; - // case ShadowLow: - // qWarning("Creating low quality shadows failed. Switching shadows off."); - // (void)setShadowQuality(ShadowNone); - // break; - // default: - // // You'll never get here - // break; - // } - } - } -} -#endif - -void Surface3dRenderer::initBackgroundShaders(const QString &vertexShader, - const QString &fragmentShader) -{ - if (m_backgroundShader) - delete m_backgroundShader; - m_backgroundShader = new ShaderHelper(this, vertexShader, fragmentShader); - m_backgroundShader->initialize(); -} - -void Surface3dRenderer::initSelectionShaders() -{ - if (m_selectionShader) - delete m_selectionShader; - m_selectionShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexLabel"), - QStringLiteral(":/shaders/fragmentLabel")); - m_selectionShader->initialize(); -} - -void Surface3dRenderer::initSurfaceShaders() -{ - if (m_surfaceShader) - delete m_surfaceShader; - if (m_cachedSmoothSurface) { - m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurface"), - QStringLiteral(":/shaders/fragmentSurface")); - } else { - m_surfaceShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceFlat"), - QStringLiteral(":/shaders/fragmentSurfaceFlat")); - } - m_surfaceShader->initialize(); - - if (m_surfaceGridShader) - delete m_surfaceGridShader; - m_surfaceGridShader = new ShaderHelper(this, QStringLiteral(":/shaders/vertexSurfaceGrid"), - QStringLiteral(":/shaders/fragmentSurfaceGrid")); - m_surfaceGridShader->initialize(); -} - -QT_DATAVIS3D_END_NAMESPACE - - -//p = 90; -//qDebug() << "rgba = " << bits[p + 0] << ", " << bits[p + 1] << ", " << -// bits[p + 2] << ", " << bits[p + 3]; -//p += 4; -//qDebug() << "rgba = " << bits[p + 0] << ", " << bits[p + 1] << ", " << -// bits[p + 2] << ", " << bits[p + 3]; -//p += 4; -//qDebug() << "rgba = " << bits[p + 0] << ", " << bits[p + 1] << ", " << -// bits[p + 2] << ", " << bits[p + 3]; -//p += 4; -//qDebug() << "rgba = " << bits[p + 0] << ", " << bits[p + 1] << ", " << -// bits[p + 2] << ", " << bits[p + 3]; -//p += 4; -//qDebug() << "rgba = " << bits[p + 0] << ", " << bits[p + 1] << ", " << -// bits[p + 2] << ", " << bits[p + 3]; -//p += 4; - |