From 10371b1c5a6a8c38a82b2ae708e243dbdc03837c Mon Sep 17 00:00:00 2001 From: Paul Leroy Date: Fri, 22 Mar 2024 08:39:03 +0100 Subject: [PATCH] code cleaning GrainsAsEllipsoids --- include/GrainsAsEllipsoids.h | 50 ++++----- src/GrainsAsEllipsoids.cpp | 203 ++++++++++++++++++----------------- 2 files changed, 123 insertions(+), 130 deletions(-) diff --git a/include/GrainsAsEllipsoids.h b/include/GrainsAsEllipsoids.h index 4a1ca6d..555afcc 100644 --- a/include/GrainsAsEllipsoids.h +++ b/include/GrainsAsEllipsoids.h @@ -22,14 +22,11 @@ public: //! Set the path for shaders void setShaderPath(const QString &path); - //! Release shaders (if any) - /** Must be called before the OpenGL context is released. - **/ - void releaseShaders(); + void setLocalMaximumIndexes(const Eigen::ArrayXi &localMaximumIndexes); - bool initProgram(QOpenGLContext* context); + void setGrainColorsTable(const RGBAColorsTableType& colorTable); - // + // INIT SPHERE void initSphereVertices(); @@ -37,10 +34,6 @@ public: void buildInterleavedVertices(); - bool drawSphere(CC_DRAW_CONTEXT &context, int colorIndex=0); - - void setGrainColorsTable(const RGBAColorsTableType& colorTable); - std::vector vertices; std::vector normals; std::vector texCoords; @@ -54,30 +47,28 @@ public: int interleavedStride = 32; - // + // ELLIPSOID FITTING + + + + // DRAW + + //! Release shaders (if any) + /** Must be called before the OpenGL context is released. + **/ + void releaseShaders(); void setUniformValueColor(const ccColor::Rgba &color); + bool drawSphere(CC_DRAW_CONTEXT &context, int colorIndex=0); + + bool initProgram(QOpenGLContext* context); + //! Draw grains as ellipsoids void drawGrains(CC_DRAW_CONTEXT &context); - void setLocalMaximumIndexes(const Eigen::ArrayXi &localMaximumIndexes); - - //! Colors of the normals when they are displayed - enum NormalLineColors{ - YELLOW, - RED, - GREEN, - BLUE, - BLACK - }; - - struct NormalLineParameters - { - float length = 1.0f; - ccColor::Rgba color = ccColor::yellow; - int colorIdx = YELLOW; - } m_normalLineParameters; + // from ccHObject + void draw(CC_DRAW_CONTEXT& context); ccPointCloud* m_cloud; ccMainAppInterface* m_app; @@ -91,9 +82,6 @@ public: // Default path to the shader files QString m_shaderPath; - - // from ccHObject - void draw(CC_DRAW_CONTEXT& context); }; #endif // GRAINSASELLIPSOIDS_H diff --git a/src/GrainsAsEllipsoids.cpp b/src/GrainsAsEllipsoids.cpp index 5232f5f..45a1f85 100644 --- a/src/GrainsAsEllipsoids.cpp +++ b/src/GrainsAsEllipsoids.cpp @@ -19,86 +19,26 @@ void GrainsAsEllipsoids::setShaderPath(const QString& path) m_shaderPath = path; } -void GrainsAsEllipsoids::releaseShaders() +void GrainsAsEllipsoids::setLocalMaximumIndexes(const Eigen::ArrayXi &localMaximumIndexes) { - m_program.clear(); + m_localMaximumIndexes = localMaximumIndexes; } -bool GrainsAsEllipsoids::initProgram(QOpenGLContext* context) +void GrainsAsEllipsoids::setGrainColorsTable(const RGBAColorsTableType& colorTable) { - if (m_program.isNull()) + m_grainColors.resize(colorTable.size()); + + for (int k = 0; k < colorTable.size(); k++) { - QString error; - - if (!context) - { - assert(false); - return false; - } - - m_program.reset(new QOpenGLShaderProgram(context)); - - // create vertex shader - QString vertexShaderFile(m_shaderPath + "/DrawGrains.vs"); - if (!m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, vertexShaderFile)) - { - error = m_program->log(); - ccLog::Error(error); - return false; - } - - // create geometry shader -// QString geometryShaderFile(m_shaderPath + "/DrawGrains.gs"); -// if (!m_program->addShaderFromSourceFile(QOpenGLShader::Geometry, geometryShaderFile)) -// { -// error = m_program->log(); -// ccLog::Error(error); -// return false; -// } - - // create fragment shader - QString fragmentShaderFile(m_shaderPath + "/DrawGrains.fs"); - if (!m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, fragmentShaderFile)) - { - error = m_program->log(); - ccLog::Error(error); - return false; - } - - if (!m_program->link()) - { - error = m_program->log(); - ccLog::Error(error); - return false; - } - - // initialize the ellipsoid instance - m_ellipsoidInstance.resize(401); - float stepTheta = M_PI / 21; - float stepPhi = 2 * M_PI / 21; - int count = 0; - CCVector3f center = *m_cloud->getPoint(m_localMaximumIndexes[0]); - m_ellipsoidInstance[count++] = CCVector3f(0, 0, 1); - for (int thetaI = 1; thetaI < 20; thetaI++) - { - for (int phiI = 0; phiI < 21; phiI++) - { - m_ellipsoidInstance[count++] = CCVector3f(center.x + sin(thetaI * stepTheta) * cos(phiI * stepPhi) * 1, - center.y + sin(thetaI * stepTheta) * sin(phiI * stepPhi) * 1, - center.z + cos(thetaI * stepTheta) * 1); - } - } - m_ellipsoidInstance[count++] = CCVector3f(0, 0, -1); - - // initialize sphere - initSphereVertices(); - initSphereIndexes(); - buildInterleavedVertices(); + ccColor::Rgba color = colorTable[k]; + m_grainColors[k] = CCVector3f(static_cast(color.r) / ccColor::MAX, + static_cast(color.g) / ccColor::MAX, + static_cast(color.b) / ccColor::MAX); } - - return true; } +// INIT ORIGINAL SPHERE + void GrainsAsEllipsoids::initSphereVertices() { float radius = 0.2; @@ -220,6 +160,95 @@ void GrainsAsEllipsoids::buildInterleavedVertices() } } +// ELLIPSOID FITTING + +// DRAW + +void GrainsAsEllipsoids::releaseShaders() +{ + m_program.clear(); +} + +void GrainsAsEllipsoids::setUniformValueColor(const ccColor::Rgba &color) +{ + m_program->setUniformValue("color", color.r, color.g, color.b, color.a); +} + +bool GrainsAsEllipsoids::initProgram(QOpenGLContext* context) +{ + if (m_program.isNull()) + { + QString error; + + if (!context) + { + assert(false); + return false; + } + + m_program.reset(new QOpenGLShaderProgram(context)); + + // create vertex shader + QString vertexShaderFile(m_shaderPath + "/DrawGrains.vs"); + if (!m_program->addShaderFromSourceFile(QOpenGLShader::Vertex, vertexShaderFile)) + { + error = m_program->log(); + ccLog::Error(error); + return false; + } + + // create geometry shader + // QString geometryShaderFile(m_shaderPath + "/DrawGrains.gs"); + // if (!m_program->addShaderFromSourceFile(QOpenGLShader::Geometry, geometryShaderFile)) + // { + // error = m_program->log(); + // ccLog::Error(error); + // return false; + // } + + // create fragment shader + QString fragmentShaderFile(m_shaderPath + "/DrawGrains.fs"); + if (!m_program->addShaderFromSourceFile(QOpenGLShader::Fragment, fragmentShaderFile)) + { + error = m_program->log(); + ccLog::Error(error); + return false; + } + + if (!m_program->link()) + { + error = m_program->log(); + ccLog::Error(error); + return false; + } + + // initialize the ellipsoid instance + m_ellipsoidInstance.resize(401); + float stepTheta = M_PI / 21; + float stepPhi = 2 * M_PI / 21; + int count = 0; + CCVector3f center = *m_cloud->getPoint(m_localMaximumIndexes[0]); + m_ellipsoidInstance[count++] = CCVector3f(0, 0, 1); + for (int thetaI = 1; thetaI < 20; thetaI++) + { + for (int phiI = 0; phiI < 21; phiI++) + { + m_ellipsoidInstance[count++] = CCVector3f(center.x + sin(thetaI * stepTheta) * cos(phiI * stepPhi) * 1, + center.y + sin(thetaI * stepTheta) * sin(phiI * stepPhi) * 1, + center.z + cos(thetaI * stepTheta) * 1); + } + } + m_ellipsoidInstance[count++] = CCVector3f(0, 0, -1); + + // initialize sphere + initSphereVertices(); + initSphereIndexes(); + buildInterleavedVertices(); + } + + return true; +} + bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) { QOpenGLFunctions_2_1* glFunc = context.glFunctions(); @@ -241,12 +270,12 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) QVector4D lightAmbient(0.3f, 0.3f, 0.3f, 1); // grey QVector4D lightDiffuse(0.7f, 0.7f, 0.7f, 1); // light grey QVector4D lightSpecular(1.0f, 1.0f, 1.0f, 1); // RGB white -// QVector4D materialAmbient(0.5f, 0.5f, 0.5f, 1); + // QVector4D materialAmbient(0.5f, 0.5f, 0.5f, 1); QVector4D materialDiffuse(0.7f, 0.7f, 0.7f, 1); QVector4D materialSpecular(0.4f, 0.4f, 0.4f, 1); QVector4D materialAmbient(color.x, color.y, color.z, 1); -// QVector4D materialDiffuse(color.r / ccColor::MAX, color.g / ccColor::MAX, color.b / ccColor::MAX, 1); -// QVector4D materialSpecular(color.r / ccColor::MAX, color.g / ccColor::MAX, color.b / ccColor::MAX, 1); + // QVector4D materialDiffuse(color.r / ccColor::MAX, color.g / ccColor::MAX, color.b / ccColor::MAX, 1); + // QVector4D materialSpecular(color.r / ccColor::MAX, color.g / ccColor::MAX, color.b / ccColor::MAX, 1); float materialShininess = 16; m_program->setUniformValue("lightPosition", lightPosition); @@ -315,24 +344,6 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) return true; } -void GrainsAsEllipsoids::setGrainColorsTable(const RGBAColorsTableType& colorTable) -{ - m_grainColors.resize(colorTable.size()); - - for (int k = 0; k < colorTable.size(); k++) - { - ccColor::Rgba color = colorTable[k]; - m_grainColors[k] = CCVector3f(static_cast(color.r) / ccColor::MAX, - static_cast(color.g) / ccColor::MAX, - static_cast(color.b) / ccColor::MAX); - } -} - -void GrainsAsEllipsoids::setUniformValueColor(const ccColor::Rgba &color) -{ - m_program->setUniformValue("color", color.r, color.g, color.b, color.a); -} - void GrainsAsEllipsoids::drawGrains(CC_DRAW_CONTEXT& context) { if (!initProgram(context.qGLContext)) @@ -353,7 +364,6 @@ void GrainsAsEllipsoids::drawGrains(CC_DRAW_CONTEXT& context) m_program->bind(); // set uniforms m_program->setUniformValue("modelViewProjectionMatrix", projectionModelView); - m_program->setUniformValue("normalLength", GLfloat(m_normalLineParameters.length)); // get the coordinates of the local maxima std::vector semiAxisLengths(m_localMaximumIndexes.size(), CCVector3(1, 1, 1)); @@ -396,11 +406,6 @@ void GrainsAsEllipsoids::drawGrains(CC_DRAW_CONTEXT& context) m_app->redrawAll(); } -void GrainsAsEllipsoids::setLocalMaximumIndexes(const Eigen::ArrayXi &localMaximumIndexes) -{ - m_localMaximumIndexes = localMaximumIndexes; -} - void GrainsAsEllipsoids::draw(CC_DRAW_CONTEXT& context) { drawGrains(context);