code cleaning GrainsAsEllipsoids
This commit is contained in:
@@ -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);
|
||||
|
||||
// <DRAW_SPHERE>
|
||||
// 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<float> vertices;
|
||||
std::vector<float> normals;
|
||||
std::vector<float> texCoords;
|
||||
@@ -54,30 +47,28 @@ public:
|
||||
|
||||
int interleavedStride = 32;
|
||||
|
||||
// </DRAW_SPHERE>
|
||||
// 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
|
||||
|
||||
+104
-99
@@ -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<float>(color.r) / ccColor::MAX,
|
||||
static_cast<float>(color.g) / ccColor::MAX,
|
||||
static_cast<float>(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<QOpenGLFunctions_2_1>();
|
||||
@@ -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<float>(color.r) / ccColor::MAX,
|
||||
static_cast<float>(color.g) / ccColor::MAX,
|
||||
static_cast<float>(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<CCVector3> 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);
|
||||
|
||||
Reference in New Issue
Block a user