mirror of https://github.com/CGAL/cgal
Add a shrinking possibility to the facets of the c3t3_item.
To apply it, either use the slider in the item's menu, or use + and - when the item is selected.
This commit is contained in:
parent
19a45608fa
commit
ebfa4a7ea5
|
|
@ -47,6 +47,7 @@
|
|||
<file>resources/euler_facet.png</file>
|
||||
<file>resources/euler_vertex.png</file>
|
||||
<file>javascript/lib.js</file>
|
||||
<file>resources/shader_c3t3_tets.v</file>
|
||||
</qresource>
|
||||
<qresource prefix="/cgal/cursors">
|
||||
<file>resources/rotate_around_cursor.png</file>
|
||||
|
|
|
|||
|
|
@ -9,6 +9,9 @@
|
|||
#include <QPainter>
|
||||
#include <QtCore/qglobal.h>
|
||||
#include <QGuiApplication>
|
||||
#include <QSlider>
|
||||
#include <QWidgetAction>
|
||||
#include <QKeyEvent>
|
||||
|
||||
#include <map>
|
||||
#include <vector>
|
||||
|
|
@ -71,7 +74,7 @@ public :
|
|||
{
|
||||
//vao containing the data for the facets
|
||||
{
|
||||
program = getShaderProgram(PROGRAM_WITH_LIGHT, viewer);
|
||||
program = getShaderProgram(PROGRAM_C3T3_TETS, viewer);
|
||||
program->bind();
|
||||
|
||||
vaos[Facets]->bind();
|
||||
|
|
@ -96,6 +99,13 @@ public :
|
|||
program->setAttributeBuffer("colors", GL_FLOAT, 0, 3);
|
||||
buffers[Colors].release();
|
||||
|
||||
buffers[Barycenters].bind();
|
||||
buffers[Barycenters].allocate(barycenters->data(),
|
||||
static_cast<int>(barycenters->size()*sizeof(float)));
|
||||
program->enableAttributeArray("barycenter");
|
||||
program->setAttributeBuffer("barycenter", GL_FLOAT, 0, 3);
|
||||
buffers[Barycenters].release();
|
||||
|
||||
vaos[Facets]->release();
|
||||
program->release();
|
||||
|
||||
|
|
@ -121,10 +131,11 @@ public :
|
|||
void draw(CGAL::Three::Viewer_interface* viewer) const
|
||||
{
|
||||
vaos[Facets]->bind();
|
||||
program = getShaderProgram(PROGRAM_WITH_LIGHT);
|
||||
attribBuffers(viewer, PROGRAM_WITH_LIGHT);
|
||||
program = getShaderProgram(PROGRAM_C3T3_TETS);
|
||||
attribBuffers(viewer, PROGRAM_C3T3_TETS);
|
||||
program->bind();
|
||||
|
||||
float shrink_factor = qobject_cast<Scene_c3t3_item*>(this->parent())->getShrinkFactor();
|
||||
program->setUniformValue("shrink_factor", shrink_factor);
|
||||
// positions_poly is also used for the faces in the cut plane
|
||||
// and changes when the cut plane is moved
|
||||
viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(vertices->size() / 3));
|
||||
|
|
@ -192,15 +203,15 @@ public :
|
|||
edges->push_back(pa.z()+offset.z);
|
||||
|
||||
|
||||
Kernel::Point_3 bary = (pa+pb+pc)/3.0;
|
||||
for(int i=0; i<3; i++)
|
||||
{
|
||||
colors->push_back((float)color.red()/255);
|
||||
colors->push_back((float)color.green()/255);
|
||||
colors->push_back((float)color.blue()/255);
|
||||
barycenters->push_back(bary.x());
|
||||
barycenters->push_back(bary.y());
|
||||
barycenters->push_back(bary.z());
|
||||
|
||||
barycenters->push_back((pa[0]+pb[0]+pc[0])/3.0);
|
||||
barycenters->push_back((pa[1]+pb[1]+pc[1])/3.0);
|
||||
barycenters->push_back((pa[2]+pb[2]+pc[2])/3.0);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -214,6 +225,7 @@ private:
|
|||
Normals,
|
||||
Colors,
|
||||
Edges,
|
||||
Barycenters,
|
||||
NumberOfBuffers
|
||||
};
|
||||
enum Vao
|
||||
|
|
@ -244,6 +256,10 @@ struct Scene_c3t3_item_priv {
|
|||
, is_valid(true)
|
||||
{
|
||||
init_default_values();
|
||||
tet_Slider = new QSlider(Qt::Horizontal);
|
||||
tet_Slider->setValue(100);
|
||||
tet_Slider->setMinimum(0);
|
||||
tet_Slider->setMaximum(100);
|
||||
}
|
||||
Scene_c3t3_item_priv(const C3t3& c3t3_, Scene_c3t3_item* item)
|
||||
: item(item), c3t3(c3t3_)
|
||||
|
|
@ -255,10 +271,15 @@ struct Scene_c3t3_item_priv {
|
|||
, is_valid(true)
|
||||
{
|
||||
init_default_values();
|
||||
tet_Slider = new QSlider(Qt::Horizontal);
|
||||
tet_Slider->setValue(100);
|
||||
tet_Slider->setMinimum(0);
|
||||
tet_Slider->setMaximum(100);
|
||||
}
|
||||
~Scene_c3t3_item_priv()
|
||||
{
|
||||
delete frame;
|
||||
delete tet_Slider;
|
||||
}
|
||||
|
||||
void init_default_values() {
|
||||
|
|
@ -332,6 +353,7 @@ struct Scene_c3t3_item_priv {
|
|||
Facet_vertices =0,
|
||||
Facet_normals,
|
||||
Facet_colors,
|
||||
Facet_barycenters,
|
||||
Edges_vertices,
|
||||
Edges_CNC,
|
||||
Grid_vertices,
|
||||
|
|
@ -366,6 +388,7 @@ struct Scene_c3t3_item_priv {
|
|||
Indices surface_patch_indices_;
|
||||
Indices subdomain_indices_;
|
||||
std::set<Tr::Cell_handle> intersected_cells;
|
||||
QSlider* tet_Slider;
|
||||
|
||||
//!Allows OpenGL 2.1 context to get access to glDrawArraysInstanced.
|
||||
typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDARBPROC) (GLenum mode, GLint first, GLsizei count, GLsizei primcount);
|
||||
|
|
@ -804,6 +827,8 @@ void Scene_c3t3_item::draw(CGAL::Three::Viewer_interface* viewer) const {
|
|||
d->program->bind();
|
||||
QVector4D cp(this->plane().a(),this->plane().b(),this->plane().c(),this->plane().d());
|
||||
d->program->setUniformValue("cutplane", cp);
|
||||
float shrink_factor = getShrinkFactor();
|
||||
d->program->setUniformValue("shrink_factor", shrink_factor);
|
||||
// positions_poly_size is the number of total facets in the C3T3
|
||||
// it is only computed once and positions_poly is emptied at the end
|
||||
viewer->glDrawArrays(GL_TRIANGLES, 0, static_cast<GLsizei>(d->positions_poly_size / 3));
|
||||
|
|
@ -988,12 +1013,11 @@ void Scene_c3t3_item_priv::draw_triangle(const Kernel::Point_3& pa,
|
|||
positions_poly.push_back(pc.y()+offset.y);
|
||||
positions_poly.push_back(pc.z()+offset.z);
|
||||
|
||||
Kernel::Point_3 bary = (pa+pb+pc)/3.0;
|
||||
for(int i=0; i<3; ++i)
|
||||
{
|
||||
positions_barycenter.push_back(bary.x());
|
||||
positions_barycenter.push_back(bary.y());
|
||||
positions_barycenter.push_back(bary.z());
|
||||
positions_barycenter.push_back((pa[0]+pb[0]+pc[0])/3.0);
|
||||
positions_barycenter.push_back((pa[1]+pb[1]+pc[1])/3.0);
|
||||
positions_barycenter.push_back((pa[2]+pb[2]+pc[2])/3.0);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1143,6 +1167,13 @@ QMenu* Scene_c3t3_item::contextMenu()
|
|||
bool menuChanged = menu->property(prop_name).toBool();
|
||||
|
||||
if (!menuChanged) {
|
||||
|
||||
QMenu *container = new QMenu(tr("Tetrahedra's Shrink Factor"));
|
||||
QWidgetAction *sliderAction = new QWidgetAction(0);
|
||||
connect(d->tet_Slider, &QSlider::valueChanged, this, &Scene_c3t3_item::itemChanged);
|
||||
sliderAction->setDefaultWidget(d->tet_Slider);
|
||||
container->addAction(sliderAction);
|
||||
menu->addMenu(container);
|
||||
QAction* actionExportFacetsInComplex =
|
||||
menu->addAction(tr("Export facets in complex"));
|
||||
actionExportFacetsInComplex->setObjectName("actionExportFacetsInComplex");
|
||||
|
|
@ -1215,9 +1246,15 @@ void Scene_c3t3_item_priv::initializeBuffers(CGAL::Three::Viewer_interface *view
|
|||
program->setAttributeBuffer("colors", GL_FLOAT, 0, 3);
|
||||
item->buffers[Facet_colors].release();
|
||||
|
||||
item->buffers[Facet_barycenters].bind();
|
||||
item->buffers[Facet_barycenters].allocate(positions_barycenter.data(),
|
||||
static_cast<int>(positions_barycenter.size()*sizeof(float)));
|
||||
program->enableAttributeArray("barycenter");
|
||||
program->setAttributeBuffer("barycenter", GL_FLOAT, 0, 3);
|
||||
item->buffers[Facet_barycenters].release();
|
||||
|
||||
item->vaos[Facets]->release();
|
||||
program->release();
|
||||
|
||||
positions_poly_size = positions_poly.size();
|
||||
positions_poly.clear();
|
||||
positions_poly.swap(positions_poly);
|
||||
|
|
@ -1225,6 +1262,8 @@ void Scene_c3t3_item_priv::initializeBuffers(CGAL::Three::Viewer_interface *view
|
|||
normals.swap(normals);
|
||||
f_colors.clear();
|
||||
f_colors.swap(f_colors);
|
||||
positions_barycenter.clear();
|
||||
positions_barycenter.swap(positions_barycenter);
|
||||
}
|
||||
|
||||
//vao containing the data for the lines
|
||||
|
|
@ -1358,6 +1397,7 @@ void Scene_c3t3_item_priv::computeIntersections()
|
|||
normals.clear();
|
||||
f_colors.clear();
|
||||
positions_lines.clear();
|
||||
positions_barycenter.clear();
|
||||
const Kernel::Plane_3& plane = item->plane(offset);
|
||||
tree.all_intersected_primitives(plane,
|
||||
boost::make_function_output_iterator(ComputeIntersection(*this)));
|
||||
|
|
@ -1575,7 +1615,8 @@ void Scene_c3t3_item::show_intersection(bool b)
|
|||
d->intersection->init_vectors(&d->positions_poly,
|
||||
&d->normals,
|
||||
&d->positions_lines,
|
||||
&d->f_colors);
|
||||
&d->f_colors,
|
||||
&d->positions_barycenter);
|
||||
d->intersection->setName("Intersection tetrahedra");
|
||||
d->intersection->setRenderingMode(renderingMode());
|
||||
connect(d->intersection, SIGNAL(destroyed()), this, SLOT(reset_intersection_item()));
|
||||
|
|
@ -1656,4 +1697,22 @@ void Scene_c3t3_item::set_valid(bool b)
|
|||
{
|
||||
d->is_valid = b;
|
||||
}
|
||||
float Scene_c3t3_item::getShrinkFactor() const
|
||||
{
|
||||
return d->tet_Slider->value()/100.0f;
|
||||
}
|
||||
bool Scene_c3t3_item::keyPressEvent(QKeyEvent *event)
|
||||
{
|
||||
if(event->key() == Qt::Key_Plus)
|
||||
{
|
||||
d->tet_Slider->setValue(d->tet_Slider->value() + 5);
|
||||
itemChanged();
|
||||
}
|
||||
else if(event->key() == Qt::Key_Minus)
|
||||
{
|
||||
d->tet_Slider->setValue(d->tet_Slider->value() -5);
|
||||
itemChanged();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
#include "Scene_c3t3_item.moc"
|
||||
|
|
|
|||
|
|
@ -118,6 +118,8 @@ public:
|
|||
public:
|
||||
QMenu* contextMenu();
|
||||
void copyProperties(Scene_item *);
|
||||
float getShrinkFactor() const;
|
||||
bool keyPressEvent(QKeyEvent *);
|
||||
public Q_SLOTS:
|
||||
void export_facets_in_complex();
|
||||
|
||||
|
|
|
|||
|
|
@ -683,6 +683,7 @@ void Viewer::attribBuffers(int program_name) const {
|
|||
case PROGRAM_WITH_TEXTURE:
|
||||
case PROGRAM_CUTPLANE_SPHERES:
|
||||
case PROGRAM_SPHERES:
|
||||
case PROGRAM_C3T3_TETS:
|
||||
program->setUniformValue("light_pos", position);
|
||||
program->setUniformValue("light_diff",diffuse);
|
||||
program->setUniformValue("light_spec", specular);
|
||||
|
|
@ -699,6 +700,7 @@ void Viewer::attribBuffers(int program_name) const {
|
|||
case PROGRAM_INSTANCED:
|
||||
case PROGRAM_CUTPLANE_SPHERES:
|
||||
case PROGRAM_SPHERES:
|
||||
case PROGRAM_C3T3_TETS:
|
||||
program->setUniformValue("mv_matrix", mv_mat);
|
||||
break;
|
||||
case PROGRAM_WITHOUT_LIGHT:
|
||||
|
|
@ -1349,6 +1351,27 @@ QOpenGLShaderProgram* Viewer::getShaderProgram(int name) const
|
|||
d->shader_programs[PROGRAM_CUTPLANE_SPHERES] = program;
|
||||
return program;
|
||||
}
|
||||
case PROGRAM_C3T3_TETS:
|
||||
if( d->shader_programs[PROGRAM_C3T3_TETS])
|
||||
{
|
||||
return d->shader_programs[PROGRAM_C3T3_TETS];
|
||||
}
|
||||
else
|
||||
{
|
||||
QOpenGLShaderProgram *program = new QOpenGLShaderProgram(viewer);
|
||||
if(!program->addShaderFromSourceFile(QOpenGLShader::Vertex,":/cgal/Polyhedron_3/resources/shader_c3t3_tets.v"))
|
||||
{
|
||||
std::cerr<<"adding vertex shader FAILED"<<std::endl;
|
||||
}
|
||||
if(!program->addShaderFromSourceFile(QOpenGLShader::Fragment,":/cgal/Polyhedron_3/resources/shader_with_light.f" ))
|
||||
{
|
||||
std::cerr<<"adding fragment shader FAILED"<<std::endl;
|
||||
}
|
||||
program->bindAttributeLocation("colors", 1);
|
||||
program->link();
|
||||
d->shader_programs[PROGRAM_C3T3_TETS] = program;
|
||||
return program;
|
||||
}
|
||||
case PROGRAM_SPHERES:
|
||||
if( d->shader_programs[PROGRAM_SPHERES])
|
||||
{
|
||||
|
|
|
|||
|
|
@ -15,17 +15,17 @@ void main(void)
|
|||
color = vec4(colors, vertex.x * cutplane.x + vertex.y * cutplane.y + vertex.z * cutplane.z + cutplane.w);
|
||||
fP = mv_matrix * vertex;
|
||||
fN = mat3(mv_matrix)* normals;
|
||||
mat4 transOB = mat4(1, 0, 0, 0, // first column
|
||||
highp mat4 transOB = mat4(1, 0, 0, 0, // first column
|
||||
0, 1, 0, 0, // second column
|
||||
0, 0, 1, 0, // third column
|
||||
barycenter.x, barycenter.y, barycenter.z, 1); // fourth column
|
||||
mat4 transBO = mat4(1, 0, 0, 0, // first column
|
||||
highp mat4 transBO = mat4(1, 0, 0, 0, // first column
|
||||
0, 1, 0, 0, // second column
|
||||
0, 0, 1, 0, // third column
|
||||
-barycenter.x, -barycenter.y, -barycenter.z, 1); // fourth column
|
||||
mat4 scaling = mat4(shrink_factor, 0, 0, 0,
|
||||
highp mat4 scaling = mat4(shrink_factor, 0, 0, 0,
|
||||
0, shrink_factor, 0, 0,
|
||||
0, 0, shrink_factor, 0,
|
||||
0, 0, 0, shrink_factor);
|
||||
0, 0, 0, 1);
|
||||
gl_Position = mvp_matrix *transOB * scaling * transBO * vertex;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,30 @@
|
|||
#version 120
|
||||
attribute highp vec4 vertex;
|
||||
attribute highp vec3 normals;
|
||||
attribute highp vec3 colors;
|
||||
attribute highp vec3 barycenter;
|
||||
uniform highp mat4 mvp_matrix;
|
||||
uniform highp mat4 mv_matrix;
|
||||
uniform highp float shrink_factor;
|
||||
varying highp vec4 fP;
|
||||
varying highp vec3 fN;
|
||||
varying highp vec4 color;
|
||||
void main(void)
|
||||
{
|
||||
color = vec4(colors, 1.0);
|
||||
fP = mv_matrix * vertex;
|
||||
fN = mat3(mv_matrix)* normals;
|
||||
highp mat4 transOB = mat4(1, 0, 0, 0, // first column
|
||||
0, 1, 0, 0, // second column
|
||||
0, 0, 1, 0, // third column
|
||||
barycenter.x, barycenter.y, barycenter.z, 1); // fourth column
|
||||
highp mat4 transBO = mat4(1, 0, 0, 0, // first column
|
||||
0, 1, 0, 0, // second column
|
||||
0, 0, 1, 0, // third column
|
||||
-barycenter.x, -barycenter.y, -barycenter.z, 1); // fourth column
|
||||
highp mat4 scaling = mat4(shrink_factor, 0, 0, 0,
|
||||
0, shrink_factor, 0, 0,
|
||||
0, 0, shrink_factor, 0,
|
||||
0, 0, 0, 1);
|
||||
gl_Position = mvp_matrix *transOB * scaling * transBO * vertex;
|
||||
}
|
||||
|
|
@ -80,6 +80,7 @@ public:
|
|||
PROGRAM_C3T3_EDGES, /** Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light.*/
|
||||
PROGRAM_CUTPLANE_SPHERES, /** Used to render the spheres of an item with a cut plane.*/
|
||||
PROGRAM_SPHERES, /** Used to render one or several spheres.*/
|
||||
PROGRAM_C3T3_TETS, /** Used to render the tetrahedra of the intersection of a c3t3_item.*/
|
||||
NB_OF_PROGRAMS /** Holds the number of different programs in this enum.*/
|
||||
};
|
||||
typedef CGAL::Bbox_3 Bbox;
|
||||
|
|
|
|||
|
|
@ -69,6 +69,7 @@ public:
|
|||
PROGRAM_C3T3_EDGES, /** Used to render the edges of a c3t3_item. It discards any fragment on a side of a plane, meaning that nothing is displayed on this side of the plane. Not affected by light.*/
|
||||
PROGRAM_CUTPLANE_SPHERES, /** Used to render the spheres of an item with a cut plane.*/
|
||||
PROGRAM_SPHERES, /** Used to render one or several spheres.*/
|
||||
PROGRAM_C3T3_TETS, /** Used to render the tetrahedra of the intersection of a c3t3_item.*/
|
||||
NB_OF_PROGRAMS /** Holds the number of different programs in this enum.*/
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue