draw ellipsoids of different sizes, positions and orientations
This commit is contained in:
@@ -39,7 +39,7 @@ public:
|
||||
|
||||
bool drawSphere(CC_DRAW_CONTEXT &context, int colorIndex=0);
|
||||
|
||||
void setGrainColorsTable(QSharedPointer<RGBAColorsTableType> colorTable);
|
||||
void setGrainColorsTable(const RGBAColorsTableType& colorTable);
|
||||
|
||||
std::vector<float> vertices;
|
||||
std::vector<float> normals;
|
||||
@@ -82,7 +82,7 @@ public:
|
||||
ccPointCloud* m_cloud;
|
||||
ccMainAppInterface* m_app;
|
||||
Eigen::ArrayXi m_localMaximumIndexes;
|
||||
QSharedPointer<RGBAColorsTableType> m_grainColors;
|
||||
std::vector<CCVector3f> m_grainColors;
|
||||
|
||||
std::vector<CCVector3f> m_ellipsoidInstance;
|
||||
Eigen::ArrayX3f ellipsoidInstance;
|
||||
|
||||
+13
-3
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+1
-2
@@ -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<uint16_t> 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);
|
||||
|
||||
|
||||
+57
-12
@@ -5,6 +5,7 @@
|
||||
#include <QOpenGLShaderProgram>
|
||||
|
||||
#include <iostream>
|
||||
#include <random>
|
||||
|
||||
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<QOpenGLFunctions_2_1>();
|
||||
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<float>(color.r) / ccColor::MAX, static_cast<float>(color.g) / ccColor::MAX, static_cast<float>(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<float>(dis2(gen)), static_cast<float>(dis2(gen)), static_cast<float>(dis2(gen)));
|
||||
// scale
|
||||
glFunc->glScalef(static_cast<float>(dis(gen)), static_cast<float>(dis(gen)), static_cast<float>(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<RGBAColorsTableType> 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<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)
|
||||
|
||||
Reference in New Issue
Block a user