diff --git a/include/GrainsAsEllipsoids.h b/include/GrainsAsEllipsoids.h index ecce306..4a1ca6d 100644 --- a/include/GrainsAsEllipsoids.h +++ b/include/GrainsAsEllipsoids.h @@ -39,7 +39,7 @@ public: bool drawSphere(CC_DRAW_CONTEXT &context, int colorIndex=0); - void setGrainColorsTable(QSharedPointer colorTable); + void setGrainColorsTable(const RGBAColorsTableType& colorTable); std::vector vertices; std::vector normals; @@ -82,7 +82,7 @@ public: ccPointCloud* m_cloud; ccMainAppInterface* m_app; Eigen::ArrayXi m_localMaximumIndexes; - QSharedPointer m_grainColors; + std::vector m_grainColors; std::vector m_ellipsoidInstance; Eigen::ArrayX3f ellipsoidInstance; diff --git a/shaders/ellipsoid.fs b/shaders/ellipsoid.fs index 838e185..97a6545 100644 --- a/shaders/ellipsoid.fs +++ b/shaders/ellipsoid.fs @@ -9,13 +9,14 @@ uniform vec4 materialAmbient; // material ambient color uniform vec4 materialDiffuse; // material diffuse color uniform vec4 materialSpecular; // material specular color uniform float materialShininess; // material specular shininess +uniform bool drawLines; // -// varyings (input) +// in in vec3 esVertex; in vec3 esNormal; in vec2 texCoord0; -// output +// out out vec4 fragColor; void main() @@ -32,11 +33,20 @@ void main() } vec3 view = normalize(-esVertex); vec3 reflectVec = reflect(-light, normal); // 2 * N * (N dot L) - L - + vec3 color = lightAmbient.rgb * materialAmbient.rgb; // begin with ambient float dotNL = max(dot(normal, light), 0.0); color += lightDiffuse.rgb * materialDiffuse.rgb * dotNL; // add diffuse float dotVR = max(dot(view, reflectVec), 0.0); color += pow(dotVR, materialShininess) * lightSpecular.rgb * materialSpecular.rgb; // add specular fragColor = vec4(color, materialDiffuse.a); // set frag color + + if (drawLines) + { + fragColor = vec4(materialAmbient.rgb * vec3(0.8, 0.8, 0.8), materialDiffuse.a); + } + else + { + fragColor = vec4(materialAmbient.rgb, materialDiffuse.a); + } } diff --git a/shaders/ellipsoid.vs b/shaders/ellipsoid.vs index f0200a0..3078d7b 100644 --- a/shaders/ellipsoid.vs +++ b/shaders/ellipsoid.vs @@ -5,22 +5,22 @@ uniform mat4 modelViewMatrix; uniform mat4 normalMatrix; uniform mat4 modelViewProjectionMatrix; uniform vec3 center; +uniform int instanceId; -// vertex attribs (input) +// in in vec3 vertexPosition; in vec3 vertexNormal; in vec2 vertexTexCoord; -// varyings (output) +// out out vec3 esVertex; out vec3 esNormal; out vec2 texCoord0; void main() { - esVertex = vec3(modelViewMatrix * vec4(vertexPosition + center, 1.0)); + esVertex = vec3(modelViewMatrix * vec4(vertexPosition, 1.0)); esNormal = vec3(normalMatrix * vec4(vertexNormal, 1.0)); texCoord0 = vertexTexCoord; - gl_PointSize = 5; - gl_Position = modelViewProjectionMatrix * vec4(vertexPosition + center, 1.0); + gl_Position = modelViewProjectionMatrix * vec4(vertexPosition, 1.0); } diff --git a/src/ActionA.cpp b/src/ActionA.cpp index 7457a12..60c3ac4 100644 --- a/src/ActionA.cpp +++ b/src/ActionA.cpp @@ -84,7 +84,6 @@ RGBAColorsTableType getRandomColors(int randomColorsNumber) //generate random colors int max = 255; - std::mt19937 gen(42); // to seed mersenne twister. std::uniform_int_distribution dist(0, max); //1-byte types are not allowed @@ -1644,7 +1643,7 @@ void G3PointAction::segment() m_grainsAsEllipsoids = new GrainsAsEllipsoids(m_cloud, m_app); m_grainsAsEllipsoids->setLocalMaximumIndexes(m_localMaximumIndexes); m_grainColors.reset(new RGBAColorsTableType(getRandomColors(m_localMaximumIndexes.size()))); - m_grainsAsEllipsoids->setGrainColorsTable(m_grainColors); + m_grainsAsEllipsoids->setGrainColorsTable(*m_grainColors); m_grainsAsEllipsoids->setName("grains as ellipsoids"); m_app->addToDB(m_grainsAsEllipsoids); diff --git a/src/GrainsAsEllipsoids.cpp b/src/GrainsAsEllipsoids.cpp index 7d067ce..3ecb94d 100644 --- a/src/GrainsAsEllipsoids.cpp +++ b/src/GrainsAsEllipsoids.cpp @@ -5,6 +5,7 @@ #include #include +#include GrainsAsEllipsoids::GrainsAsEllipsoids(ccPointCloud *cloud, ccMainAppInterface *app) : m_cloud(cloud) @@ -226,11 +227,10 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) QOpenGLFunctions_2_1* glFunc = context.glFunctions(); assert(glFunc != nullptr); - const CCVector3f* center = m_cloud->getPoint(m_localMaximumIndexes[0]); - ccColor::Rgba color; - if (colorIndex < m_grainColors->size()) + CCVector3f color; + if (colorIndex < m_grainColors.size()) { - color = m_grainColors->data()[colorIndex]; + color = m_grainColors[colorIndex]; } else { @@ -239,7 +239,6 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) } // set uniforms - m_program->setUniformValue("center", center->x, center->y, center->z); QVector4D lightPosition(0, 0, 1, 0); QVector4D lightAmbient(0.3f, 0.3f, 0.3f, 1); // grey QVector4D lightDiffuse(0.7f, 0.7f, 0.7f, 1); // light grey @@ -247,7 +246,7 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) // 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(static_cast(color.r) / ccColor::MAX, static_cast(color.g) / ccColor::MAX, static_cast(color.b) / ccColor::MAX, 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); float materialShininess = 16; @@ -256,7 +255,6 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) m_program->setUniformValue("lightAmbient", lightAmbient); m_program->setUniformValue("lightDiffuse", lightDiffuse); m_program->setUniformValue("lightSpecular", lightSpecular); - m_program->setUniformValue("materialAmbient", materialAmbient); m_program->setUniformValue("materialDiffuse", materialDiffuse); m_program->setUniformValue("materialSpecular", materialSpecular); m_program->setUniformValue("materialShininess", materialShininess); @@ -269,9 +267,48 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) m_program->enableAttributeArray("vertexNormal"); m_program->enableAttributeArray("vertexTexCoord"); - glFunc->glEnable(GL_PROGRAM_POINT_SIZE); - setUniformValueColor(ccColor::yellow); - glFunc->glDrawElements(GL_TRIANGLES, (unsigned int)indices.size(), GL_UNSIGNED_INT, indices.data()); + QMatrix4x4 projection; + QMatrix4x4 modelView; + + //generate random colors + std::mt19937 gen(42); // to seed mersenne twister. + std::uniform_real_distribution<> dis(0.5, 1.0); + std::uniform_real_distribution<> dis2(-1., 1.0); + + for (int k = 0; k < m_localMaximumIndexes.size(); k++) + { + const CCVector3f* center = m_cloud->getPoint(m_localMaximumIndexes[k]); + m_program->setUniformValue("center", center->x, center->y, center->z); + CCVector3f color = m_grainColors[k]; + m_program->setUniformValue("materialAmbient", color.x, color.y, color.z, 1); + + glFunc->glPushMatrix(); // save the current matrix + // translate + glFunc->glTranslatef(center->x, center->y, center->z); + // rotate + glFunc->glRotatef(90, static_cast(dis2(gen)), static_cast(dis2(gen)), static_cast(dis2(gen))); + // scale + glFunc->glScalef(static_cast(dis(gen)), static_cast(dis(gen)), static_cast(dis(gen))); + // get matrices + glFunc->glGetFloatv(GL_PROJECTION_MATRIX, projection.data()); + glFunc->glGetFloatv(GL_MODELVIEW_MATRIX, modelView.data()); + m_program->setUniformValue("modelViewProjectionMatrix", projection * modelView); + + // draw triangles + m_program->setUniformValue("drawLines", 0); + glFunc->glEnable(GL_POLYGON_OFFSET_FILL); + glFunc->glPolygonOffset(1.0, 1.0f); // move polygon backward + glFunc->glDrawElements(GL_TRIANGLES, (unsigned int)indices.size(), GL_UNSIGNED_INT, indices.data()); + glFunc->glDisable(GL_POLYGON_OFFSET_FILL); + + // draw lines + m_program->setUniformValue("drawLines", 1); + glFunc->glDisable(GL_LIGHTING); + glFunc->glDisable(GL_TEXTURE_2D); + glFunc->glDrawElements(GL_LINES, (unsigned int)lineIndices.size(), GL_UNSIGNED_INT, lineIndices.data()); + + glFunc->glPopMatrix(); + } m_program->disableAttributeArray("vertexPosition"); m_program->disableAttributeArray("vertexNormal"); @@ -280,9 +317,17 @@ bool GrainsAsEllipsoids::drawSphere(CC_DRAW_CONTEXT& context, int colorIndex) return true; } -void GrainsAsEllipsoids::setGrainColorsTable(QSharedPointer colorTable) +void GrainsAsEllipsoids::setGrainColorsTable(const RGBAColorsTableType& colorTable) { - m_grainColors = 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)